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 を使用してテストしました。