我试图添加一个页眉或页脚在一个pdf文档中的网页。这在iTextInAction书中解释为向页面添加直接内容的正确方法。但是,当我试图在Adobe中打开这个文档时,我会得到以下错误,并且还会有一些打印问题。有什么想法吗?

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发布于 2014-09-02 19:54:48
你的问题可能是这句话:
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__。)
https://stackoverflow.com/questions/25630089
复制相似问题