Kid*_*rla 8 java xhtml pdf-generation flying-saucer
我正在使用Flying Saucer将一些PDF文档从字符串渲染为XHTML.我的代码是这样的:
iTextRenderer.setDocument(documentGenerator.generate(xhtmlDocumentAsString));
iTextRenderer.layout();
iTextRenderer.createPDF(outputStream);
Run Code Online (Sandbox Code Playgroud)
我想要了解的是,当使用这种方法时,XHTML中的相对路径从哪里解决?例如,对于图像或样式表.我能够使用此方法成功生成基于文本的文档,但我需要了解如何引用我的图像和CSS.
小智 18
setDocument()方法有两个参数:document和url.url参数指示用于添加到xhtml中出现的相对路径的基本URL,例如img标记.
假设你有:
<img src="images/img1.jpg">
Run Code Online (Sandbox Code Playgroud)
现在假设文件夹"images"位于:
C:/physical/route/to/app/images/
Run Code Online (Sandbox Code Playgroud)
您可以使用setDocument()作为:
renderer.setDocument(xhtmlDoc, "file:///C:/physical/route/to/app/");
Run Code Online (Sandbox Code Playgroud)
注意尾部斜杠,没有它就无法工作.
这是它对我有用的方式.我假设您可以使用其他类型的网址,例如"http:// ...".
本周我一直在研究这个问题,我告诉你什么对我有用.
在现实生活中,您的XHTML文档指向具有相对路径的多个资源(图像,css等).您还必须向Flying Saucer解释在哪里找到它们.它们可以位于类路径中,也可以位于文件系统中.(如果他们在网络上,你可以设置基本网址,所以这没有帮助)
所以你必须像这样扩展ITextUserAgent:
private static class ResourceLoaderUserAgent extends ITextUserAgent {
public ResourceLoaderUserAgent(ITextOutputDevice outputDevice) {
super(outputDevice);
}
protected InputStream resolveAndOpenStream(String uri) {
InputStream is = super.resolveAndOpenStream(uri);
String fileName = "";
try {
String[] split = uri.split("/");
fileName = split[split.length - 1];
} catch (Exception e) {
return null;
}
if (is == null) {
// Resource is on the classpath
try{
is = ResourceLoaderUserAgent.class.getResourceAsStream("/etc/images/" + fileName);
} catch (Exception e) {
}
if (is == null) {
// Resource is in the file system
try {
is = new FileInputStream(new File("C:\\images\\" + fileName));
} catch (Exception e) {
}
}
return is;
}
}
Run Code Online (Sandbox Code Playgroud)
你这样使用它:
// Output stream containing the result
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ITextRenderer renderer = new ITextRenderer();
ResourceLoaderUserAgent callback = new ResourceLoaderUserAgent(renderer.getOutputDevice());
callback.setSharedContext(renderer.getSharedContext());
renderer.getSharedContext().setUserAgentCallback(callback);
renderer.setDocumentFromString(htmlSourceAsString);
renderer.layout();
renderer.createPDF(baos);
renderer.finishPDF();
Run Code Online (Sandbox Code Playgroud)
干杯.