【问题标题】:Images extracted from PDF are horizontally fragmented从 PDF 中提取的图像水平碎片化
【发布时间】:2012-10-28 18:23:50
【问题描述】:

我必须从包含技术图纸的公司 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();

返回 Imnumber>,number 表示每页图像的顺序。所以文件夹中的片段已经是有序的,合并程序可以很容易地找出哪个部分在上面,等等。

编辑 - 方法 2

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

您对这些方法有什么看法?

EDIT3

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

【问题讨论】:

  • 我应该添加自己的解决方案建议作为答案/评论吗?或者可以将它们添加到问题中吗?

标签: java image pdf extract


【解决方案1】:

提取的图像被分成 3 个切片,因为嵌入的图像也是如此。这是 PDF 生成软件最有可能自动执行的操作。 (比方说,InDesign 文档设计者故意这样做是非常罕见的。)

因此,没有可靠的方法可用于自动将片段拼接在一起。

您可以尝试以下方法 - 但前提是您有可用的 Adob​​e Acrobat (Pro?) 版本:

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

(抱歉,上面的菜单和 UI 条目是我根据德国 Acrobat Pro 安装的记忆翻译的,因此它们肯定与英文 UI 不完全匹配。)

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

【讨论】:

  • 作为旁注,我已经看到在 Windows 中打印为 PDF 的图像存在此问题。由于某些未知的原因,Windows 中的内部打印架构在将一些图像发送到打印机驱动程序时将它们分割成几块。
  • 您的方法是否会自动为每个 pdf 文档、每个页面甚至每个图像工作?
  • @mike:Acrobat (Pro?) 中的 '检测图像片段并合并它们' 仅适用于每个 PDF 文档(正如我所说,不能可靠地工作) .
猜你喜欢
  • 2015-03-17
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
  • 2022-01-27
  • 1970-01-01
  • 1970-01-01
  • 2017-11-25
相关资源
最近更新 更多