2012-03-31 76 views
1

我有一個項目,客戶希望從XML數據集提供PDF文檔。我已經與XSLT合作多年,但從未創建過PDF。我使用XSLT生成了新的XML和HTML,但從未使用過PDF。有沒有人有將XML轉換爲PDF的實際經驗?

+1

有這個[問題](http://stackoverflow.com/q/212577/229858),可能有所幫助。 – 2012-03-31 03:00:13

+0

@DaveM良好的鏈接戴夫 - 當我提出我的答案時,我沒有注意到你的評論! – Maestro13 2012-03-31 08:51:46

+0

您可以使用Online Api http://www.convertapi.com – Tomas 2012-04-01 17:25:05

回答

3

您將不得不採取兩步法,首先應用xsl-fo轉換,創建特定的fo標籤,然後通過fo到pdf進程運行它。
下面是我爲此使用的一段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

您還可以使用TeX的對您的XML轉換爲PDF。您可以使用ConTeXtXMLTeX。見TeX.SX

相關問題