从PDF中提取的图像是水平分段的

时间:2012-11-08 14:33:16

标签: java image pdf extract

我必须从包含技术图纸的公司PDF文件中提取图像。 PDF文件符合PDF / A格式。

我正在使用Apache的pdfbox方法,我从这个question中学到了这些方法。

/**
 * 
 * @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&lt; 数字&gt;,数字表示每页图像的顺序。因此文件夹中的片段已经处于订单状态,合并程序可以很容易地找出哪个部分位于顶部等等。

编辑 - 方法2

我能想到的另一种方法:片段在其模式 pdfname_page_[\d]_Im[\d][\.][tiff|png] 中的文件名中有顺序。因此,我可以对与该顺序对应的图像进行排序,然后合并具有相同宽度的行中的所有片段。 我检查了那些碎片,看起来几乎所有的图像都有不同的尺寸。

您对这些方法有何看法?

EDIT3

由于时间不多了,我的同事和我不得不手工提取图像。我仍然感兴趣,但我必须在空闲时间解决这个问题。

1 个答案:

答案 0 :(得分:2)

提取的图像被分割成3个切片,因为嵌入的图像也是如此。这就是PDF生成软件最有可能自动完成的。 (例如,InDesign文档设计人员故意这样做是非常罕见的。)

因此,没有可靠的方法可以用来自动拼接碎片。

您可以尝试的是 - 但只有您有Adobe Acrobat(Pro?)的版本可用:

  • 使用内置“PDF优化工具”
  • “删除对象”面板中,激活“检测图像片段并合并它们”选项。

(很抱歉,上面的菜单和用户界面条目是我从德国Acrobat Pro安装的内存中翻译出来的,因此它们肯定不能与英文用户界面精确匹配。)

但是,根据我的经验,这种方法不会非常可靠。在大多数PDF格式的图像碎片中,它根本不起作用。 : - (