这是一个简单的代码:
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();
现在矩形不可见。为什么?
答案 0 :(得分:3)
PdfContentByte
上的Rectangle()
方法有两个重载,根据您传入的内容,它们的行为完全不同。
你的第一个例子是使用非常简单的重载,只需要4个浮点数。如果您查看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()
实际上是不正确的,因为此重载会为您处理(实际上可能已多次执行此操作。)
答案 1 :(得分:1)
(@Chris回答的附录)
如果您想使用第一个示例的简单方法实现任务(设置其边框宽度),您可以明确地将线条宽度设置为笔划:
cb.SetLineWidth(5);
cb.Rectangle(200, 200, 100, 100);
cb.Stroke();
您可能希望将这些行包裹在cb.SaveState() ... cb.RestoreState()
中,以防止更改的线宽影响以后的操作。
答案 2 :(得分:0)
Document document = new Document(PageSize.A4, 25, 25, 30, 30);
PdfContentByte cb = writer.DirectContent;
cb.Rectangle(30,660, 280,80);
cb.Stroke();
函数编写器开始用pdf编写,矩形函数是创建矩形,笔画是绘制上面的矩形规范。所以你必须编写stroke()函数。
答案 3 :(得分:-1)
product