ITextSharp include all pages from the input file

2019-09-06 16:47发布

问题:

I used the following code by using itextsharp library to add text to a pdf.(got the code from link ITextSharp insert text to an existing pdf

    Dim reader As New PdfReader(oldFile)
    Dim size As iTextSharp.text.Rectangle = reader.GetPageSizeWithRotation(1)
    Dim document As New iTextSharp.text.Document(size)

    ' open the writer
    Dim fs As New FileStream(newFile, FileMode.Create, FileAccess.Write)
    Dim writer As PdfWriter = PdfWriter.GetInstance(document, fs)
    document.Open()

    ' the pdf content
    Dim cb As PdfContentByte = writer.DirectContent

    ' select the font properties
    Dim bf As BaseFont = BaseFont.CreateFont(BaseFont.ZAPFDINGBATS, BaseFont.CP1252, BaseFont.NOT_EMBEDDED)
    'cb.SetColorFill(GrayColor.DARK_GRAY)
    cb.SetFontAndSize(bf, 8)
    cb.BeginText()
    Dim Text As String = "l"
    ' put the alignment and coordinates here
    cb.ShowTextAligned(2, Text, 84, 729, 0)
    cb.EndText()

    Dim bf1 As BaseFont = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED)
    cb.SetFontAndSize(bf1, 8)
    cb.BeginText()
    Dim text1 As String = "Navaneeth A"
    cb.ShowTextAligned(1, text1, 65, 690, 0)
    cb.EndText()

    ' create the new page and add it to the pdf
    Dim page As PdfImportedPage = writer.GetImportedPage(reader, 1)
    cb.AddTemplate(page, 0, 0)

    ' close the streams and voilá the file should be changed :)
    document.Close()
    fs.Close()
    writer.Close()
    reader.Close()

Now the problem is source pdf has about 5 pages.But the output file generated by this code has only first page. So How can i include all pages of source file in output file? Source pdf link is http://law.incometaxindia.gov.in/DITTaxmann/IncomeTaxRules/PDF/Ay-2012-2013/SAHAJ2012_14.pdf


 Dim reader As New PdfReader(oldFile)
    Using ms = New MemoryStream()
        Dim stamper As New PdfStamper(reader, ms)
        'Using stamper  'As New PdfStamper(reader, ms)
        stamper.RotateContents = False
        Dim canvas As PdfContentByte = stamper.GetOverContent(1)
        ColumnText.ShowTextAligned(canvas, Element.ALIGN_LEFT, New Phrase("Hello people!"), 36, 540, 0)
        'End Using

        Dim result As Byte() = ms.ToArray()
        File.WriteAllBytes(newFile, result)
        System.Diagnostics.Process.Start(newFile)
    End Using

I did the following changes,but its not working.result file was just a 1kb file.

回答1:

You unfortunately found sample code that should not be used. To manipulate existing PDFs you should use a PdfStamper, not a PdfWriter.

Your code (even after correction to copy all pages) does not copy interactive features (forms, other annotations...). You should instead base your code on the Webified iTextSharp Example StampText.cs explained in chapter 6 of iText in Action — 2nd Edition:

PdfReader reader = new PdfReader(resource);
using (var ms = new MemoryStream()) {
  using (PdfStamper stamper = new PdfStamper(reader, ms)) {
    stamper.RotateContents = false;
    PdfContentByte canvas = stamper.GetOverContent(1);
    ColumnText.ShowTextAligned(
      canvas,
      Element.ALIGN_LEFT, 
      new Phrase("Hello people!"), 
      36, 540, 0
    );
  }
  byte[] result = ms.ToArray();
}    

You can control font and color, too, if you change that code like this:

[...]
Font FONT = new Font(Font.FontFamily.HELVETICA, 12, Font.BOLD, new GrayColor(0.75f));
PdfContentByte canvas = stamper.GetOverContent(1);
ColumnText.ShowTextAligned(
  canvas,
  Element.ALIGN_LEFT, 
  new Phrase("Hello people!", FONT), 
  36, 540, 0
);
[...]

PS Some details may vary if you for some reasons have to use some old iTextSharp version (other questions from you seem to imply that you use VB6...). Even then, though, you should switch to using PdfStamper.