是否可以使用iTextSharp在边距中打印?

时间:2012-03-05 20:38:44

标签: c# .net pdf itext

我正在编写一个输出PDF的Web应用程序。我的PDF的主要内容是表格数据。我想在表格左侧和右侧的边缘显示一条消息。

考虑到该表可能跨越多个页面,我该怎么做呢?

1 个答案:

答案 0 :(得分:1)

最简单的方法是使用Page Events。要使用Page Events,您需要继承PdfPageEventHelper

Public Class CustomPageEventHandler
    Inherits iTextSharp.text.pdf.PdfPageEventHelper
End Class

父类有一堆你可以覆盖的方法,你可能需要的方法是OnStartPage()。通过覆盖它,将为文档中的每个页面调用自定义代码。

Public Class CustomPageEventHandler
    Inherits iTextSharp.text.pdf.PdfPageEventHelper
    Public Overrides Sub OnStartPage(writer As iTextSharp.text.pdf.PdfWriter, document As iTextSharp.text.Document)
        ''//Anything you do here will be done on every page
    End Sub
End Class

要将自定义页面事件处理程序绑定到名为PdfWriter的{​​{1}}对象,您只需执行以下操作:

writer

关于在writer.PageEvent = New CustomPageEventHandler() 方法中做什么,你有几个选择。不幸的是,使用OnStartPage()对象本身可能会有问题。该对象是用于处理更高级别概念的抽象,但并不总是提供在特定x,y坐标处执行操作的方法。在这里使用文本只会导致文本奇怪地流动。

相反,您需要使用原始Document对象,您可以从PdfContentByte的{​​{1}}属性中获取该对象。

writer

有了这个,你有几个选择,我会告诉你两个。第一种是使用DirectContent对象,您可以将其视为一个表。事实上,大多数人将它用作单行单列表。 Dim cb = writer.DirectContent 对象很不错,因为它允许您使用更高级别的抽象,例如ColumnText,它会自动处理换行符等事情。

ColumnText

第二种选择是自己绘制文本。最大的缺点是你无法使用像Paragraph这样的更高级别的抽象。因此,如果您绘制一个非常长的文本行,它将不会破坏它并为您开始一个新行,它将继续在可查看文档之外绘制。

Dim CT As New ColumnText(writer.DirectContent)
CT.SetSimpleColumn(llx, lly, urx, ury) ''//Coordinates to draw text to
CT.AddElement(New Paragraph("This goes in the margin"))
CT.Go()

总而言之,下面是一个完整的VB.Net 2010 WinForm应用程序,目标是iTextSharp 5.1.2.0,它展示了上述所有内容。有关具体详细信息,请参阅代码中的注释。

Paragraph
相关问题