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