微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Apache fop、XSL FO、jdom2:生成​​带有动态页眉/页脚的 pdf

如何解决Apache fop、XSL FO、jdom2:生成​​带有动态页眉/页脚的 pdf

我从 java 对象生成一个 .pdf,我想将值从 java 对象传递到 .xsl 中的页眉/页脚。 这是我的 .xsl 的一部分:

<fo:page-sequence master-reference="content">
    <fo:static-content flow-name="Header">
        <fo:table border-collapse="collapse" font-size="8pt">
            <fo:table-body>
                <fo:table-row>
                    <fo:table-cell border="0.5pt solid black" overflow="hidden" > Œ
                        <fo:block vertical-align="middle" margin-left="0.2cm" text-align="left">
                                        supplier’s name: <xsl:value-of select="@name" />
                        </fo:block>
                        <fo:block vertical-align="middle" margin-left="0.2cm" text-align="left">
                                        supplier’s code: <xsl:param name="supplierCodeLol" />
                        </fo:block>
                    </fo:table-cell>
                </fo:table-row>
            </fo:table-body>
        </fo:table>
    </fo:static-content>

    <fo:static-content flow-name="Footer">              
        <fo:table border-collapse="collapse" font-size="8pt">
            <fo:table-body>
                <fo:table-row>
                    <fo:table-cell border="0.5pt solid black" overflow="hidden" >
                        <fo:block vertical-align="middle" margin-left="0.2cm" text-align="left">
                                        Export requestor: <xsl:param name="exportRequestor" />
                        </fo:block>
                    </fo:table-cell>
                    <fo:table-cell border="0.5pt solid black" overflow="hidden">
                        <fo:block></fo:block>
                    </fo:table-cell>
                </fo:table-row>
            </fo:table-body>
        </fo:table>
    </fo:static-content>

    <fo:flow flow-name="xsl-region-body">
        <fo:block font-size="10pt">
            <xsl:for-each select="block">
                <xsl:call-template name="block-template" select="."></xsl:call-template>
            </xsl:for-each>
        </fo:block>
        <fo:block id="theEnd" />
    </fo:flow>
</fo:page-sequence>

我在哪里创建 .pdf:

public void convertToPDF(String xml,String fileName) throws IOException,FOPException,TransformerException {
    ClassLoader classLoader = getClass().getClassLoader();
    File xsltFile = new File(classLoader.getResource("template/xml/xsl_test.xsl").getFile());
    StreamSource xmlSource;
    if (xml == null) {
        xmlSource = new StreamSource(new File(classLoader.getResource("template/xml/xml_test.xml").getFile()));
    } else {
        xmlSource = new StreamSource(new ByteArrayInputStream(xml.getBytes()));
    }

    FopFactory fopFactory = FopFactory.newInstance(new File(".").toURI());
    FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
    OutputStream out;
    out = new java.io.FileOutputStream(fileName);

    try {
        Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF,foUserAgent,out);
        TransformerFactory factory = TransformerFactory.newInstance();
        Transformer transformer = factory.newTransformer(new StreamSource(xsltFile));
        Result res = new SAXResult(fop.getDefaultHandler());
        transformer.transform(xmlSource,res);
    } finally {
        out.close();
    }
    }

这是我用 java 对象(标题部分)创建和填充 .pdf 的地方:

public String exportPlanetoPdfa(PLANE plane,UserBean user,String fileName) {
    Pdfhelper pdfhelper = new Pdfhelper();
    Document doc = new Document(toXmlElement(plane,userName));
    XMLOutputter outter = new XMLOutputter(Format.getPrettyFormat());
    String xml = outter.outputString(doc);
    pdfhelper.convertToPDF(xml,"/" + fileName);
    return fileName;
}

private Element toXmlElement(PlaneBean plane,String userName) {
    Element planeRoot = new Element(XmlHelper.PLANE);
    XmlHelper.addAllContents(planeRoot,toHeaderXmlElement(plane));
    return planeRoot;
}

private Element toHeaderXmlElement(PlaneBean plane) {
    Element header = new Element(XmlHelper.BLOCK);
    header.setAttribute(XmlHelper.NAME,"Equipment");

    Element row = new Element(XmlHelper.ROW);
    XmlHelper.addAllContents(row,XmlHelper.newFieldElement("supplier's name",plane.name),XmlHelper.newFieldElement("supplier's code",plane.code)));
    XmlHelper.addAllContents(header,row);
    return header;
}

.pdf 输出标题):

pdf header output

创建一个块并显示它有效,但我不知道如何将块的值传递给标题。 我搜索了 xsl:value-of/param 但我不知道这是否是这样做的方法。非常感谢您的帮助!

编辑: 我找到了答案here

解决方法

让你开始。 您可以将 xsl:param name="someName" 声明为 xsl:stylesheet 的子项。然后将其用作全局变量 xsl:value-of select="$someName"

即像这样:

<xsl:stylesheet version="1.0" 
  xmlns:fo="http://www.w3.org/1999/XSL/Format"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

  <xsl:param name="supplierCodeLol" />
  <xsl:param name="exportRequestor" />
  
  <xsl:template match="/">
    <fo:page-sequence master-reference="content">
      <fo:static-content flow-name="Header">
        <fo:table border-collapse="collapse" font-size="8pt">
          <fo:table-body>
            <fo:table-row>
              <fo:table-cell border="0.5pt solid black" overflow="hidden" > Œ
                <fo:block vertical-align="middle" margin-left="0.2cm" text-align="left">
                  Supplier’s name: <xsl:value-of select="@name" />
                </fo:block>
                <fo:block vertical-align="middle" margin-left="0.2cm" text-align="left">
                  Supplier’s code: <xsl:value-of select="$supplierCodeLol" />
                </fo:block>
              </fo:table-cell>
            </fo:table-row>
          </fo:table-body>
        </fo:table>
      </fo:static-content>
      
      <fo:static-content flow-name="Footer">              
        <fo:table border-collapse="collapse" font-size="8pt">
          <fo:table-body>
            <fo:table-row>
              <fo:table-cell border="0.5pt solid black" overflow="hidden" >
                <fo:block vertical-align="middle" margin-left="0.2cm" text-align="left">
                  Export requestor: <xsl:value-of select="$exportRequestor" />
                </fo:block>
              </fo:table-cell>
              <fo:table-cell border="0.5pt solid black" overflow="hidden">
                <fo:block></fo:block>
              </fo:table-cell>
            </fo:table-row>
          </fo:table-body>
        </fo:table>
      </fo:static-content>
      
      <fo:flow flow-name="xsl-region-body">
        <fo:block font-size="10pt">
          <xsl:apply-templates select="block"/>
        </fo:block>
        <fo:block id="theEnd" />
      </fo:flow>
    </fo:page-sequence>
  </xsl:template>

  
  <xsl:template match="block">
    <!-- Do something with the block -->
  </xsl:template>

</xsl:stylesheet>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?