【问题标题】:iTextSharp PdfStamper add Header/FooteriTextSharp PdfStamper 添加页眉/页脚
【发布时间】:2014-09-02 18:39:22
【问题描述】:

我正在尝试向 pdf 文档中的页面添加页眉或页脚。这在 iTextInAction 书中被解释为向页面添加直接内容的正确方法。但是,当我尝试在 Adob​​e 中打开此文档时,出现以下错误,并且在打印时也遇到了一些问题。有什么想法吗?

Dim reader As PdfReader = Nothing
Dim stamper As PdfStamper = Nothing
Try
   reader = New PdfReader(inputFile)
   stamper = New PdfStamper(reader, New IO.FileStream(outputFile, IO.FileMode.Append))
Dim fontSz As Single = 10.0F
Dim font As New Font(font.FontFamily.HELVETICA, fontSz, 1, BaseColor.GRAY)
Dim chunk As New Chunk(headerText, font)
Dim rect As Rectangle = reader.GetPageSizeWithRotation(1)

这里我只是调整文本的大小以确保它适合页面边界

While chunk.GetWidthPoint() > rect.Width
  fontSz -= 1.0F
  font = New Font(font.FontFamily.HELVETICA, fontSz, 1, BaseColor.GRAY)
  chunk = New Chunk(wm.ToString(), font)
End While

这是我获得过多内容并将文本添加到其中的地方

For pageNo As Int32 = 1 To reader.NumberOfPages
  Dim phrase As New Phrase(chunk)
  Dim x As Single = (rect.Width / 2) - (phrase.Chunks(0).GetWidthPoint() / 2)
  Dim y As Single = If(wm.WatermarkPosition = "Header", rect.Height - font.Size, 1.0F)
  Dim canvas As PdfContentByte = stamper.GetOverContent(pageNo)
  canvas.BeginText()
  ColumnText.ShowTextAligned(canvas, Element.ALIGN_LEFT, phrase, x, y, 0)
  canvas.EndText()
Next
Catch ex As iTextSharp.text.pdf.BadPasswordException
  Throw New InvalidOperationException("Page extraction is not supported for this pdf document. It must be allowed in order to add a watermark.")
Finally
  reader.Close()
  stamper.Close()
End Try

【问题讨论】:

    标签: vb.net itextsharp


    【解决方案1】:

    你的问题可能是这一行:

    stamper = New PdfStamper(reader, New IO.FileStream(outputFile, IO.FileMode.Append))
    

    您告诉 .Net 以附加模式将内容写入文件。如果该文件不存在,则它会创建该文件,但随后的写入将最终生成损坏的 PDF。你应该把它改成IO.FileMode.Create

    此外,当您使用它时,我通常建议您更明确地创建 FileStream,并告诉 .Net(以及 Windows)您对流的进一步打算。在这种情况下,你只会写信给它,你可以说FileAccess.Write,当你写它时,你要确保没有其他人试图读取它(因为它会处于无效状态)所以你可以说FileShare.None

    stamper = New PdfStamper(reader, New FileStream(outputFile, FileMode.Create, FileAccess.Write, FileShare.None))
    

    (顺便说一句,虽然使用IO.FileMode.Create 绝对有效,但看到它真的很奇怪。大多数人要么拼写为System.IO.FileMode.Create,要么他们拼写为import System.IO,然后只有我们FileMode.Create。)

    【讨论】:

      猜你喜欢
      • 2020-07-23
      • 2013-09-30
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 2015-03-04
      • 2016-04-30
      • 2010-12-03
      • 1970-01-01
      相关资源
      最近更新 更多