这是一个简单的代码:
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();
现在矩形不可见了。为什么?
最佳答案
PdfContentByte
上的 Rectangle()
方法有几个重载,它们的行为完全不同,具体取决于您传入的内容。
您的第一个示例是使用仅需要 4 个 float 的非常简单的重载。如果您查看 source for that您会发现,除了一些合理性检查之外,它只是将这些坐标直接写入 PDF 流,并且在此过程中没有创建实际的 Rectangle
对象。稍后当您调用 Stroke()
时,iText 会将笔划命令写入流,仅此而已。当 PDF 渲染器(如 Adobe 的)实际解析描边命令时,它会在缓冲区中向后查看并查看它需要描边的坐标并执行操作。
您的第二个示例使用了更复杂的重载,您可以see here它需要一个实际的 Rectangle
对象。 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;
此外,在调用此重载时,在之后立即调用 Stroke()
实际上是不正确的,因为此重载会为您处理该重载(实际上可能已经完成了不止一次。)
关于c# - iTextSharp - 绘制矩形 - 边框宽度问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36177432/