有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

flyingsaucer生成的pdf中servlet的java渲染图像

我使用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);

我需要在请求image servlet时维护用户的会话,或者为渲染器提供用于特定xhtml元素的图像。我认为后者可以使用ReplacedElementFactory实现,但我还没有找到任何可以帮助我的示例代码


共 (1) 个答案

  1. # 1 楼答案

    我现在做得很好。这是密码

    在我的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);
        }
    }