当前位置: 首页 > 知识库问答 >
问题:

ApacheFopXML-XLS-FO生成的pdf无效

百里光熙
2023-03-14

我正在尝试使用ApacheFop从使用xlst样式表格式化的xml文件创建一个PDF文档,以将原始xml文件转换为xml-fo格式的xml文件。作为一个简单的例子,我试图创造一个新的世界。

生成过程似乎成功(没有例外),但由于某些原因,生成的pdf文件无效。文件大小为4.8KB,当使用libreofficewriter打开时,数据肯定已写入文件,但文件不会在pdf阅读器中打开。

XML文件相当简单:

<rentalRequest>
  <firstName>foo</firstName>
  <lastName>bar</lastName>
  <email>foo@bar.com</email>
  <street>foo street</street>
  <houseNo>42</houseNo>
  <postalCode>4242</postalCode>
  <city>bar city</city>
</rentalRequest>

XSL文件,仅尝试打印Hello World!:

<?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">

    <xsl:output method="xml" indent="yes" />

    <xsl:template match="/">
        <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
            <fo:layout-master-set>          
                <fo:simple-page-master master-name="all">
                    <fo:region-body />
                </fo:simple-page-master>
            </fo:layout-master-set>

            <fo:page-sequence master-reference="all">
                <fo:flow flow-name="xsl-region-body">
                    <fo:block>
                        Hello World!
                    </fo:block>
                </fo:flow>
            </fo:page-sequence>
        </fo:root>
    </xsl:template>

</xsl:stylesheet>

使用JAXP FOP生成pdf文件的java代码:

public void buildWithXSL(String xml) throws Exception {
        OutputStream out = new BufferedOutputStream(new FileOutputStream(new File("rentalrequest.pdf")));

        // setup xml input source
        StreamSource xmlSource =
                new StreamSource(new ByteArrayInputStream(xml.getBytes()));

        File xslFile = new File("src/main/resources/xml/rentalrequest2fo.xsl");
        FileInputStream xslFileStream = new FileInputStream(xslFile);
        StreamSource xslSource = new StreamSource(xslFileStream);

        TransformerFactory tfactory = TransformerFactory.newInstance();
        Transformer transformer = tfactory.newTransformer(xslSource);

        FopFactory fopFactory = FopFactory.newInstance();
        Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, out);

        // perform transformation 
        Result res = new SAXResult(fop.getDefaultHandler());
        transformer.transform(xmlSource, res);
    }

生成的pdf文件可在以下位置找到:http://www.filedropper.com/rentalrequest

共有1个答案

张璞
2023-03-14

您得到的PDF文件不完整,因为您忘记正确地关闭输出流。打开OutputStream(或InputStream)时,请始终使用以下模式:

java prettyprint-override">OutputStream out = new [Something]OutputStream([something]);
try {
    //write to the OutputStream
} finally {
    out.close();
}

 类似资料:
  • FO PDF 是一款C#编写类似于ASP.NET服务器控件的控件。它接受DataTable 和一些其它参数来创建XSL FO,并使用NFOP (Apache FOP Port in J#) PDF Formatter来绘制一个类似PDF Report 的DataGrid 。今后将会增加更多的标签来可以生成XSL FO 。

  • 这篇文档阐述了如何通过使用Django视图动态输出PDF。这可以通过一个出色的、开源的Python PDF库ReportLab来实现。 动态生成PDF文件的优点是,你可以为不同目的创建自定义的PDF -- 这就是说,为不同的用户或者不同的内容。 例如,Django在kusports.com上用来为那些参加March Madness比赛的人,生成自定义的,便于打印的 NCAA 锦标赛晋级表作为PDF

  • 问题内容: 我知道以前曾有人问过这个问题,但是我仍不确定我当前项目要使用哪种PDF生成框架。 我的要求 快速生成PDF文档(主要是订单,发票) 基于Java 易于布置 应该是开源的 易于更改布局 很多人似乎都在使用 iText ,但是除了关注点更改之外,我还有其他关注点:在HTML上下文中,有很好的MVC支持,我通常会坚持使用SpringMVC和FreeMarker来分离逻辑和布局。我有点担心,使

  • 我已经将Ruby on Rails(Version5.2.1)与RubyMine IDE一起用于一个项目,并且处于一个开发阶段,在这个阶段我想创建一些基于PDF的报告。为此,我抓取了Prawn(2.2.2版)宝石。我设置了一个从页面下载PDF的按钮: 它被路由到相应的控制器:

  • 问题内容: 我有一个PHP应用程序,需要用查询结果生成PDF。被发现的最简单的方法是使用DOMPDF为我生成PDF。因此,做了一个为我生成HTML的函数,然后将其传递给DOMPDF。在开发和测试环境中,一切都很好,但是在生产环境中,我在内存使用方面存在一些问题。 因此,我想知道我的策略是最好的还是有更好更好的方法来做到这一点。 你会怎么做? 问题答案: 我曾经做过一个生成PDF的PHP项目。我使用

  • 这是我第一个使用spring Boot的项目。因此我尝试用父级更新pom.xml,如下所示: 然而,我在行中出现了一个错误: 项目生成错误:com.in28minutes的父POM不可解析。springboot:first-springboot-project:0.0.1-snapshot:找不到项目org.springframework.boot:spring-boot-starter-pare