2

私が使用する場合

PdfContentByte cb = writer.getDirectContent();
cb.setColorFill(new CMYKColor(c, m, y, k));

それは簡単です。ただし、Graphics2Dで自己を描画するSwingコンポーネントがいくつかあります。そのようなものを使用することは非常に説得力があります:

PdfContentByte cb = writer.getDirectContent();
Graphics2D g2 cb.createGraphics(w, h);
mySwingComponent.paint(g2);
g2.dispose();

正常に動作しますが、色は iText によって Java の sRGB から CMYK に変換されます。CMYKカラーで直接描きたい。Swingコンポーネントでそうしようとしています

MySwingComponent extends JComponenet {
    void paint(Graphics2D g2) {
        g.setColor(new com.lowagie.text.pdf.CMYKColor(0, 0, 0, 1));
    }
}

残念ながら、それは機能しません。どの CMYK カラーをペイントするかを正確に指定する方法はありますか?

PS私の問題の背景は、garyscaleで何かを描くと、Adobe IllustratorでPDFの色が(0、0、0、0.4)だけでなく、(0.1、0.15、0.2、0.4f)のようなることです。

UPD:私は今解決策を持っています: g2.setPaint(new CMYKColor(1f, 0.0f, 0.0f, 0.0f)); を使用するだけです あなたのペイント(Graphics2D g2)では、iTextにCMYK Pdfを強制的に生成させます

4

1 に答える 1

2

私はあなたの正確な問題を抱えていました。API をいじりましたが、最終的にソース コードを確認する必要がありました。私は2つの解決策を思いつきました。

最初の解決策は、必要に応じてソース コードを変更することです (結局のところ、それがフリー ソフトウェアの定義ではないでしょうか?)。ソース コードは、itextpdf-5.1.3-sources.jar ファイル (またはお持ちのライブラリの任意のバージョン) から抽出できます。CMYK/RGB の問題を引き起こしている行は、PdfGraphics2D.javaファイル (com/itextpdf/text/pdf/PdfGraphics2D.java)の1650 行目です。次のような行が表示されます。

cb.setColorFill(new BaseColor(color));

迅速で汚い修正が必要な場合は、その行を次のように変更するだけです。

cb.setColorFill(new CMYKColor(0f, 0f, 0f, 1f));

もちろん、これは 1 つの色に制限されますが、どの行が実際の色を処理しているかがわかったので、クラスを変更して機能/状態を追加できます (必要な場合)。追加する必要があります

import com.itextpdf.text.pdf.CMYKColor;

ファイルの先頭にも。NB Line 1650 は塗りつぶしを処理します。ストロークを実行している場合は、else ステートメントで同じことを変更するだけです (ファイルを見れば明らかです)。

ソースをコンパイルします。

javac -cp path/to/itextpdf-5.1.3.jar path/to/PdfGraphics2D.java

itextpdf-5.1.3-sources フォルダーのルートに移動し、jar を更新します。

jar uf path/to/itextpdf-5.1.3.jar com/itextpdf/text/pdf/PdfGraphics2D.class

以上です!PDF ファイルは、指定した CMYK 値を使用して色をレンダリングします。これは単純なものには最適ですが、より多くの機能が必要な場合は、PdfGraphics2D クラスをさらに変更する必要があります。drawGlyphVector メソッドを使用して、個人的にこれを使用して CMYK 黒フォントを描画していました。

2番目の解決策:

最初の解決策がうまくいかない場合は、いつでも PostScript を直接編集/解析できます。PDF を作成するメソッドでDocument.compress = false;、PdfWriter をインスタンス化した後に行を追加します。これで、PDF ファイルをテキスト エディターで表示できるようになりました。0 0 0 1 kこれらの行は色を設定しています 0 0 1 rg(それぞれ CMYK 黒と RGB 黒)。色の値の後の小文字 (float のようです) はfillを意味し、大文字はstrokeを意味します。CMYK0 0 0 1 Kの黒のストロークなども同様です。

PDFを1行ずつ読んで、基本的に「rg」で終わる行に対して「検索と置換」を(Javaで、もちろんプログラムで)行うことができます。それが理にかなっていることを願っています。これには余分なディスクの読み取りと書き込みが必要なため、それほど高速ではありません...

それが役立つことを願っています。

于 2012-01-21T11:16:57.480 に答える