Edd*_*Edd 10 java pdf-generation itext flying-saucer xhtmlrenderer
我正在使用flyingsaucer通过servlet将xhtml文档呈现为pdf,该servlet返回生成的pdf文档.xhtml文档具有从另一个servlet请求的图像.图像servlet在返回适当的图像之前检查谁登录.下面的代码显示了如何请求图像:
<img height="140" width="140" src="http://localhost:8080/myapp/servlet/DisplayPic" />
Run Code Online (Sandbox Code Playgroud)
我的问题是图像的http请求来自pdf渲染器而不是登录用户,因此图像servlet不知道谁登录,因此不返回所需的图像.
我目前正在使用下面的代码来呈现xhtml文档:
ITextRenderer renderer = new ITextRenderer();
renderer.setDocumentFromString(xhtmlDocumentAsString);
renderer.layout();
os = response.getOutputStream();
renderer.createPDF(os);
Run Code Online (Sandbox Code Playgroud)
我需要在请求图像servlet时维护用户的会话,或者为渲染器提供用于该特定xhtml元素的图像.我认为后者可以使用a完成,ReplacedElementFactory但我无法挖掘出任何可以帮助我的示例代码.
Edd*_*Edd 22
我现在的工作非常好.这是代码.
在我的xhtml文档中,我有:
<div class="profile_picture" style="display:block;width:140px;height:140px;" />
Run Code Online (Sandbox Code Playgroud)
(我使用的是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);
Run Code Online (Sandbox Code Playgroud)
我有自己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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10750 次 |
| 最近记录: |