我正在使用iTextSharp创建PDF文档,我正在做的是在ac#List<Chapter>
中生成我的所有内容,其中章节包含一个或多个章节,而章节则没有尚未添加到文档中。然后我通过我的List<Chapter>
枚举在文档的开头生成一个目录,然后在我的TOC之后将章节添加到文档中。
当我的Sections包含文本和图像时,这很有用,但现在我需要生成一个包含框和行的Section。我不想将我的方框和线条绘制成图像并将图像放入剖面中,这看起来不像我有实际的PDF框和线条那样好。
包含图形元素的Sections可以与包含文本的Sections混合在一起,所以我需要一种方法来向Section添加某种元素,使得该图形部分就像文本一样工作只在必要时进入新页面
最好的方法是什么?我觉得它有点涉及PdfTemplates但我不确定如何。或者我可能需要创建一个PdfPTable并在IPdfPCellEvent中创建我的图形元素?
答案 0 :(得分:2)
当您想要涉及PdfTemplate
元素时,您走在正确的轨道上。 PdfTemplate
是一个iText对象,与PDF规范中 Form XObjects 的概念相对应。我们选择了另一个名称,因为 Form 这个词有点误导(人们会把它与表单字段,交互式表单等混淆)。
PDF中页面的内容流是一系列PDF语法,由操作数和运算符组成。 XObject是此内容流外部的对象。 XObject的内容只存储在PDF文档中一次,但可以在同一页面,不同页面上多次重复使用。
有不同类型的XObject,但 Image XObjects 和 Form XObjects 是最重要的。
moveTo()
,lineTo()
,curveTo()
,stroke()
,fill()
,...操作,并且您想要这些行和形状存储为矢量数据。问题的解决方案是将线条和形状绘制到PdfTemplate
对象,并将PdfTemplate
对象包装在Image
对象中。将Image
对象添加到Section
或Chapter
时,它将添加为表单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 3和Chapter 14的示例部分找到有关绘画线条和形状的更多信息。