0

我通过使用 itextsharp 库将文本添加到 pdf 中使用了以下代码。(从链接ITextSharp 将代码插入到现有 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

我做了以下更改,但它不起作用.result 文件只是一个 1kb 文件。

4

1 回答 1

1

不幸的是,您发现了不应使用的示例代码。要操作现有的 PDF,您应该使用.PdfStamper而不是PdfWriter.

您的代码(即使在更正复制所有页面之后)不会复制交互式功能(表单、其他注释......)。相反,您应该将代码基于iText in Action — 第 2 版的第 6 章中解释的Webified iTextSharp Example StampText.cs

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.

于 2013-03-05T08:06:48.520 回答