如何在FileInputStream中加载外部图像

时间:2019-05-23 10:33:41

标签: java image inputstream flying-saucer xhtmlrenderer

我正在使用飞碟(itextrenderer)进行html到pdf转换...我必须渲染图像..我已经渲染了本地存储中的图像(工作正常)。我必须外部图像也是如此。

这是我的html到pdf图像渲染器的代码段...

25

这是我呈现html图像的默认类,我必须在其中加载外部图像

([+](?:[+]\d{2,}|\d{3,})|\d{4,})\b

当我通过加载本地图像进行尝试时,效果很好,如下所示

( #Capturing group
    [+] #Match + sign
       (?:  #Non-capturing group
         [+]\d{2,} #Match another + followed by at least 2 digits
         | #Alterantion (OR)
         \d{3,} #Match at least 3 digits
       )
    | #Alterantion (OR)
    \d{4,} #Match at least 4 digits
)
\b #Word boundary. Number shouldn't be in between alphabets

我的html部分(本地存储映像)看起来像

    {
        try {
            String url = new File(inputHtmlPath).toURI().toURL().toString();
            System.out.println("URL: " + url);

            OutputStream out = new FileOutputStream(outputPdfPath);
            File signUpTemplate = new File("C:/Users/SFLTP022/Desktop/task/index1.html");
            String content=FileUtils.readFileToString(signUpTemplate);
            //Flying Saucer part
            ITextRenderer renderer = new ITextRenderer();
            renderer.getSharedContext().setReplacedElementFactory(new MediaReplacedElementFactory(renderer.getSharedContext().getReplacedElementFactory()));
            renderer.setDocumentFromString(content.toString());
            renderer.layout();
            final ByteArrayOutputStream baos = new ByteArrayOutputStream();
            renderer.createPDF(baos);

            //ITextRenderer renderer = new ITextRenderer();

            renderer.setDocument(url);
            renderer.layout();
            renderer.createPDF(out);

            out.close();
        } 

我的html部分(外部存储图片)看起来像


import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URL;

import org.apache.commons.io.IOUtils;
import org.w3c.dom.Element;
import org.xhtmlrenderer.extend.FSImage;
import org.xhtmlrenderer.extend.ReplacedElement;
import org.xhtmlrenderer.extend.ReplacedElementFactory;
import org.xhtmlrenderer.extend.UserAgentCallback;
import org.xhtmlrenderer.layout.LayoutContext;
import org.xhtmlrenderer.pdf.ITextFSImage;
import org.xhtmlrenderer.pdf.ITextImageElement;
import org.xhtmlrenderer.render.BlockBox;
import org.xhtmlrenderer.simple.extend.FormSubmissionListener;


import com.lowagie.text.Image;

public class MediaReplacedElementFactory implements ReplacedElementFactory {
    private final ReplacedElementFactory superFactory;

    public MediaReplacedElementFactory(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");
        // Replace any <div class="media" data-src="image.png" /> with the
        // binary data of `image.png` into the PDF.
        if ("div".equals(nodeName) && "media".equals(className)) {
            if (!element.hasAttribute("data-src")) {
                throw new RuntimeException("An element with class `media` is missing a `data-src` attribute indicating the media file.");
            }
            InputStream input = null;
            try {
                input = new FileInputStream("https://cdn.zetran.com/testasset/images/banner/zetran/banner-parts/base/png/" + element.getAttribute("data-src"));
                final byte[] bytes = IOUtils.toByteArray(input);
                final Image image = Image.getInstance(bytes);
                final FSImage fsImage = new ITextFSImage(image);
                if (fsImage != null) {
                    if ((cssWidth != -1) || (cssHeight != -1)) {
                        fsImage.scale(cssWidth, cssHeight);
                    }
                    return new ITextImageElement(fsImage);
                }
            } catch (Exception e) {
                throw new RuntimeException("There was a problem trying to read a template embedded graphic.", e);
            } finally {
                IOUtils.closeQuietly(input);
            }
        }
        return this.superFactory.createReplacedElement(layoutContext, blockBox, userAgentCallback, cssWidth, cssHeight);
    }

    @Override
    public void reset() {
        this.superFactory.reset();
    }

    public void remove(Element e) {
        this.superFactory.remove(e);
    }

    @Override
    public void setFormSubmissionListener(FormSubmissionListener listener) {
        // TODO Auto-generated method stub

    }
}

错误消息是

input = new FileInputStream("C:\Users\Public\Pictures\Sample Pictures\" + element.getAttribute("data-src"));

1 个答案:

答案 0 :(得分:0)

是的,您可以将文件路径写为URL,例如file:// ....,但FileInputStream仅能处理指向本地文件的那种文件协议URL。 Http-URL必须装有某种HTTP客户端。