将文件压缩为InputStream,然后将其中的每个文件分开,然后将其转换为图像。在Java中

时间:2012-06-12 22:03:42

标签: java zip bytearray inputstream pdfbox

我收到一个InputStream的zip文件。然后我将其中的每个文件分开。然后我将相同的byte array传递给pdfbox,内部使用Apace pdf box 1.6.0将其转换为图片。

但是当我将byte array传递给PDFDocumentReader时,我收到以下异常 -

SEVERE: expected='endstream' actual='' org.apache.pdfbox.io.PushBackInputStream@44c2beb9
java.io.IOException: expected='endstream' actual='' org.apache.pdfbox.io.PushBackInputStream@44c2beb9
at org.apache.pdfbox.pdfparser.BaseParser.parseCOSStream(BaseParser.java:439)
at org.apache.pdfbox.pdfparser.PDFParser.parseObject(PDFParser.java:530)
at org.apache.pdfbox.pdfparser.PDFParser.parse(PDFParser.java:172)
at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:862)
at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:829)
at org.dopdf.document.read.pdf.PDFDocumentReader.init(PDFDocumentReader.java:98)

要从zip获取每个文件,请使用以下代码 -

    ZipInputStream zis = new ZipInputStream(aZipFile); // aZipFile is byte array
    ZipEntry entry;
    ArrayList<String> nameOfIgnoredFiles = new ArrayList<String>();
    byte data[] = null;
    while ((entry = zis.getNextEntry()) != null) {
        if (entry.getName().endsWith(".pdf")) {
            int dataSize = (int)entry.getSize();
            data = new byte[dataSize];
            zis.read(data);
            // i use data and pass it to the pdf box.
        } else {
            nameOfIgnoredFiles.add(entry.getName());
        }

我上面提取的data字节数组然后传递到下面 -

PDFDocumentReader document = new PDFDocumentReader(data); // here i get the error

我做错了什么?你能建议一个解决方案吗?我想数据字节数组的提取是个问题。如何做到最好的方式?

1 个答案:

答案 0 :(得分:2)

您假设zis.read(data)填充缓冲区。查看API文档。不能保证这样做。您还假设大小适合int,并且项目本身适合内存。这些假设都不是有效的。

当然,您可以将条目的InputStream传递给pdfbox API吗?