我正在使用Apache FOP 2.1,JAXB和XSLT 1.0生成PDF。该模板有一些嵌入式SVG。 PDF呈现没有任何问题,但FO正在抛出混乱我的日志的错误。XSL-FO:“无法设置基本URL”用于嵌入式svg
设置:
XslProcessor.java
public XslProcessor(File f) {
try {
URIResolverAdapter uriResolverAdapter = new URIResolverAdapter(new UserAgentUriResolver());
FopFactoryBuilder builder = new FopFactoryBuilder(URI.create("/"), uriResolverAdapter);
DefaultConfigurationBuilder defaultConfigurationBuilder = new DefaultConfigurationBuilder();
builder.setConfiguration(defaultConfigurationBuilder.buildFromFile("config/pdf/fop.xconf"));
fopFactory = builder.build();
transformerFactory = TransformerFactory.newInstance();
transformFile = f;
} catch (IOException | SAXException | ConfigurationException e) {
throw new RuntimeException(e);
}
}
public synchronized void process(InputStream is, OutputStream os) {
try {
try(BufferedOutputStream bufferedOut = new BufferedOutputStream(os)) {
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, bufferedOut);
Source xslt = new StreamSource(transformFile);
Transformer transformer = transformerFactory.newTransformer(xslt);
Source source = new StreamSource(is);
Result result = new SAXResult(fop.getDefaultHandler());
transformer.transform(source, result);
}
os.flush();
os.close();
} catch (IOException | FOPException | TransformerException e) {
throw new RuntimeException(e);
}
}
UserAgentUriResolver.java
public class UserAgentUriResolver implements URIResolver {
private static final String USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.86 Safari/537.36";
private static final String REFERRER = "https://www.google.com";
@Override
public Source resolve(String href, String base) throws TransformerException {
try {
URL url = new URL(href);
URLConnection connection = url.openConnection();
connection.setRequestProperty("User-Agent", USER_AGENT);
connection.setRequestProperty("Referrer", REFERRER);
return new StreamSource(connection.getInputStream());
} catch (IOException e) {
return new StreamSource(new ByteArrayInputStream(new byte[0]));
}
}
}
样本模板:
<?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:template match="/">
<fo:root>
<fo:layout-master-set>
<fo:simple-page-master master-name="page"
page-height="29.7cm"
page-width="21cm">
<fo:region-body/>
<fo:region-after extent="1.25cm"/>
</fo:simple-page-master>
<fo:page-sequence-master master-name="all">
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference master-reference="page"/>
</fo:repeatable-page-master-alternatives>
</fo:page-sequence-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="all">
<fo:static-content flow-name="xsl-region-after">
<fo:block>
<fo:instream-foreign-object>
<!-- SVG here! -->
<svg xmlns="http://www.w3.org/2000/svg" xml:base="http://www.example.com/">
<rect height="20" width="100%" fill="#ababab"></rect>
</svg>
</fo:instream-foreign-object>
</fo:block>
</fo:static-content>
<fo:flow flow-name="xsl-region-body">
<fo:block>
<xsl:apply-templates/>
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
</xsl:stylesheet>
一旦在模板中每一个SVG ,我得到
org.apache.fop.fo.FONode:对SVG无法设置基本URL
java.lang.IllegalArgumentException异常:URI不在java.net.URI.toURL绝对 ( URI.java:1088)〜[na:1.8.0_91] at org.apache.fop.fo.extensions.svg.SVGElement.getDimension(SVGElement.java:77)〜[fop-2.1.jar:na] at org.apache.fop.fo.flow.stream.InstreamForeignObject.getIntrinsicWidth(InstreamForeignObject.java:125)[fop-2.1.jar:na] at org.apache.fop.fo.flow.stream.InstreamForeignObject.getIntrinsicWidth(InstreamForeignObject.java:125 )[fop-2.1.jar:na] at org.apache.fop.layoutmgr.in line.AbstractGraphicsLayoutManager.getInlineArea(AbstractGraphicsLayoutManager.java:60)[FOP-2.1.jar:NA] 在...
不知道这是否是任何解决方案,但这是可怕的代码。您正在创建对象,然后运行测试以查看是否需要任何内容(好)或没有任何内容(违反标准),为什么您的测试不围绕您是否创建流内异物? –
你能编辑你的问题来包含一个带有所有属性*的结果svg *的例子吗?我只是试着用FOP 2.1来处理从你的代码派生的一个fo文件,它根本没有任何警告,所以我怀疑其他属性有问题。 – lfurini
可能不是(@someValue)返回false,导致像 这样的结构在某些引擎中可能导致问题。不知道上面的错误,从来没有测试过它。 –