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

时间:2016-03-23 11:51:38

标签: 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);

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

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

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

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

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

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

4 个答案:

答案 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