如何以正确的顺序从带有iText的PDF中提取图像?

我正在尝试从PDF文件提取图像。我在网上找到了一个很好的例子:

    PdfReader reader;

File file = new File("example.pdf");

reader = new PdfReader(file.getAbsolutePath());

for (int i = 0; i < reader.getXrefSize(); i++) {

PdfObject pdfobj = reader.getPdfObject(i);

if (pdfobj == null || !pdfobj.isStream()) {

continue;

}

PdfStream stream = (PdfStream) pdfobj;

PdfObject pdfsubtype = stream.get(PdfName.SUBTYPE);

if (pdfsubtype != null && pdfsubtype.toString().equals(PdfName.IMAGE.toString())) {

byte[] img = PdfReader.getStreamBytesRaw((PRStream) stream);

FileOutputStream out = new FileOutputStream(new File(file.getParentFile(), String.format("%1$05d", i) + ".jpg"));

out.write(img);

out.flush();

out.close();

}

}

那给了我所有的图像,但是图像顺序错误。我的下一个尝试如下所示:

for (int i = 0; i <= reader.getNumberOfPages(); i++) {

PdfDictionary d = reader.getPageN(i);

PdfIndirectReference ir = d.getAsIndirectObject(PdfName.CONTENTS);

PdfObject o = reader.getPdfObject(ir.getNumber());

PdfStream stream = (PdfStream) o;

// rest from example above

}

尽管o.isStream()== true,但是我只得到/ Length和/ Filter,流只有大约100个字节长。完全找不到图像。

我的问题是,正确的方式是从PDF文件中获取所有图像的正确方法。

回答:

我在其他地方找到了答案,即iText邮件列表。

以下代码对我 -请注意,我切换到 :

PDDocument document = null; 

document = PDDocument.load(inFile);

List pages = document.getDocumentCatalog().getAllPages();

Iterator iter = pages.iterator();

while (iter.hasNext()) {

PDPage page = (PDPage) iter.next();

PDResources resources = page.getResources();

Map pageImages = resources.getImages();

if (pageImages != null) {

Iterator imageIter = pageImages.keySet().iterator();

while (imageIter.hasNext()) {

String key = (String) imageIter.next();

PDXObjectImage image = (PDXObjectImage) pageImages.get(key);

image.write2OutputStream(/* some output stream */);

}

}

}

以上是 如何以正确的顺序从带有iText的PDF中提取图像? 的全部内容, 来源链接: utcz.com/qa/426675.html

回到顶部