我正在尝试使用Flying-Saucer将HTML页面呈现为PDF。 HTML在内存中创建,并作为
传递给渲染器renderer.setDocumentFromString(new String(htmlByteArray));
问题是我在HTML中有<img src="images.jpg"/>
,并且没有在最终的HTML中呈现。该图像位于包中的resources
文件夹中。
我尝试使用以下内容设置基本网址,但没有成功:
ITextRenderer renderer = new ITextRenderer(); renderer.getSharedContext().setBaseURL("com/org/tools/designer/resources/"); System.out.println(renderer.getSharedContext().getBaseURL()); renderer.setDocumentFromString(new String(htmlByteArray)); renderer.layout(); renderer.createPDF(os);
答案 0 :(得分:4)
在FS中有一个名为UserAgentCallback
的非常酷的界面,它允许您获取所有自己的资源。对于其他人来说,你可以相应地设置你的网址:
renderer.getSharedContext().getUserAgentCallback().setBaseURL("url_to_resources");
但是,这里有一个特殊情况,您的jar文件中嵌入了需要特殊访问方式的资源。你可以实现自己的UserAgentCallback
这是我写给你的一点点。 (我没有测试过,所以你可能需要调试一下)。
此代码位扩展了ITextUserAgent
,只需要覆盖getBinaryResource
方法,剩下的就是库。如果这还没有成功,你可以考虑在UserAgentCallback
上实现完整。
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import org.xhtmlrenderer.pdf.ITextOutputDevice;
import org.xhtmlrenderer.pdf.ITextUserAgent;
public class PackageUserAgentCallback extends ITextUserAgent {
private Class resourceClass;
public PackageUserAgentCallback(ITextOutputDevice outputDevice, Class resourceClass) {
super(outputDevice);
this.resourceClass = resourceClass;
}
@Override
public byte[] getBinaryResource(String uri) {
try {
InputStream in = resourceClass.getResourceAsStream(uri);
ByteArrayOutputStream out = new ByteArrayOutputStream();
int numRead;
byte [] buffer = new byte[256];
while((numRead = in.read(buffer)) != -1) {
out.write(buffer, 0, numRead);
}
return out.toByteArray();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
然后您可以将其设置为UserAgentCallback
,这会通过您的PackageUserAgentCallback
ITextRenderer renderer = new ITextRenderer();
renderer.getSharedContext().setUserAgentCallback(
new PackageUserAgentCallback(renderer.getOutputDevice(), Resources.class));
System.out.println(renderer.getSharedContext().getBaseURL());
renderer.setDocumentFromString(new String(htmlByteArray));
renderer.layout();
renderer.createPDF(os);