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

问题描述 投票:0回答:4

这是一个简单的代码:

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);

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

cb.Rectangle(200, 200, 100, 100);
cb.Stroke();

然后我看到了矩形。但是我需要设置其边框宽度,所以我这样做

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

 cb.Rectangle(rect);
 cb.Stroke();

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

c# itextsharp
4个回答
3
投票

Rectangle()上的PdfContentByte方法有几个重载,并且它们的行为根据传递的内容而有很大不同。

您的第一个示例使用的是非常简单的重载,仅需4个浮点数。如果查看PdfContentByte,您会发现,除了进行一些合理性检查之外,它只是将这些坐标直接写入PDF流,并且在此过程中未创建任何实际的source for that对象。稍后,当您调用Rectangle时,iText将stroke命令写入流中,仅此而已。当PDF渲染器(如Adobe的)实际解析一下stroke命令时,它会在缓冲区中向后看,并看到它需要描出的坐标并执行操作。

您的第二个示例使用了更为复杂的重载,您可以通过Stroke()来获取实际的see here对象。除了表示空间中的四个点外,Rectangle还具有诸如背景色和边框之类的概念,对于您而言最重要的是,这些边框可以绘制为[[per side和您需要告诉它绘制在哪一边

例如,您只需要左右移动:

Rectangle

对于所有边界,您都将其更改为:

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);

此外,在调用此重载时,在之后立即调用rect.Border = iTextSharp.text.Rectangle.BOX;
实际上是不正确的,因为此重载会为您解决这个问题(实际上可能已经执行了不止一次。)]

1
投票

(@ Chris的附录)


0
投票
cb.SaveState() ... cb.RestoreState()

-1
投票
Document document = new Document(PageSize.A4, 25, 25, 30, 30); PdfContentByte cb = writer.DirectContent; cb.Rectangle(30,660, 280,80); cb.Stroke();
© www.soinside.com 2019 - 2024. All rights reserved.