mik*_*ike 6 java pdf image extract
我必须从包含技术图纸的公司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();
}
}
Run Code Online (Sandbox Code Playgroud)
我现在的问题是,对于某些文件,提取的图像在最多3个切片中水平分段.由于我不想手动将它们拼接在一起,如果有人有一些建议,我会很高兴.
编辑 - 方法1
我想到的一个解决方案是为每个图像创建文件夹,然后将所有片段放在相应的文件夹中,迭代文件夹并合并内容.这需要我的一些分类工作,但我认为它可以工作.
String key = (String) imageIter.next();
Run Code Online (Sandbox Code Playgroud)
返回Im < number >,number表示每页图像的顺序.因此文件夹中的片段已经处于订单状态,合并程序可以很容易地找出哪个部分位于顶部,等等.
编辑 - 方法2
我能想到的另一种方法是:片段在该模式中的文件名中有顺序pdfname_page_[\d]_Im[\d][\.][tiff|png].因此,我可以对与该顺序对应的图像进行排序,然后合并具有相同宽度的行中的所有片段.我检查了那些碎片,看起来几乎所有的图像都有不同的尺寸.
你对这些方法怎么说?
EDIT3
由于我们没时间用完了,我的同事和我不得不手工提取图像.我仍然感兴趣,但我必须在空闲时间解决这个问题.
提取的图像被分成 3 个切片,因为嵌入的图像也是如此。这很可能是 PDF 生成软件自动执行的操作。(InDesign 文档设计者故意这样做的情况非常罕见。)
因此,没有可靠的方法可以用来自动将片段缝合在一起。
您可以尝试以下方法 - 但前提是您有可用的 Adobe Acrobat(专业版?)版本:
(抱歉,上面的菜单和 UI 条目是我根据德语 Acrobat Pro 安装的记忆翻译的,因此它们肯定与英语 UI 不完全匹配。)
然而,根据我的经验,这种方法的工作效果不是很可靠。在大多数 PDF 中的图像碎片情况下,它根本不起作用。:-(