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ファイルの内部構造を読み込むことが出来る。
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();
				}
			}
		}
	}
}
が、内部構造の文字がそのまま取得できるので、これを元に何か処理するのはとても大変そう(苦笑)