gpt4 book ai didi

java - 在 TransformerFactory 中设置安全处理会导致 XSL 中出现问题

转载 作者:行者123 更新时间:2023-12-05 06:22:39 25 4
gpt4 key购买 nike

我正在使用 Apache FOP 2.4 生成一个以 XML 文件作为输入的 PDF 文档。为了防止 XXE 攻击,我需要在 TransformerFactory 中设置安全处理功能 (FEATURE_SECURE_PROCESSING):

InputStream xslTransformer = getClass().getClassLoader().getResourceAsStream("foo.xsl");
TransformerFactory transformerFactory = TransformerFactory.newInstance();
transformerFactory.setFeature(FEATURE_SECURE_PROCESSING, true);
Transformer transformer = transformerFactory.newTransformer(new StreamSource(xslTransformer));
transformer.transform(new DOMSource(), new SAXResult(fop.getDefaultHandler()));

设置此功能后我无法生成任何 PDF 文档并且收到警告:

SystemId Unknown; Line #49; Column #99; "master-name" attribute is not allowed on the fo:simple-page-master element!
SystemId Unknown; Line #49; Column #99; "initial-page-number" attribute is not allowed on the fo:simple-page-master element!
SystemId Unknown; Line #49; Column #99; "page-height" attribute is not allowed on the fo:simple-page-master element!
SystemId Unknown; Line #49; Column #99; "page-width" attribute is not allowed on the fo:simple-page-master element!
etc ...

这是 XSL 文件 (foo.xsl) 的一部分:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:pdf="http://xmlgraphics.apache.org/fop/extensions/pdf">

<xsl:template match="/">
<fo:root>
<fo:layout-master-set>
<fo:simple-page-master master-name="A4-portrait" initial-page-number="1"
page-height="29.7cm" page-width="21.0cm" margin-top="0cm"
margin-left="1cm" margin-right="1.3cm" margin-bottom="0cm">
<fo:region-body margin-top="2.2cm" margin-bottom="1.2cm" margin-left="1.3cm"/>
<fo:region-before region-name="xsl-region-before" extent="2.2cm"/>
<fo:region-after region-name="xsl-region-after" extent="1.2cm"/>
<fo:region-start region-name="xsl-region-start" extent="1.3cm"/>
</fo:simple-page-master>
</fo:layout-master-set>

<fo:page-sequence master-reference="A4-portrait" font-family="Consolas" font-size="11">
<fo:flow flow-name="xsl-region-body">
<fo:block linefeed-treatment="preserve" font-weight="bold">
foo
</fo:block>

<fo:block linefeed-treatment="preserve">
bar
</fo:block>

</fo:flow>
</fo:page-sequence>

</fo:root>
</xsl:template>

</xsl:stylesheet>

我应该如何使用此功能并使其发挥作用? Java 版本为 8。

最佳答案

这是由于 xalan-2.7.2。

Here is the bug in Xalan-J

切换到 xalan-2.7.1 或更早版本将解决您的问题。

您可能必须在 Apache-FO 依赖项上强制排除 xalan。

您也可以用 2.7.2_3 覆盖,它修补了这个问题。

<dependency>
<groupId>org.apache.servicemix.bundles</groupId>
<artifactId>org.apache.servicemix.bundles.xalan</artifactId>
<version>2.7.2_3</version><!--$NO-MVN-MAN-VER$-->
</dependency>

使用<!--$NO-MVN-MAN-VER$-->防止覆盖。

关于java - 在 TransformerFactory 中设置安全处理会导致 XSL 中出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59030909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com