问题
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
.
来源:https://stackoverflow.com/questions/15218126/itextsharp-include-all-pages-from-the-input-file