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