私は Itext を使用していますが、PDF 内の特定のタイトルのフォントの色を抽出する必要があります。これを行う方法について何か考えはありますか?
2 に答える
過去 6 か月間 iTextSharp (iText の .NET ポート) を使用した後、目的を達成する方法を説明しようと思います。これは正確な答えではありませんが、それを達成するために追加の宿題を行うことができる場所にあなたを導く可能性は十分にあります.
PDF 形式はメモリ内の「グラフィックス状態」を保持します。これは、現在の色、ペンの太さ、線のスタイルなどを指定する値のセットです。すべてのレンダリング操作 (テキストのレンダリングを含む) は、このグラフィックス状態を使用して、その操作がどのような出力を行うかを決定します。生産。たとえば、現在の色を青に設定して、数本の線を描くと、それらの線はすべて青になります。したがって、これらの線画操作ごとに線の色を指定する必要はありません。
色付けについては、グラフィックス状態に 2 つの変数があります。現在のストロークの色と現在の非ストロークの色です。ストローク カラーは、線や境界線などの 1 次元の描画に使用されます (GDI+ を使用している場合、これはおおまかに System.Drawing.Pen になります)。一方、非ストローク カラーは、塗りつぶし (in GDI+、System.Drawing.Brush)。グリフは 2D オブジェクトであるため、テキストの色付けは非ストローク カラーを使用して行われると私は考えています。
さて、理論的な部分がわかったので、次に行う必要があるのは次のとおりです。PdfContentStreamProcessor
iText ソース コードでクラスを見つけます。ここにはPopulateOperators()
、iText が現在解析できるすべての演算子が一覧表示されています。カラーリングに関連する演算子は非常に多く、ここではその詳細を要約することはできません (詳細については、PDF 仕様を参照してください) が、要するに、演算子CS
とcs
演算子は現在の色空間を設定します (RGB、グレースケール、CMYK、CMYK など、非常に多くの演算子がサポートされています)。 L*a*b など) とSC
とsc
現在のストローク カラーと非ストローク カラーを設定する演算子。ここでも、カラー スペースの設定と、現在のカラー スペースに照らしてストローク カラーと非ストローク カラーの値を解釈する方法について詳しく説明されています。PDF 仕様ドキュメントを参照してください。さらに、状況をさらに複雑にする可能性があるいくつかのプッシュおよびポップ グラフィックス状態操作があります。
つまり、、、、、、、、、、、、、およびを含む演算子CS
のサポートcs
を追加する必要があります。それらのほとんどは現時点で iTextSharp でサポートされていないため、それぞれに独自のクラスを作成する必要があります (インターフェイスを実装する)。G
g
RG
rg
K
k
SC
sc
SCN
scn
IContentOperator
ここから実装に関する多くのヘルプを得ることができます。この人はそれをすべて詳細に実装しているわけではありませんが (特に PDF がサポートするすべての色空間を処理するのは大変な作業になると思います)、これは非常に良い出発点になるはずです。
お役に立てれば。
PDF Clown (ネイティブの Java と .NET も同様) は、テキスト スタイル情報の抽出(テキストの色とテキストのレンダリング モードを含む) をサポートし、ほとんどすべてのグラフィック オペレーターをそのまま使用できます (コードベースの TextInfoExtractionSample を参照)。
このオープン ソース/フリー ソフトウェア ライブラリは、コンテンツの解析、コンテンツの抽出、コンテンツの編集、コンテンツのレンダリング、印刷などのさまざまなタスクを実行できる多用途のコンテンツ エンジン(ContentScanner クラスを参照) を備えています (最後の 1 つは現在部分的に開発されています)。
そのオブジェクト モデルは豊富でまとまりがあります(たった 2 つの基本クラスがすべてのロジックを管理します:プリミティブな低レベル PDF 型 (辞書、配列、数値など)のルートにあるPdfObject、特殊な高レベルのルートにあるPdfObjectWrapper )。 -レベルの PDF エンティティ (ページ、注釈、ブックマークなど) であり、公式の PDF 仕様を奇抜さなしにミラーリングします。
私はその開発者なので偏見があるかもしれませんが、試してみたい場合は、sourceforge.net の SVN リポジトリからチェックアウトすることをお勧めします。バージョン 0.1.2 (現在開発中) には多くの拡張機能が導入されているためです。最後のリリースについて。