问题
我正在使用XSL-T(V1.0)和XSL-FO(Apache FOP 1.0)来生成PDF(A4)报告,使用的数据来自用户在第三方软件中填写的表单(输出XML)。
表单包含用户可以根据需要填充的文本区域(不控制内容大小)。然后以XML形式输出文本区域内容,作为节点/text()
()。为了保留用户的输入格式,我在块级使用
linefeed-treating=“preserve”
属性。
问题是,每当文本区域填充了足以导致分页的数据,当分页发生在换行时,我在Apache FOP 1.0中使用了NullPointerException
。除了使用keep-together.winn-page=“always”
作为变通方法之外,我找不到任何解决此问题的方法(不是长期解决方法,因为当text()
超过一页时,我会松散数据。
工具
要开发XSL样式表,我使用:
对于该软件使用什么来生成带有XSL样式表的PDF(FOP1.0和XSLT1.0仍然存在),我没有选择。
<fo:block space-before="5mm" text-align="justify">
<fo:block linefeed-treatment="preserve" keep-together.within-page="auto">
<fo:block>
<fo:inline/>
<fo:inline> TEST
END OF TEST </fo:inline>
</fo:block>
</fo:block>
</fo:block>
错误详细
Standard Error
Jun 29, 2018 9:02:59 AM org.apache.fop.cli.Main startFOP
SEVERE: Exception
org.apache.fop.apps.FOPException
java.lang.NullPointerException
at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:302)
at org.apache.fop.cli.InputHandler.renderTo(InputHandler.java:130)
at org.apache.fop.cli.Main.startFOP(Main.java:174)
at org.apache.fop.cli.Main.main(Main.java:205)
Caused by: java.lang.NullPointerException
at org.apache.fop.layoutmgr.AbstractBreaker.doLayout(AbstractBreaker.java:434)
at org.apache.fop.layoutmgr.PageBreaker.doLayout(PageBreaker.java:85)
at org.apache.fop.layoutmgr.PageSequenceLayoutManager.activateLayout(PageSequenceLayoutManager.java:107)
at org.apache.fop.area.AreaTreeHandler.endPageSequence(AreaTreeHandler.java:238)
at org.apache.fop.fo.pagination.PageSequence.endOfNode(PageSequence.java:120)
at org.apache.fop.fo.FOTreeBuilder$MainFOHandler.endElement(FOTreeBuilder.java:349)
at org.apache.fop.fo.FOTreeBuilder.endElement(FOTreeBuilder.java:177)
at org.apache.xalan.transformer.TransformerIdentityImpl.endElement(TransformerIdentityImpl.java:1101)
at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source)
at org.apache.xerces.xinclude.XIncludeHandler.endElement(Unknown Source)
at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanEndElement(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:484)
at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:299)
... 3 more
---------
java.lang.NullPointerException
at org.apache.fop.layoutmgr.AbstractBreaker.doLayout(AbstractBreaker.java:434)
at org.apache.fop.layoutmgr.PageBreaker.doLayout(PageBreaker.java:85)
at org.apache.fop.layoutmgr.PageSequenceLayoutManager.activateLayout(PageSequenceLayoutManager.java:107)
at org.apache.fop.area.AreaTreeHandler.endPageSequence(AreaTreeHandler.java:238)
at org.apache.fop.fo.pagination.PageSequence.endOfNode(PageSequence.java:120)
at org.apache.fop.fo.FOTreeBuilder$MainFOHandler.endElement(FOTreeBuilder.java:349)
at org.apache.fop.fo.FOTreeBuilder.endElement(FOTreeBuilder.java:177)
at org.apache.xalan.transformer.TransformerIdentityImpl.endElement(TransformerIdentityImpl.java:1101)
at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source)
at org.apache.xerces.xinclude.XIncludeHandler.endElement(Unknown Source)
at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanEndElement(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:484)
at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:299)
at org.apache.fop.cli.InputHandler.renderTo(InputHandler.java:130)
at org.apache.fop.cli.Main.startFOP(Main.java:174)
at org.apache.fop.cli.Main.main(Main.java:205)
在FOP之前完成XSL-FO
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="coverPage" margin="5mm" page-height="297mm" page-width="210mm" reference-orientation="0" writing-mode="lr-tb">
<fo:region-body margin-top="25mm" margin-bottom="25mm" margin-left="45mm" margin-right="5mm"/>
<fo:region-after extent="20mm" precedence="true" display-align="before"/>
<fo:region-start extent="40mm"/>
</fo:simple-page-master>
<fo:simple-page-master master-name="repeatablePage" margin="5mm" page-height="297mm" page-width="210mm" reference-orientation="0" writing-mode="lr-tb">
<fo:region-body margin-top="30mm" margin-bottom="25mm" margin-left="20mm" margin-right="20mm"/>
<fo:region-after extent="20mm" precedence="true" display-align="before"/>
</fo:simple-page-master>
<fo:page-sequence-master master-name="pageSequence">
<fo:single-page-master-reference master-reference="coverPage"/>
<fo:repeatable-page-master-reference master-reference="repeatablePage" maximum-repeats="no-limit"/>
</fo:page-sequence-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="pageSequence" font-family="sans-serif" font-weight="normal">
<fo:static-content flow-name="xsl-region-after">
<fo:block text-align="right" font-size="10" color="#083E70">
Page <fo:page-number/> de <fo:page-number-citation ref-id="endDoc"/></fo:block>
<fo:block text-align="center" font-size="8" color="#083E70" space-before="8mm">
<fo:block>ADRESSE LINE 1</fo:block>
<fo:block>ADRESSE LINE 2</fo:block>
</fo:block>
</fo:static-content>
<fo:static-content flow-name="xsl-region-start">
<fo:block>
<fo:external-graphic src="Logo.jpg" content-width="40mm" scaling="uniform"/>
</fo:block>
<fo:block-container color="#083E70" border-end-color="#083E70" border-end-width="1pt" border-end-style="solid" block-progression-dimension="235mm">
<fo:block/>
<fo:block space-before="10mm" space-after="10mm" font-weight="bold" text-decoration="underline"/>
</fo:block-container>
</fo:static-content>
<fo:flow flow-name="xsl-region-body" font-size="10pt">
<fo:block text-align="right" space-after="5mm">
<fo:inline>Bruxelles, le </fo:inline>
<fo:inline>19/06/2018</fo:inline>.
</fo:block>
<fo:block space-after="10mm" border="0pt solid black" padding="2mm 0">
<fo:table start-indent="3mm" space-after="10mm" table-layout="fixed" width="147mm">
<fo:table-column column-number="1" column-width="35mm"/>
<fo:table-column column-number="2" column-width="112mm"/>
<fo:table-body>
<fo:table-row>
<fo:table-cell>
<fo:block>
<fo:inline font-weight="bold">
<fo:inline>Destinataire:</fo:inline>
</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell display-align="center">
<fo:block start-indent="40mm">Mara Kristen<fo:block/>5911 Maple Blvd<fo:block/>1400 NIVELLES<fo:block/>B<fo:block/></fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
<fo:table start-indent="3mm" table-layout="fixed" width="147mm">
<fo:table-column column-number="1" column-width="35mm"/>
<fo:table-column column-number="2" column-width="112mm"/>
<fo:table-body>
<fo:table-row>
<fo:table-cell>
<fo:block>
<fo:inline font-weight="bold">
<fo:inline>Copie:</fo:inline>
</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>
<fo:inline>Gold Denis</fo:inline>
<fo:inline font-style="italic"> (Merci Denis !, 3001 HEVERLEE, B)</fo:inline>
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:block/>
</fo:table-cell>
<fo:table-cell>
<fo:block>
<fo:inline>Gold Denis</fo:inline>
<fo:inline font-style="italic"> (Merci Denis !, 3001 HEVERLEE, B)</fo:inline>
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:block/>
</fo:table-cell>
<fo:table-cell>
<fo:block>
<fo:inline>Gold Denis</fo:inline>
<fo:inline font-style="italic"> (Merci Denis !, 3001 HEVERLEE, B)</fo:inline>
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:block>
<fo:block text-align="left" space-after="10mm">
Ref.: 002956347</fo:block>
<fo:block space-after="10mm" text-align="center" text-decoration="underline" font-weight="bold">
<fo:inline>Lettre de consultation - </fo:inline>Psychiatrie</fo:block>
<fo:block>
<fo:inline>Concerne: </fo:inline>
</fo:block>
<fo:block space-after="10mm" border="1pt solid black" padding="2mm 0">
<fo:table table-layout="fixed" start-indent="3mm" width="147mm">
<fo:table-column column-number="1" column-width="35mm"/>
<fo:table-column column-number="2" column-width="112mm"/>
<fo:table-body>
<fo:table-row>
<fo:table-cell>
<fo:block font-weight="bold">
<fo:inline>Nom, Prénom:</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>Quigley, Jules</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:block font-weight="bold">
<fo:inline>Adresse:</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>9816 Main Street,
1402 LOOL,
B</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:block font-weight="bold">
<fo:inline>Nr. national:</fo:inline>
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>31035622101</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:block>
<fo:block text-align="left">
<fo:inline font-weight="bold" text-decoration="underline">
<fo:inline>Sujet:</fo:inline>
</fo:inline> <fo:inline>
<fo:inline>Exemple</fo:inline>
</fo:inline>
</fo:block>
<fo:block space-before="5mm" text-align="justify">
<fo:block linefeed-treatment="preserve" keep-together.within-page="auto">
<fo:block>
<fo:inline/>
<fo:inline>TEST
TEST</fo:inline>
</fo:block>
</fo:block>
</fo:block>
<fo:block keep-together.within-page="always">
<fo:block space-before="10mm" text-align="right">
<fo:inline text-decoration="underline">
<fo:inline>Signataire</fo:inline>
</fo:inline>
<fo:block/>
<fo:block>
<fo:inline>John SMITH</fo:inline>
</fo:block>
<fo:block>
<fo:inline>
<fo:inline>Nr. INAMI: </fo:inline>
</fo:inline>
<fo:inline>45632163140</fo:inline>
</fo:block>
</fo:block>
</fo:block>
<fo:block id="endDoc"/>
</fo:flow>
</fo:page-sequence>
</fo:root>
编辑
按照@lfurini的建议,我找到了一种用 ;
替换所有换行符的方法,但它仍然产生相同的NPE错误。
使用的代码如下所示:
<xsl:template name="gReplaceLineBreak">
<xsl:param name="pString"/>
<xsl:choose>
<xsl:when test="substring-before($pString,'
')">
<xsl:value-of select="substring-before($pString,'
')"/> <fo:block/>
<xsl:call-template name="gReplaceLineBreak">
<xsl:with-param name="pString" select="substring-after($pString,'
')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$pString"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Edit-2
好了,我终于找到了为什么它不能使用上面的代码。有一个
节点包含所有
。现在我移除了它,它就像@lfurini说的那样起作用了。多谢.
这是一个影响每个FOP版本的bug,包括最新的。
这里有一个(非常难看的)变通方法:
linefeed-treatment=“preserve”keep-together.within-page=“auto”
,因为前者会产生错误,而后者会使内容溢出页面限制 ;
替换块中换行符(非分隔空格、空块、换行符仅用于可读性)例如,示例中的相关块将变为:
<fo:block space-before="5mm" text-align="justify">
<fo:block> <fo:block/>
<fo:block> <fo:block/>
<fo:inline/> <fo:block/>
TEST <fo:block/>
 <fo:block/>
 <fo:block/>
 <fo:block/>
 <fo:block/>
 <fo:block/>
 <fo:block/>
 <fo:block/>
 <fo:block/>
 <fo:block/>
 <fo:block/>
 <fo:block/>
 <fo:block/>
 <fo:block/>
 <fo:block/>
 <fo:block/>
 <fo:block/>
 <fo:block/>
 <fo:block/>
 <fo:block/>
 <fo:block/>
 <fo:block/>
 <fo:block/>
 <fo:block/>
 <fo:block/>
