【问题标题】:iTextSharp - draw rectangle - border width issueiTextSharp - 绘制矩形 - 边框宽度问题
【发布时间】:2019-11-27 00:16:18
【问题描述】:

这是一个简单的代码:

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

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

【问题讨论】:

  • 克里斯和我的回答能回答你的问题吗?

标签: c# itextsharp


【解决方案1】:

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

您的第一个示例是使用仅需要 4 个浮点数的非常简单的重载。如果您查看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() 实际上是不正确的,因为此重载会为您处理(实际上可能不止一次这样做。)

【讨论】:

    【解决方案2】:

    (@Chris 回答的附录)

    如果你想用第一个例子的简单方法来实现你的任务(设置它的边框宽度),你可以显式地设置线条的宽度为笔划:

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

    您可能希望将这些行包含在cb.SaveState() ... cb.RestoreState() 中,以防止更改的行宽影响以后的操作。

    【讨论】:

      【解决方案3】:
      Document document = new Document(PageSize.A4, 25, 25, 30, 30);
      PdfContentByte cb = writer.DirectContent;
              cb.Rectangle(30,660, 280,80);
       cb.Stroke();
      

      函数 writer 开始在 pdf 中写入, rectangle 函数是创建矩形,而 stroke 是在矩形规范之上绘制。所以你必须编写 stroke() 函数。

      【讨论】:

        【解决方案4】:
         PdfContentByte cb = pdfwrite.DirectContent;
         var Rectangular = new Rectangle(55, 620, 540,375);
         Rectangular.BorderWidthLeft = 0.1f;
         Rectangular.BorderWidthRight = 0.1f;
         Rectangular.BorderWidthTop = 0.1f;
         Rectangular.BorderWidthBottom = 0.1f;
         cb.Rectangle(Rectangular);
         cb.Stroke();
        

        【讨论】:

        • 嗨,欢迎来到 StackOverflow,虽然这可以为这个问题提供一个有效的答案,但一段简单的代码需要一些解释,说明您添加/更改的内容以及为什么被认为对可能结束的其他人有用在这里遇到类似的问题。请添加一些细节,我很乐意收回我的反对票!如果您还没有,也可以使用the tour
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-27
        • 1970-01-01
        • 1970-01-01
        • 2010-12-29
        • 2010-10-12
        • 1970-01-01
        • 2020-09-09
        相关资源
        最近更新 更多