2012-03-31 2 views
1

私はクライアントがXMLデータセットからPDF文書を提供したいというプロジェクトを持っています。私は何年もXSLTを扱ってきましたが、PDFを作成したことはありません。私はXSLTを使用して新しいXMLとHTMLを生成しましたが、決してPDFは生成しませんでした。誰かがXMLをPDFに変換した経験がありますか?

+1

この[質問](http://stackoverflow.com/q/212577/229858)が役立ちます。 –

+0

@DaveM良いリンクDave - 私は私の答えを策定したときにあなたのコメントに気付かなかった! – Maestro13

+0

あなたはオンラインAPIを使用することができますhttp://www.convertapi.com – Tomas

答えて

3

まず、xsl-fo変換を適用し、特定のfoタグを作成してからfo to pdfプロセスで実行するという2段階のアプローチが必要です。
以下は、これに使用するVBコードと、私のxsl-foの小さな部分です。

'Transform to create fo file 
foName = "C:\test\foName_test.fo" 
xslName = "C:\test\xhtml2fo.xslt" 

Call Transform(flName, xslName, foName) 

'Call FOP PDF generator 
Set shell = CreateObject("WScript.Shell") 

pdfName = "C:\test\foName_test.pdf" 

cmd = "java -Dfop.home=C:\fop -cp C:\fop\build\fop.jar org.apache.fop.cli.Main -fo " & foName & " -pdf " & pdfName 
Call shell.Run(cmd, vbWindowFrame, True) 

Private Sub Transform(sourceFile, stylesheetFile, resultFile) 
Dim source As New MSXML2.DOMDocument60 
Dim stylesheet As New MSXML2.DOMDocument60 
Dim result As New MSXML2.DOMDocument60 
Dim objStream As New ADODB.Stream 

Dim msg As String 

objStream.Open 
objStream.Position = 0 
objStream.Charset = "utf-8" 
objStream.LoadFromFile (sourceFile) 

' Load data 
source.async = False 
source.loadXML (objStream.ReadText()) 

' Load style sheet 
stylesheet.async = False 
stylesheet.Load stylesheetFile 

' Do the transform 
source.transformNodeToObject stylesheet, result 
result.Save resultFile  
End Sub 

XSLTコードスニペット:

<xsl:template name="make-layout-master-set"> 
<fo:layout-master-set> 
    <fo:simple-page-master master-name="all-pages" xsl:use-attribute-sets="page"> 
    <fo:region-body margin-top="{$page-margin-top}" margin-right="{$page-margin-right}" margin-bottom="{$page-margin-bottom}" margin-left="{$page-margin-left}" column-count="{$column-count}" column-gap="{$column-gap}"/> 
    <xsl:choose> 
     <xsl:when test="$writing-mode = 'tb-rl'"> 
     <fo:region-before extent="{$page-margin-right}" precedence="true"/> 
     <fo:region-after extent="{$page-margin-left}" precedence="true"/> 
     <fo:region-start region-name="page-header" extent="{$page-margin-top}" writing-mode="lr-tb" display-align="before"/> 
     <fo:region-end region-name="page-footer" extent="{$page-margin-bottom}" writing-mode="lr-tb" display-align="after"/> 
     </xsl:when> 
     <xsl:when test="$writing-mode = 'rl-tb'"> 
     <fo:region-before region-name="page-header" extent="{$page-margin-top}" display-align="before"/> 
     <fo:region-after region-name="page-footer" extent="{$page-margin-bottom}" display-align="after"/> 
     <fo:region-start extent="{$page-margin-right}"/> 
     <fo:region-end extent="{$page-margin-left}"/> 
     </xsl:when> 
     <xsl:otherwise><!-- $writing-mode = 'lr-tb' --> 
     <fo:region-before region-name="page-header" extent="{$page-margin-top}" display-align="before"/> 
     <fo:region-after region-name="page-footer" extent="{$page-margin-bottom}" display-align="after"/> 
     <fo:region-start extent="{$page-margin-left}"/> 
     <fo:region-end extent="{$page-margin-bottom}"/> 
     </xsl:otherwise> 
    </xsl:choose> 
    </fo:simple-page-master> 
</fo:layout-master-set> 
</xsl:template> 
0

また、PDFにあなたのXMLを変換するためにはTeXを使用することができます。 ConTeXtまたはXMLTeXを使用できます。 TeX.SXを参照してください。

関連する問題