在结构化的iText(夏普)文档中绘制图形对象(框和线)(章节和章节)

时间:2015-12-10 19:15:42

标签: itextsharp itext

我正在使用iTextSharp创建PDF文档,我正在做的是在ac#List<Chapter>中生成我的所有内容,其中章节包含一个或多个章节,而章节则没有尚未添加到文档中。然后我通过我的List<Chapter>枚举在文档的开头生成一个目录,然后在我的TOC之后将章节添加到文档中。

当我的Sections包含文本和图像时,这很有用,但现在我需要生成一个包含框和行的Section。我不想将我的方框和线条绘制成图像并将图像放入剖面中,这看起来不像我有实际的PDF框和线条那样好。

包含图形元素的Sections可以与包含文本的Sections混合在一起,所以我需要一种方法来向Section添加某种元素,使得该图形部分就像文本一样工作只在必要时进入新页面

最好的方法是什么?我觉得它有点涉及PdfTemplates但我不确定如何。或者我可能需要创建一个PdfPTable并在IPdfPCellEvent中创建我的图形元素?

1 个答案:

答案 0 :(得分:2)

当您想要涉及PdfTemplate元素时,您走在正确的轨道上。 PdfTemplate是一个iText对象,与PDF规范中 Form XObjects 的概念相对应。我们选择了另一个名称,因为 Form 这个词有点误导(人们会把它与表单字段,交互式表单等混淆)。

PDF中页面的内容流是一系列PDF语法,由操作数和运算符组成。 XObject是此内容流外部的对象。 XObject的内容只存储在PDF文档中一次,但可以在同一页面,不同页面上多次重复使用。

有不同类型的XObject,但 Image XObjects Form XObjects 是最重要的。

  • 我们使用光栅图像时会使用图像XObjects。当你写作时,你是绝对正确的:*“我不想将我的盒子和线条绘制成图像并将图像放入截面中,这看起来不像我有实际的PDF框和线条那样好。”
  • 当我们想要重用PDF语法时,使用表单XObjects。这就是您所需要的:您想要定义moveTo()lineTo()curveTo()stroke()fill(),...操作,并且您想要这些行和形状存储为矢量数据。

问题的解决方案是将线条和形状绘制到PdfTemplate对象,并将PdfTemplate对象包装在Image对象中。将Image对象添加到SectionChapter时,它将添加为表单XObject 。您不必将它降级为光栅图像。

您可以在官方网站上找到此技术的一些示例。例如在问题的答案中 How to generate 2D barcode as vector image?

在这里,我们使用条形码创建PdfTemplate,然后将其作为Image对象返回。屏幕截图显示了生成的PDF的内部结果,证明条形码已添加为矢量图像。

public Image createBarcode(PdfContentByte cb, String text,
    float mh, float mw) throws BadElementException {
    BarcodePDF417 pf = new BarcodePDF417();
    pf.setText("BarcodePDF417 barcode");
    Rectangle size = pf.getBarcodeSize();
    PdfTemplate template = cb.createTemplate(
        mw * size.getWidth(), mh * size.getHeight());
    pf.placeBarcode(template, BaseColor.BLACK, mh, mw);
    return Image.getInstance(template);
}

要创建PdfTemplate对象,您需要PdfContentByte个实例(例如使用writer.getDirectContent())并使用createTemplate()方法传递宽度和高度作为参数。然后,您将内容绘制到PdfTemplate并使用Image将其转换为Image.getInstance()对象。

您可以在Absolute positioning of lines and shapes章节以及本书Chapter 3Chapter 14的示例部分找到有关绘画线条和形状的更多信息。