这是一个简单的代码:
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();
现在矩形不可见。为什么?
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;
实际上是不正确的,因为此重载会为您解决这个问题(实际上可能已经执行了不止一次。)]
(@ Chris的附录)
cb.SaveState() ... cb.RestoreState()
Document document = new Document(PageSize.A4, 25, 25, 30, 30);
PdfContentByte cb = writer.DirectContent;
cb.Rectangle(30,660, 280,80);
cb.Stroke();