Create a PDF from JPG files with XML (scan2pdf.xsl)

fop command
fop.sh -xml scan.xml -xsl scan2pdf.xsl new.pdf


The  XML (scan.xml)
<?xml  version='1.0'?>
<x xmlns="http://www.ci-inc.com/namespace"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <Scan>
                <Scan_Item>/pages/scan-001.jpg</Scan_Item>
        </Scan>
        <Scan>
                <Scan_Item>/pages/scan-002.jpg</Scan_Item>
        </Scan>
        <Scan>
                <Scan_Item>/pages/scan-003.jpg</Scan_Item>
        </Scan>
</x>


The  XSLT (scan2pdf.xsl)
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:fo="http://www.w3.org/1999/XSL/Format"
  xmlns:dc="http://www.ci-inc.com/namespace"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:fn="http://www.w3.org/2005/02/xpath-functions"
  xmlns:xdt="http://www.w3.org/2005/02/xpath-datatypes">
<!-- PAGE DIMENSIONS - BEGIN -->
<xsl:variable name="fo:layout-master-set">
 <fo:layout-master-set>
  <fo:simple-page-master master-name="default-page"
                         page-height="11in" 
                         page-width="8.5in" 
                         margin-top="0.0in" 
                         margin-left="0.0in"
                         margin-right="0.0in"
                         margin-bottom="0.0in"> 
<!-- space needed for header & footer tables -->
  <fo:region-body        margin-top="0.0in" 
                         margin-bottom="0.0in"/>
  <fo:region-before extent="0.0in"/> <!-- space needed for header table -->
  <fo:region-after  extent="0.0in"/> <!-- space needed for footer table -->
  <fo:region-start  extent="0.0in"/>
  <fo:region-end    extent="0.0in"/>
  </fo:simple-page-master>
 </fo:layout-master-set>
</xsl:variable>
<!-- PAGE DIMENSIONS - END   -->
<xsl:output version="1.0" encoding="UTF-8" indent="no" omit-xml-declaration="no" media-type="text/html" />
<xsl:template match="/">
<fo:root>
<xsl:copy-of select="$fo:layout-master-set" />
<fo:page-sequence master-reference="default-page" initial-page-number="1" format="1">
<!-- BODY - BEGIN -->
<fo:flow flow-name="xsl-region-body">
 <fo:table table-layout="fixed" space-before.optimum="0pt" space-after.optimum="0pt">
  <!-- initializes detail column headings : BEGIN -->
  <fo:table-column column-width="8.50in" />
  <!-- initializes detail column headings : END   -->
  <!-- Detail Loop : BEGIN -->
  <fo:table-body>
   <xsl:for-each select="/dc:x/dc:Scan"> 
    <fo:table-row>
     <fo:table-cell border-width="0px" padding-start="0pt" padding-end="0pt" padding-before="0pt" padding-after="0pt">
      <fo:block>
       <xsl:for-each select="dc:Scan_Item">  <!-- [jpg file] -->
        <fo:external-graphic space-before.optimum="0pt" space-after.optimum="0pt">
         <xsl:attribute name="src">url('<xsl:value-of select="." />')</xsl:attribute>
        </fo:external-graphic>
       </xsl:for-each>
      </fo:block>
     </fo:table-cell>
    </fo:table-row>
   </xsl:for-each>
  </fo:table-body>
 </fo:table>
<!-- BODY - END   -->
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
</xsl:stylesheet>
 
Google