END OF TEST <fo:block/>
</fo:block> <fo:block/>
</fo:block>
</fo:block>
这适用于从1.1到最近的2.3的FOP(不能用1.0进行测试,因为下载页面已经不能提供它了)。
实现方法:在XSLT样式表中,您可能应该使用特殊的模式
来处理来自文本区域的用户内容,对于长度为0的文本节点,生成
。
我正在使用iText 5.5.4生成pdf。 我有一组行,这些行应该分组在一起,并有一个rowspan单元格来命名组。但是,在分页符上,“GRP”一词被分为“G”和“RP”。有没有一种方法可以让这个小组牢不可破,如果它不能放在当前的页面上,就可以在下一页上画出来? 我尝试了同时保持prowstogether和setBreakpoints,但没有得到一致的结果。 布局图像: 上述代码的PDF输出
我使用嵌入在Java应用程序中的Apache FOP 1.1成功地将XML转换为PDF。不幸的是,我被指示降级到FOP 1.0,以遵守公司许可证。所以,我用1.1 jar替换了1.0 jar,并交叉检查了依赖程序的兼容性。一切都正常,程序运行良好。然而,FOP 1.0生成的PDF仅包含每个错误字符的“#”: (这里,“M”只是作为一个例子。但是它显示了文件中每个字符的错误。)我在Apache网站上
问题内容: 我正在生成一个动态pdf文件,该文件包含大约10,000个用户的数据,通常该应用程序是使用MySQL和PHP开发的。动态内容是如此繁重,以至于我发现很难在课堂上进行处理。因此,我使用将输出的PHP页面转换为HTML文件。现在,已成功生成html文件和pdf文件。但是我想在每个用户的数据之后留下一个分页符,也就是说,每个用户的数据都必须从一个新的页面开始。我无法使用任何HTML标记,因为
问题内容: 我正在尝试确定在Python中读取换行符分隔文件时处理换行符的最佳方法。 我想出的是以下代码,包括一次性代码以进行测试。 有什么建议吗? 问题答案:
问题内容: 我是android开发的菜鸟,我正尝试通过多个换行符将字符串拆分多次。我要拆分的字符串是从数据库查询中提取的,其结构如下: result.getCoin的内容如下: 我想在换行处拆分字符串,然后将每个子字符串放入字符串数组。这是我当前的代码: 这给了我一个输出: 而不是我想要的输出: 任何帮助是极大的赞赏 问题答案: 您可以使用以下语句按换行符分割字符串:
问题内容: 我正在尝试通过以下代码读取linux命令生成的某些字符串输出: 以上是类型,如何区分行内容中的“ \ n”字符与实际换行符?我试过了 和 但是只要看到“ \ n”字符,它们都会拆分整个字符串缓冲区。 好了,要澄清一下,“虚幻”中断是字符串中包含的“ \ n”字符,如下所示, 整个输出是一个大的多行字符串,它可能还包含其他带引号的字符串,我正在处理go程序中的整个字符串输出,但是我无法控