我正在使用 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 进行了测试。