1

iTextSharp を使用して PDF ファイルを生成しています。を実行した後、クリッピング パスが失われ、それ以上の描画がクリッピングされないという問題が発生しましたSaveState()RestoreState()Clip()

それが iText/iTextSharp のバグなのか、それとも間違ったことをしているのかはわかりません。以下は、サンプルの c# コードです。

using (var fileStream = System.IO.File.OpenWrite(@"Problem.PDF"))
{
    var doc = new iTextSharp.text.Document();
    var writer = iTextSharp.text.pdf.PdfWriter.GetInstance(doc, fileStream);

    doc.Open();

    var content = writer.DirectContent;

    // Stroke where the blue box will be drawn
    content.NewPath();
    content.MoveTo(250, 250);
    content.LineTo(250, 350);
    content.LineTo(350, 350);
    content.LineTo(350, 250);
    content.LineTo(250, 250);
    content.SetRGBColorStroke(0, 0, 255);
    content.Stroke();

    // Stroke where the red box will be drawn
    content.NewPath();
    content.MoveTo(250, 150);
    content.LineTo(250, 250);
    content.LineTo(350, 250);
    content.LineTo(350, 150);
    content.LineTo(250, 150);
    content.SetRGBColorStroke(255, 0, 0);
    content.Stroke();

    // Set the clipping box
    content.NewPath();
    content.MoveTo(200, 200);
    content.LineTo(200, 300);
    content.LineTo(300, 300);
    content.LineTo(300, 200);
    content.LineTo(200, 200);
    content.Clip();

    // Save state, then fill the blue box (will be clipped)
    content.SaveState();

    content.NewPath();
    content.MoveTo(250, 250);
    content.LineTo(250, 350);
    content.LineTo(350, 350);
    content.LineTo(350, 250);
    content.LineTo(250, 250);
    content.SetRGBColorFill(0, 0, 255);
    content.Fill();

    // Restore state
    content.RestoreState();

    // Save state again, then fill the red box (will not be clipped... why not?)
    content.SaveState();

    content.NewPath();
    content.MoveTo(250, 150);
    content.LineTo(250, 250);
    content.LineTo(350, 250);
    content.LineTo(350, 150);
    content.LineTo(250, 150);
    content.SetRGBColorFill(255, 0, 0);
    content.Fill();

    content.RestoreState();

    doc.Close();
}

上記のコードでは、クリッピングされたボックスが描画される場所を示すために赤いボックスと青いボックスをストロークしています (検証用)。それらのストロークされたボックスはクリッピングされるべきではありません。塗りつぶされた青いボックスは正しく切り取られています。 赤く塗りつぶされたボックスは切り取られていませんが、私の理解ではそうです。

ClosePath()結果に変更を加えることなく、さまざまなパス (クリッピング、塗りつぶし、ストロークなど) に追加しました。

さまざまな gstate 値 (不透明度、ブレンド モードなど) の設定のために、SaveState()/RestoreState()後で行う必要があります。Clip()

iTextSharp 5.5.3 と LGPL バージョン 4.1.6 を使用してテストしました。

4

2 に答える 2

1

問題は、NewPath()「新しいパスを描き始めたいのですが、これが私の座標です」という意味だと考えていることです。代わりに、「パスの描画が完了しました。それ以降のオペレーターは新しいパスを開始する必要があります。または仕様から:

塗りつぶしたりストロークしたりせずに、パス オブジェクトを終了します。この演算子は、主に現在のクリッピング パスを変更する副作用のために使用される、パス ペインティングの no-op でなければなりません (8.5.4、「クリッピング パス演算子」を参照してください)。

NewPath()最も必要とされ、呼び出された直後のものを除いて、ほとんどすべての呼び出しを取り除くことができますClip()

content.Clip();
content.NewPath();
于 2013-04-24T13:37:53.200 に答える