iTextSharp - 绘制矩形 - 边框宽度问题

Ton*_*ony 3 c# itextsharp

这是一个简单的代码:

var w = Utilities.MillimetersToPoints(420);
var h = Utilities.MillimetersToPoints(210);

var doc1 = new Document(new Rectangle(w, h));

PdfWriter writer = PdfWriter.GetInstance(doc1, new FileStream("Doc1.pdf", FileMode.Create));

doc1.Open();

PdfContentByte cb = writer.DirectContent;

var rect = new Rectangle(200, 200, 100, 100);
Run Code Online (Sandbox Code Playgroud)

现在,如果我执行以下操作:

cb.Rectangle(200, 200, 100, 100);
cb.Stroke();
Run Code Online (Sandbox Code Playgroud)

然后我看到了矩形。但我需要设置它的边框宽度,所以我做

 rect.BorderWidth = 5;
 rect.BorderColor = new BaseColor(0,0,0);

 cb.Rectangle(rect);
 cb.Stroke();
Run Code Online (Sandbox Code Playgroud)

现在矩形不可见。为什么 ?

Chr*_*aas 5

Rectangle()on的方法PdfContentByte有几个重载,它们的行为完全不同,具体取决于您传入的内容。

您的第一个示例是使用仅需要 4 个浮点数的非常简单的重载。如果您查看源代码,您会发现除了一些完整性检查之外,它只是将这些坐标直接写入 PDF 流,并且Rectangle在此过程中没有创建实际对象。稍后当你打电话时Stroke()iText 时,会将笔划命令写入流,仅此而已。当 PDF 渲染器(如 Adob​​e 的)实际解析笔画命令时,它会在缓冲区中向后查看,并查看需要笔画和执行动作的坐标。

您的第二个示例使用了更复杂的重载,您可以在此处看到它采用实际Rectangle对象。除了表示空间中的四个点之外,aRectangle还具有背景颜色和边界等概念,对您来说最重要的是,这些边界可以每边绘制,您需要告诉它要在哪一边绘制

例如,对于左右,你会这样做:

var rect = new iTextSharp.text.Rectangle(200, 200, 100, 100);
rect.Border = iTextSharp.text.Rectangle.LEFT_BORDER | iTextSharp.text.Rectangle.RIGHT_BORDER; 
rect.BorderWidth = 5;
rect.BorderColor = new BaseColor(0, 0, 0);
cb.Rectangle(rect);
Run Code Online (Sandbox Code Playgroud)

对于所有边框,您可以将其更改为:

rect.Border = iTextSharp.text.Rectangle.BOX;
Run Code Online (Sandbox Code Playgroud)

此外,在调用此重载时,在Stroke()之后立即调用实际上是不正确的,因为此重载会为您处理此问题(并且实际上可能已经不止一次这样做了。)