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

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

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

最佳答案

PdfContentByte 上的 Rectangle() 方法有几个重载,它们的行为完全不同,具体取决于您传入的内容。

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

您的第二个示例使用了更复杂的重载,您可以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/

相关文章:

c# - 编写代码以遍历数组所有元素的最快方法

c# - Dotnet CORE 3.1 - 访问关联项目库中的嵌入式资源(文件)

c# - C#.NET 中 iTextSharp 中的自定义页面大小

c# - 如何从 WPF 窗口创建缩略图并将其转换为 bytes[] 以便我可以保留它?

c# - Nuget 不为弱命名程序集生成绑定(bind)重定向

c# - 生成 PDF 时无法获取捷克语字符

c# - 在 PDF 上添加签名图像而不使用 iTextSharp 对其进行数字签名

c# - 如何在pdf文件中查找空白页

c# - 如何使用 OpenXML 在 Excel 中读取指定范围

image - 使用/CCITTFaxDecode过滤器从PDF中提取图像