技術図面を含む企業の 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
時間がなくなったので、同僚と私は手作業で画像を抽出しなければなりませんでした。まだ興味はありますが、暇なときにこの問題を解決しなければなりません。