テキストの抽出など、PDFBoxでの作業を開始したばかりです。私が興味を持っていることの 1 つは、抽出しているテキスト自体の色です。ただし、その情報を取得する方法が見つからないようです。
PDFBox を使用してドキュメントの色情報を取得することはまったく可能ですか?
どうもありがとう。
すべての色情報はクラスに保存する必要がPDGraphicsState
あり、使用される色 (ストローク/非ストロークなど) は、使用されるテキスト レンダリング モード(pdfbox メーリング リスト経由) によって異なります。
ここに私が試した小さなサンプルがあります:
1行だけのpdfを作成した後(「Sample」と書かれてRGB=[146,208,80]
います)、次のプログラムが出力されます。
デバイスRGB 146.115 208.08 80.07
コードは次のとおりです。
PDDocument doc = null;
try {
doc = PDDocument.load("C:/Path/To/Pdf/Sample.pdf");
PDFStreamEngine engine = new PDFStreamEngine(ResourceLoader.loadProperties("org/apache/pdfbox/resources/PageDrawer.properties"));
PDPage page = (PDPage)doc.getDocumentCatalog().getAllPages().get(0);
engine.processStream(page, page.findResources(), page.getContents().getStream());
PDGraphicsState graphicState = engine.getGraphicsState();
System.out.println(graphicState.getStrokingColor().getColorSpace().getName());
float colorSpaceValues[] = graphicState.getStrokingColor().getColorSpaceValue();
for (float c : colorSpaceValues) {
System.out.println(c * 255);
}
}
finally {
if (doc != null) {
doc.close();
}
PageDrawer.properties
PDF 演算子が Java クラスにどのようにマップされるかを確認するには、 を参照してください。
私が理解しているようにPDFStreamEngine
、ページストリームを処理すると、現在処理している演算子に応じてさまざまな変数の状態が設定されます。そのため、緑色のテキストにヒットすると、適切な演算子に遭遇するため、PDGraphicsState が変更されます。そのため、ファイル内のマッピングで定義されCS
ているように呼び出します。などにマッピングされます。org.apache.pdfbox.util.operator.SetStrokingColorSpace
CS=org.apache.pdfbox.util.operator.SetStrokingColorSpace
.properties
RG
org.apache.pdfbox.util.operator.SetStrokingRGBColor
この場合、PDGraphicsState
ドキュメントにはテキストのみがあり、テキストのスタイルは 1 つだけであるため、 は変更されていません。より高度なものについては、色が変化したときに何かを行うためにPDFStreamEngine
( や他のクラスと同様PageDrawer
に)拡張する必要があります。PDFTextStripper
独自のマッピングを独自の.properties
ファイルに書き込むこともできます。