从flysaucer中的servlet渲染图像生成pdf
我正在使用flyingsaucer通过一个servlet将xhtml文档呈现为pdf,该servlet返回生成的pdf文档。xhtml文档具有一个图像,该图像是从另一个servlet请求的。映像servlet在返回适当的映像之前检查谁登录。以下代码显示了如何请求图像:
<img height="140" width="140" src="http://localhost:8080/myapp/servlet/DisplayPic" />
我的问题是对图像的http请求来自pdf渲染器,而不是登录的用户,因此图像servlet不知道谁登录了,因此未返回所需的图像。
我目前正在使用下面的代码来呈现xhtml文档:
ITextRenderer renderer = new ITextRenderer();
renderer.setDocumentFromString(xhtmlDocumentAsString);
renderer.layout();
os = response.getOutputStream();
renderer.createPDF(os);
我需要在请求图像servlet时维护用户的会话,或者为渲染器提供用于该特定xhtml元素的图像。我认为可以使用a来完成后者,ReplacedElementFactory
但我无法找出任何可以帮助我的示例代码。
-
我现在已经很好地工作了。这是代码。
在我的xhtml文档中,我有:
<div class="profile_picture" style="display:block;width:140px;height:140px;" />
(我使用的是
div
元素,而不是img
因为工厂仅用于块级元素)我使用以下方法渲染文档:
ITextRenderer renderer = new ITextRenderer(); renderer.getSharedContext().setReplacedElementFactory(new ProfileImageReplacedElementFactory(renderer.getSharedContext().getReplacedElementFactory())); renderer.setDocumentFromString(xhtmlDocumentAsString); renderer.layout(); os = response.getOutputStream(); renderer.createPDF(os);
我有我自己
ReplacedElementFactory
的如下:public class ProfileImageReplacedElementFactory implements ReplacedElementFactory { private final ReplacedElementFactory superFactory; public ProfileImageReplacedElementFactory(ReplacedElementFactory superFactory) { this.superFactory = superFactory; } @Override public ReplacedElement createReplacedElement(LayoutContext layoutContext, BlockBox blockBox, UserAgentCallback userAgentCallback, int cssWidth, int cssHeight) { Element element = blockBox.getElement(); if (element == null) { return null; } String nodeName = element.getNodeName(); String className = element.getAttribute("class"); if ("div".equals(nodeName) && className.contains("profile_picture")) { InputStream input = null; try { input = ...; byte[] bytes = IOUtils.toByteArray(input); Image image = Image.getInstance(bytes); FSImage fsImage = new ITextFSImage(image); if (fsImage != null) { if ((cssWidth != -1) || (cssHeight != -1)) { fsImage.scale(cssWidth, cssHeight); } return new ITextImageElement(fsImage); } } catch (IOException e) { getLogger().error(ExceptionUtils.getStackTrace(e)); } catch (BadElementException e) { getLogger().error(ExceptionUtils.getStackTrace(e)); } finally { IOUtils.closeQuietly(input); } } return superFactory.createReplacedElement(layoutContext, blockBox, userAgentCallback, cssWidth, cssHeight); } @Override public void reset() { superFactory.reset(); } @Override public void remove(Element e) { superFactory.remove(e); } @Override public void setFormSubmissionListener(FormSubmissionListener listener) { superFactory.setFormSubmissionListener(listener); } }