6

技術図面を含む企業の 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

私が考えた 1 つの解決策は、画像ごとにフォルダーを作成し、すべてのフラグメントを対応するフォルダーに配置し、フォルダーを反復処理してコンテンツをマージすることでした。それには私の側でソート作業が必要になりますが、うまくいくと思います。

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

Im< number > を返します。numberは、ページごとの画像の順序を示します。したがって、フォルダー内のフラグメントはすでに順序付けられており、マージプログラムはどの部分が一番上にあるかなどを簡単に把握できます.

編集 - アプローチ 2

私が考えることができる別のアプローチ:フラグメントは、そのパターンでファイル名に順序がありますpdfname_page_[\d]_Im[\d][\.][tiff|png]。そのため、その順序に対応する画像を並べ替えてから、同じ幅の行のすべてのフラグメントをマージできます。そのフラグメントを確認したところ、ほぼすべての画像の寸法が異なっているようです。

これらのアプローチについてどう思いますか?

EDIT3

時間がなくなったので、同僚と私は手作業で画像を抽出しなければなりませんでした。まだ興味はありますが、暇なときにこの問題を解決しなければなりません。

4

1 に答える 1

2

抽出された画像は、埋め込まれた画像も同様であるため、3 つのスライスに断片化されています。これは、おそらく PDF 生成ソフトウェアが自動的に行ったことです。(たとえば、InDesign のドキュメント デザイナーが意図的にこれを行うことは非常にまれです。)

したがって、フラグメントを自動的につなぎ合わせるために使用できる信頼できる方法はありません。

あなたが試すことができるのはこれです-ただし、Adobe Acrobat(Pro?)のバージョンが利用可能な場合のみ:

  • 組み込みの「PDF オプティマイザー」を使用します。
  • [オブジェクトの削除]パネルで、 [画像の断片を検出してそれらを結合する] オプションを有効にします。

(申し訳ありませんが、上記のメニューと UI エントリは、ドイツ語の Acrobat Pro インストールの記憶から翻訳したため、英語の UI と正確に一致していません。)

ただし、私の経験では、この方法はあまり確実に機能しません。PDF の画像の断片化のほとんどの場合、まったく機能しません。:-(

于 2012-11-08T17:43:37.007 に答える