Flying Saucer XHTML的相对路径?

Kid*_*rla 8 java xhtml pdf-generation flying-saucer

我正在使用Flying Saucer将一些PDF文档从字符串渲染为XHTML.我的代码是这样的:

iTextRenderer.setDocument(documentGenerator.generate(xhtmlDocumentAsString));
iTextRenderer.layout();
iTextRenderer.createPDF(outputStream);
Run Code Online (Sandbox Code Playgroud)

我想要了解的是,当使用这种方法时,XHTML中的相对路径从哪里解决?例如,对于图像或样式表.我能够使用此方法成功生成基于文本的文档,但我需要了解如何引用我的图像和CSS.

小智 18

setDocument()方法有两个参数:document和url.url参数指示用于添加到xhtml中出现的相对路径的基本URL,例如img标记.

假设你有:

<img src="images/img1.jpg">
Run Code Online (Sandbox Code Playgroud)

现在假设文件夹"images"位于:

C:/physical/route/to/app/images/
Run Code Online (Sandbox Code Playgroud)

您可以使用setDocument()作为:

renderer.setDocument(xhtmlDoc, "file:///C:/physical/route/to/app/");
Run Code Online (Sandbox Code Playgroud)

注意尾部斜杠,没有它就无法工作.

这是它对我有用的方式.我假设您可以使用其他类型的网址,例如"http:// ...".


Rem*_*emy 7

本周我一直在研究这个问题,我告诉你什么对我有用.

在现实生活中,您的XHTML文档指向具有相对路径的多个资源(图像,css等).您还必须向Flying Saucer解释在哪里找到它们.它们可以位于类路径中,也可以位于文件系统中.(如果他们在网络上,你可以设置基本网址,所以这没有帮助)

所以你必须像这样扩展ITextUserAgent:

private static class ResourceLoaderUserAgent extends ITextUserAgent {

    public ResourceLoaderUserAgent(ITextOutputDevice outputDevice) {
        super(outputDevice);
    }

    protected InputStream resolveAndOpenStream(String uri) {

        InputStream is = super.resolveAndOpenStream(uri);
        String fileName = "";
        try {
            String[] split = uri.split("/");
            fileName = split[split.length - 1];
        } catch (Exception e) {
            return null;
        }

        if (is == null) {
            // Resource is on the classpath
            try{
                is = ResourceLoaderUserAgent.class.getResourceAsStream("/etc/images/" + fileName);
            } catch (Exception e) {
        }

        if (is == null) {
            // Resource is in the file system
            try {
                is = new FileInputStream(new File("C:\\images\\" + fileName));
            } catch (Exception e) {
            }
        }

        return is;
    }
}
Run Code Online (Sandbox Code Playgroud)

你这样使用它:

// Output stream containing the result
ByteArrayOutputStream baos = new ByteArrayOutputStream();

ITextRenderer renderer = new ITextRenderer();
ResourceLoaderUserAgent callback = new ResourceLoaderUserAgent(renderer.getOutputDevice());
callback.setSharedContext(renderer.getSharedContext());
renderer.getSharedContext().setUserAgentCallback(callback);

renderer.setDocumentFromString(htmlSourceAsString);

renderer.layout();
renderer.createPDF(baos);
renderer.finishPDF();
Run Code Online (Sandbox Code Playgroud)

干杯.