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

apachefop:生成空白的pdf输出

陆文博
2023-03-14

我试图使用Apache Fop和Java生成PDF,但生成的Pdf总是一个空白页。它都嵌套在一个网络应用程序中,割断器是玻璃鱼。

有人有什么建议吗?

以下是我的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">
    <xsl:output method="xml" encoding="utf-8" />
    <xsl:template match="/">
        <fo:root>
           <fo:layout-master-set>
               <fo:simple-page-master master-name="DealerOverview">
                   <fo:region-body margin-top="4cm" margin-bottom="2cm" />
                   <fo:region-before extent="3.5" />
                   <fo:region-after extent="3.5" />
               </fo:simple-page-master>
           </fo:layout-master-set>
           <xsl:apply-templates select="DealerOverview" />
          </fo:root>
      </xsl:template>
       <xsl:template match="DealerOverview">
       <fo:page-sequence master-reference="DealerOverview">
           <fo:flow flow-name="xsl-region-body">
               <fo:block>
                   <fo:table table-layout="fixed">
                       <fo:table-body>
                           <fo:table-row>
                               <fo:table-cell text-align="center" font-weight="bold">
                                   <fo:block>Brand</fo:block>
                               </fo:table-cell>
                               <fo:table-cell text-align="center" font-weight="bold">
                                   <fo:block>TargetYear</fo:block>
                               </fo:table-cell>
                               <fo:table-cell text-align="center" font-weight="bold">
                                   <fo:block>TargetPrevYear</fo:block>
                               </fo:table-cell>
                           </fo:table-row> 
                           <xsl:for-each select="DealerOverview/Brands/Brand">
                                   <fo:table-row>
                                       <fo:table-cell border="solid 1px black" text-align="center">
                                           <fo:block>
                                               <xsl:value-of select="BrandId" />
                                           </fo:block>
                                       </fo:table-cell>
                                       <fo:table-cell border="solid 1px black" text-align="center">
                                           <fo:block>
                                               <xsl:value-of select="TargetYear" />
                                           </fo:block>
                                       </fo:table-cell>
                                       <fo:table-cell border="solid 1px black" text-align="center">
                                           <fo:block>
                                               <xsl:value-of select="TargetPrevYear" />
                                           </fo:block>
                                       </fo:table-cell>
                                   </fo:table-row>
                               </xsl:for-each>   
                       </fo:table-body>
                   </fo:table>
               </fo:block>
           </fo:flow>
       </fo:page-sequence>
       </xsl:template>
        <!-- TODO: Auto-generated template -->  
</xsl:stylesheet>

示例XML文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<DealerOverview>
    <DealerDetails>
        <Version>testForDealer</Version>
        <Date>Oct, 1, 2013</Date>
        <State>Released to Dealer</State>
        <Dealer>Ungeheuer Automobile GmBH</Dealer>
        <BrandOverview>All</BrandOverview>
    </DealerDetails>
    <Brands>
        <Brand id="BM">
            <BrandId>BM</BrandId>
            <TargetYear>500</TargetYear>
            <TargetPrevYear>1000</TargetPrevYear>
        </Brand>
    </Brands>
</DealerOverview>

编辑:应该生成pdf的Java代码。。。

public void createPdfWithFop(File xmlString) throws IOException {

        FacesContext context = FacesContext.getCurrentInstance();
        ServletContext servletContext = (ServletContext) context.getExternalContext().getContext();
        HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();

        pathToXsl = servletContext.getRealPath("/resources/reporting/PrintDealersOverview.xsl");

        File xslFile = new File(pathToXsl);
        String tempString = FileUtils.readFileToString(xmlString);
        System.out.println("Das XML-File in der Fop: " + tempString + "  ende");
        StreamSource source = new StreamSource(xmlString);
        StreamSource transformSource = new StreamSource(xslFile);

        FopFactory fopFactory = FopFactory.newInstance();
        FOUserAgent userAgent = fopFactory.newFOUserAgent();

        ByteArrayOutputStream outStream = new ByteArrayOutputStream();

        TransformerFactory factory = TransformerFactory.newInstance();
        try {

            Transformer transformer = factory.newTransformer(transformSource);
            Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, outStream);
            Result res = new SAXResult(fop.getDefaultHandler());

            transformer.transform(source, res);

            byte[] pdfBytes = outStream.toByteArray();
            response.setContentType("application/pdf");
            response.addHeader("Content-Disposition", "attachment; filename=\"DealersOverview.pdf\"");
            response.getOutputStream().write(pdfBytes);
//            response.getOutputStream().flush();

        } catch (TransformerConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (FOPException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (TransformerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }   
    }

第二次编辑:

我发现我的outputStream有问题。我想显示另存为对话框,以便从web应用程序下载生成的文件。我不明白,我的输出有什么问题。。。

共有1个答案

阎晔
2023-03-14

我不知道你说你得到一个空白页是什么意思,因为运行上面的转换确实会为我产生一些输出。

但是,我注意到您的for-each不正确。您的选择正在查找DealerOverview/Brands/Brand,但由于您已经在DealerOverview模板中,因此选择正在查找此位置不存在的元素DealerOverview/DealerOverview/Brands/Brand。因此,如果您从选择中删除DealerOverview,您将在输出中获得更多信息。

 类似资料:
  • 问题内容: 我正在尝试在Django应用程序中使用Python从SVG输入文件生成PDF。 我已经找到了两个可行的解决方案:cairo + rsvg和imagemagick,但是它们都有一个问题:它们具有一些我不想安装在服务器上的奇怪的依赖项,例如DBUS和GTK。 因此,我正在寻求另一种从SVG生成PDF的方法,而不必在服务器上安装所有这些愚蠢的依赖项。 问题答案: 您考虑过svglib吗? 它

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

  • 我一直在尝试使用selenium完成输入框,但在单击添加新客户按钮后总是找不到该输入框,它总是显示一个空白的白页。我通过chrome和fire fox@Test public val AddTouch()抛出中断异常{

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

  • 我从jenkins控制台收到以下消息,但是文件夹是空的,报表没有数据。 C:\Program Files(x86)\Jenkins\Workspace\SCS测试>CD C:\Checkouts\SCS\Test C:\checkouts\scs\test>“behave-tags=@defrost_007-f allure_behave.formatter:allureformatter-o C