2012-03-31 28 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

相关问题