Я создаю документ PDF с файлом XML в качестве входных данных, используя Apache FOP 2.4. Чтобы предотвратить XXE-атаки, мне нужно установить функцию безопасной обработки (FEATURE_SECURE_PROCESSING) в TransformerFactory:
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>
Как мне использовать эту функцию и заставить ее работать? Ява версии 8.
initial-page-number="1"
, все соответствует стандарту. Итак, я думаю, что без соответствующей части XML я не могу воспроизвести ошибку. - person zx485   schedule 25.11.2019foo
иbar
. Кажется, что цепочка работает, но результат, похоже, нуждается в некотором улучшении. Однако я не могу воспроизвести ошибки. - person zx485   schedule 25.11.2019TransformerFactory
. Я просто поместил XML и XSLT в процессор XSLT и передал результат в Apache FOP, чтобы преобразовать его в файл PDF. Затем я просмотрел PDF-файл с помощью стандартной программы просмотра PDF-файлов Ubuntu 18.04:okular
. Итак, я использовал другой подход, который работает так, как хотелось бы, и указал, что ваш XML + XSLT, похоже, в порядке. Проблема должна быть где-то в другом. - person zx485   schedule 26.11.2019