fc2ブログ

JavaでPDFのイメージを抽出―PDFBox―

2010年09月25日 16:55

はじめに

JavaでPDFを操作するライブラリの中で,「PDFBox」に触れてみる
特長は
  • PDFファイルからのテキストの抽出
  • PDFファイルの結合
  • PDFファイルの暗号・複合化
  • 検索エンジン Lucene の組み込み
  • FDFデータの埋め込み
  • イメージをPDFに変換
  • PDFからのイメージ取得
など

準備

Apache PDFBox - Download からダウンロード
※今回は,「pdfbox-1.4.0.jar」



使ってみる

PDFファイルの読み込み
FileInputStream pdfStream = new FileInputStream(readFile);
PDFParser pdfParser = new PDFParser(pdfStream);
pdfParser.parse(); // 分析
PDDocument pdf = pdfParser.getPDDocument();

PDFファイルの書き込み
FileOutputStream stream = new FileOutputStream(writeFile);
COSWriter writer = new COSWriter(stream);
writer.write(pdf);

PDFからイメージを抽出
PDDocumentCatalog docCatalog = pdf.getDocumentCatalog();
PDAcroForm acroForm = docCatalog.getAcroForm();
PDField field = acroForm.getField(name); // フィールド取得
if (field != null) {
    field.setValue(value); // フィールドに埋め込み
}

PDFファイルの読み込み
FileInputStream pdfStream = new FileInputStream(readFile);
PDFParser pdfParser = new PDFParser(pdfStream);
pdfParser.parse(); // 分析
PDDocument pdf = pdfParser.getPDDocument();
int imageCounter = 1;
List pages = pdf.getDocumentCatalog().getAllPages();
Iterator iter = pages.iterator();
while (iter.hasNext()) { // 全ページからイメージを抽出
	PDPage page = (PDPage) iter.next();
	PDResources resources = page.getResources();
	Map images = resources.getImages();
	if (images != null) {
		Iterator imageIter = images.keySet().iterator();
		while (imageIter.hasNext()) {
			String key = (String) imageIter.next();
			PDXObjectImage image = (PDXObjectImage) images.get(key);
			String name = key + "-" + imageCounter;
			imageCounter++;
			System.out.println("Writing image:" + name);
			image.write2file(name); // ファイル出力
		}
	}
}



【参考】
JAVA開発メモ
JavaでPDFの文章を抽出するには、「PDFBox」 というAPIを用いる.
JavaでPDFから文章を抽出

【結果】
①全文英語PDF ⇒ 抽出できた
 (文章が、途中からの抽出だった。コンソールのバッファサイズの問題かも←あるのか?)
②全文日本語PDF ⇒ 抽出できた
パワーポイントファイルをPDFファイル化したもの ⇒ 抽出できた

まだ、よくわからないが、PDFファイルのサイズ や 文字量の上限があるのかもしれない.

※インポートは「pdfbox-1.2.1-src.zip」ではバグが発生するので、「pdfbox-app-1.2.1.jar」を選択する.

import java.io.*;

import org.apache.pdfbox.pdfparser.PDFParser;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.util.PDFTextStripper;

public class ExtractPDF {
	static String extractText(String filePath){
		ByteArrayOutputStream out = null;
		try {
			FileInputStream pdfStream = new FileInputStream(filePath);
			PDFParser parser = new PDFParser(pdfStream);
			parser.parse();
			PDDocument pdf = parser.getPDDocument();
			PDFTextStripper stripper = new PDFTextStripper();
			out = new ByteArrayOutputStream();
			stripper.writeText(pdf, new BufferedWriter(new OutputStreamWriter(out)));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return out.toString();
	}
	public static void main(String[] args){
		String pdfFile = "〇〇.pdf";
		String data=null;
		data = extractText(pdfFile);
		System.out.println(data);
	}
}


コメント

    コメントの投稿

    (コメント編集・削除に必要)
    (管理者にだけ表示を許可する)

    トラックバック

    この記事のトラックバックURL
    http://kevin3sei.blog95.fc2.com/tb.php/92-ec1a9075
    この記事へのトラックバック