S-JIS[2017-09-11] 変更履歴

Apache PDFBox 読み込み

PDFBoxでpdfファイルにを読み込む例。

 

文字列を読み込む例

pdfファイル内の文字列だけを読み込むには、PDFTextStripperを使うのが便利。

package com.example.pdf;

import java.io.File;
import java.io.IOException;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
public class PdfboxExample4 {

	public static void main(String... args) throws IOException {
		File file = new File("D:/temp/pdfbox/example2.pdf");
		try (PDDocument document = PDDocument.load(file)) {
			PDFTextStripper s = new PDFTextStripper();
			String text = s.getText(document);
			System.out.println("[" + text + "]");
		}
	}
}

PDDocumentのloadメソッドでpdfファイルを読み込む。

PDFTextStripperで全テキストを1つの文字列として取得できる。


全テキストでなく個々の文字列を取得したい場合は、PDFTextStripperを継承したクラスを自作する。

import java.io.File;
import java.io.IOException;
import java.util.List;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import org.apache.pdfbox.text.TextPosition;
		PDFTextStripper s = new PDFTextStripper() {

			@Override
			protected void writeString(String text, List<TextPosition> textPositions) throws IOException {
				super.writeString(text);

				System.out.println(text);
				System.out.println(textPositions);
			}
		};
		s.getText(document);

getTextメソッドを呼び出すと、内部で文字列毎にwriteStringメソッドが呼び出される。
text引数には文字列、textPositionsには個々の文字の詳細情報(位置やフォント等)の情報が入ってくる。


pdfファイルを読み込む例

pdfファイルの内部構造を読み込むことが出来る。

package com.example.pdf;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;

import org.apache.pdfbox.cos.COSInputStream;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.PDStream;
public class PdfboxExample5 {

	public static void main(String... args) throws IOException {
		File file = new File("D:/temp/pdfbox/example2.pdf");
		try (PDDocument document = PDDocument.load(file)) {
			for (PDPage page : document.getPages()) {
				for (Iterator<PDStream> i = page.getContentStreams(); i.hasNext();) {
					PDStream cs = i.next();
					try (COSInputStream is = cs.createInputStream()) {
						for (;;) {
							int c = is.read();
							if (c < 0) {
								break;
							}
							System.out.printf("%c", c);
						}
					}
					System.out.println();
				}
			}
		}
	}
}


が、内部構造の文字がそのまま取得できるので、これを元に何か処理するのはとても大変そう(苦笑)


PDFBoxへ戻る / 技術メモへ戻る
メールの送信先:ひしだま