如何使用iText在每个页面上添加总页数?

tru*_*nkc 22 java itext

如何使用iText在每个页面上添加总页数?

pax*_*blo 11

  1. 使用虚拟页面计数将输出从a PdfWriter处理为bytestream第一个.
  2. PdfReader从中创建一个bytestream,调用PdfReader.getNumberOfPages以获取实际的页数.
  3. 重新创建PDF输出,知道页数是多少,相应地更改页脚.

这很麻烦,但没有简单的方法可以在没有两遍方法的情况下知道页数.有关操作PDF的详细信息,请参阅示例代码.

  • 对于使用 PDF 阅读器,必须关闭文档,否则它会给 PDF 标题而不是例外。所以在每个页脚中使用它,文档需要打开以写入每个页脚。 (2认同)

小智 8

你可以创建一个继承的类,PdfPageEventHelper 然后覆盖这两个函数,如下所示:

Imports System.Collections.Generic
Imports System.Text

Imports iTextSharp.text.pdf
Imports iTextSharp.text

Namespace PDF_EnteteEtPiedDePage
    Public Class EnteteEtPiedDePage
        Inherits PdfPageEventHelper
        ' This is the contentbyte object of the writer
        Private cb As PdfContentByte

        ' we will put the final number of pages in a template
        Private template As PdfTemplate

        ' this is the BaseFont we are going to use for the header / footer
        Private bf As BaseFont = Nothing

        ' This keeps track of the creation time
        Private PrintTime As DateTime = DateTime.Now

        ' we override the onOpenDocument method
        Public Overrides Sub OnOpenDocument(writer As PdfWriter, document As Document)
            Try
                PrintTime = DateTime.Now
                bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED)
                cb = writer.DirectContent
                template = cb.CreateTemplate(50, 50)
            Catch de As DocumentException
            Catch ioe As System.IO.IOException
            End Try
        End Sub

        Public Overrides Sub OnStartPage(writer As PdfWriter, document As Document)
            MyBase.OnStartPage(writer, document)

            Dim pageSize As Rectangle = document.PageSize

        End Sub

        Public Overrides Sub OnEndPage(writer As PdfWriter, document As Document)
            MyBase.OnEndPage(writer, document)

            Dim pageN As Integer = writer.PageNumber
            Dim text As [String] = "Page " & pageN & " de "
            Dim len As Single = bf.GetWidthPoint(text, 8)

            Dim pageSize As Rectangle = document.PageSize

            cb.SetRGBColorFill(100, 100, 100)

            cb.BeginText()
            cb.SetFontAndSize(bf, 8)
            cb.SetTextMatrix(pageSize.GetLeft(40), pageSize.GetBottom(30))
            cb.ShowText(text)
            cb.EndText()

            cb.AddTemplate(template, pageSize.GetLeft(40) + len, pageSize.GetBottom(30))

            cb.BeginText()
            cb.SetFontAndSize(bf, 8)
            cb.ShowTextAligned(PdfContentByte.ALIGN_RIGHT, "Imprimé le : " & PrintTime.ToShortDateString() & " à " & PrintTime.ToShortTimeString, pageSize.GetRight(40), pageSize.GetBottom(30), 0)
            cb.EndText()
        End Sub

        Public Overrides Sub OnCloseDocument(writer As PdfWriter, document As Document)
            MyBase.OnCloseDocument(writer, document)

            template.BeginText()
            template.SetFontAndSize(bf, 8)
            template.SetTextMatrix(0, 0)
            template.ShowText("" & Convert.ToString((writer.PageNumber - 1)))
            template.EndText()
        End Sub

    End Class
End Namespace
Run Code Online (Sandbox Code Playgroud)

然后在那之后设置你pdfwriter PageEvent 喜欢的值:

Dim PageEventHandler = New EnteteEtPiedDePage()
            aPdfWriter.PageEvent = PageEventHandler
Run Code Online (Sandbox Code Playgroud)

  • 这不是 java 代码,问题被标记为 [java]。无论如何,很有帮助。 (2认同)

Dan*_*n J 6

不再搜索,这是解决方案.如果他们删除此链接,我会将代码发布到我的网站并托管链接.

iText页码示例