从byte []流中提取图像并放入BufferedImage []

时间:2016-07-07 21:11:48

标签: java pdf itext inputstream

问题

使用iText从pdf文档中提取图像的最佳方法是什么?表示为byte []流?

当前状态

" pdf"我得到的是服务器的byte []。我无法控制如何收到它。

我试图找出如何从多页pdf中提取所有图像,并将每个图像放入BufferedImage[]。每个pdf页面上只有一个图像,所以如果我有一个10页长的pdf,我会有一个BufferedImage[10]My initial implementation读入文件,然后转换。需求发生了变化,现在我必须尽可能地使用流。

我的旧实现不再起作用,因为MyImageRenderListener没有提供没有参数的构造函数(对于流不是必需的),我无法摆脱解析器,因为parser.processContent()(将图像拉出)将监听器作为参数。

我希望有一个更好的解决方案,而不是我目前遇到问题的方向。

代码

转换()

public static byte[] convert(byte[] in ) throws FileNotFoundException, IOException {

    ByteArrayInputStream input = new ByteArrayInputStream(in);
    ArrayList<BufferedImage> bimgArrL = getBufImgArr(input);
    BufferedImage[] bim = new BufferedImage[bimgArrL.size()];
    bimgArrL.toArray(bim);
    // More code below, not important in this scenario

}

getBufImgArr()

    //used with streams
public static ArrayList<BufferedImage> getBufImgArr(final ByteArrayInputStream bais) throws IOException { // TODO: This needs to be a MemoryCacheRandomAccessInputStream

    PdfReader reader = new PdfReader(bais);
    PdfReaderContentParser parser = new PdfReaderContentParser(reader);
    MyImageRenderListener listener = new MyImageRenderListener(); // This is the problem

    for (int page = 1; page <= reader.getNumberOfPages(); page++) {
        parser.processContent(page, listener);
    }

    reader.close();
    return listener.getBimgArray();
}

MyImageRenderListener

public class MyImageRenderListener implements RenderListener {

    protected String path = "";
    protected ArrayList bimg = new ArrayList(); // Added this

    public MyImageRenderListener(String path) {
        this.path = path;
    }

    public ArrayList<BufferedImage> getBimgArray() { //
        return bimg;                                 // Added this
    }                                                //

    public void renderImage(ImageRenderInfo renderInfo) {
        try {

            PdfImageObject image = renderInfo.getImage();
            if (image == null) {
                return;
            }

            bimg.add(image.getBufferedImage()); // Added this

        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }
}

0 个答案:

没有答案