2014-09-02 4 views
0

Я пытаюсь добавить верхний или нижний колонтитул на страницы в PDF-документе. Это объясняется в книге iTextInAction как правильный способ добавления прямого контента на страницу. Однако, когда я пытаюсь открыть этот документ в Adobe, я получаю следующую ошибку и имею некоторые проблемы с печатью. Есть идеи?iTextSharp PdfStamper add Header/Footer

enter image description here

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 

Это где я получаю overcontent и добавить свой текст его

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 

ответ

2

У вас проблема, вероятно, эта строка:

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.)

Смежные вопросы