ITextSharp包含输入文件中的所有页面

时间:2013-03-05 07:31:22

标签: vb.net pdf adobe itextsharp itext

我使用以下代码使用itextsharp库将文本添加到pdf。(从链接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()

现在问题是源pdf有大约5页。但是这个代码生成的输出文件只有第一页。那么如何在输出文件中包含源文件的所有页面? 来源pdf链接为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

我做了以下更改,但它的work.result文件只是一个1kb的文件。

1 个答案:

答案 0 :(得分:1)

您遗憾地找到了不应使用的示例代码。要操纵现有PDF,您应该使用PdfStamper,而不是PdfWriter

您的代码(即使在修正后复制所有页面)也不会复制交互式功能(表单,其他注释......)。您应该将代码基于Webified iTextSharp ExampleStampText.cs中解释的chapter 6 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();
}    

如果你改变这样的代码,你也可以控制字体和颜色:

[...]
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 如果由于某些原因必须使用一些旧的iTextSharp版本,某些细节可能会有所不同(您的其他问题似乎暗示您使用的是VB6 ......)。但即便如此,您仍应切换到使用PdfStamper

相关问题