簡體   English   中英

從flyingsaucer生成的pdf中的servlet渲染圖像

[英]Render image from servlet in flyingsaucer generated 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元素的圖像。 我認為后者可以使用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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM