我必须从包含技术图纸的公司 PDF 文件中提取图像。PDF 文件符合 PDF/A 格式。
我正在使用 Apache 的 pdfbox 的方法,这是我从这个问题中学到的。
/**
*
* @param filename pdf file
* @param res folder, where images are extracted
* @throws IOException
* @throws DocumentException
*/
public class ExtractImages {
public static void extractImages(String filename, String res)
throws IOException, DocumentException {
int pageNo = 0;
PDDocument document = null;
document = PDDocument.load(filename);
List<PDPage> pages = document.getDocumentCatalog().getAllPages();
Iterator<PDPage> iter = pages.iterator();
while (iter.hasNext()) {
pageNo++;
PDPage page = iter.next();
PDResources resources = page.getResources();
Map<String, PDXObjectImage> pageImages = resources.getImages();
if (pageImages != null) {
Iterator<String> imageIter = pageImages.keySet().iterator();
while (imageIter.hasNext()) {
String key = (String) imageIter.next();
PDXObjectImage image = (PDXObjectImage) pageImages.get(key);
image.write2file(res + "_page_" + pageNo + "_" + key);
}
}
}
if (document != null)
document.close();
}
}
我现在的问题是,对于某些文件,提取的图像被水平分割成最多 3 个切片。由于我不想手动将它们拼接在一起,如果有人有一些建议,我会很高兴。
编辑 - 方法 1
我想到的一种解决方案是为每个图像创建文件夹,然后将所有片段放在相应的文件夹中,遍历文件夹并合并内容。这需要我做一些分类工作,但我认为它可以工作。
String key = (String) imageIter.next();
返回 Im< number >,number表示每页图像的顺序。所以文件夹中的片段已经是有序的,合并程序可以很容易地找出哪个部分在上面,等等。
编辑 - 方法 2
我能想到的另一种方法:片段在文件名中的顺序在该模式中pdfname_page_[\d]_Im[\d][\.][tiff|png]
。所以我可以对与该顺序对应的图像进行排序,然后将具有相同宽度的所有片段合并到一行中。我检查了这些片段,似乎几乎所有图像都有不同的尺寸。
你对这些方法有什么看法?
编辑3
由于时间不多了,我和我的同事不得不手动提取图像。我仍然感兴趣,但我必须在空闲时间解决这个问题。