如何使用itextsharp为每个pdf页面添加页码

时间:2015-03-12 13:13:37

标签: c# pdf pdf-generation itextsharp

这里是我想要的,我希望将页码添加到我动态生成的每个pdf页面。

我在最终页面方法上使用但是即使我添加了文档底部边距也没有用。

我决定在从文件路径生成pdf之后添加页码。 这是我生成pdf的代码:

Document doc = new Document(iTextSharp.text.PageSize.LETTER, 10, 10, 42, 35);



            PdfWriter wri = PdfWriter.GetInstance(doc, new FileStream("t5.pdf", FileMode.Create));

            doc.Open();//Open Document to write

          iTextSharp.text.Font font8 = FontFactory.GetFont("ARIAL", 7);
            Paragraph paragraph = new Paragraph("Some content");
            doc.Add(paragraph);
                doc.Add(paragraph);// add paragraph to the document
                doc.Close();
                FileStream stream = File.OpenRead("t5.pdf");
                byte[] fileBytes = new byte[stream.Length];
                stream.Read(fileBytes, 0, fileBytes.Length);
                stream.Close();
                AddPageNumbers(fileBytes);
                using (Stream file = File.OpenWrite("t5.pdf")) 
                {
                    file.Write(fileBytes, 0, fileBytes.Length);
                }
            }

和她是我的添加页面编号方法:

MemoryStream ms = new MemoryStream();
        PdfReader reader = new PdfReader(pdf);
        int n = reader.NumberOfPages;
        iTextSharp.text.Rectangle psize = reader.GetPageSize(1);
        Document document = new Document(psize, 50, 50, 50, 50);
        PdfWriter writer = PdfWriter.GetInstance(document, ms);
        document.Open();
        PdfContentByte cb = writer.DirectContent;
        int p = 0;
        for (int page = 1; page <= reader.NumberOfPages; page++)
        {
            document.NewPage();
            p++;
            PdfImportedPage importedPage = writer.GetImportedPage(reader, page);
            cb.AddTemplate(importedPage, 0, 0);
            BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
            cb.BeginText();
            cb.SetFontAndSize(bf, 10);
            cb.ShowTextAligned(PdfContentByte.ALIGN_CENTER, +p + "/" + n, 100, 450, 0);
            cb.EndText();
        }
        document.Close();
        return ms.ToArray();

如何不将页码添加到pdf文档中,那么这里的替代方案是什么?我该怎么办。

1 个答案:

答案 0 :(得分:4)

对不起,讲座是第一位的。

在此处发布问题时,请仅发布尽可能少的代码。您的#34;创建一个包含多个页面的示例PDF&#34;是116行长。在其内部,您遇到了与问题100%无关的复杂PdfPTableDataTable逻辑。相反,以下13行足以制作多页PDF:

//Create a sample multiple page PDF and place it on the desktop
var outputFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "t5.pdf");
using (var fs = new FileStream(outputFile, FileMode.Create, FileAccess.Write, FileShare.None)) {
    using (var doc = new Document()) {
        using (var writer = PdfWriter.GetInstance(doc, fs)) {
            doc.Open();
            for (var i = 0; i < 1000; i++) {
                doc.Add(new Paragraph(String.Format("This is paragraph #{0}", i)));
            }
            doc.Close();
        }
    }
}

其次,摆脱try/catch。这些对于生产(有时)非常有用,但在开发层面,这就是为什么我们有IDE和编译器,他们会告诉我们具体的错误。

现在解决更大的问题,你需要让这两个进程彼此分开。必须关闭,完成和计算部件#1中的每个支撑和物体。然后需要为第2部分提供完全有效的PDF,但这两部分都不应该是&#34;意识到&#34;彼此依赖或相互依赖。

由于您只是borrowed某些code并非针对您尝试做的事情,我也会忽略它并使用一些{{ {3}}。此外,由于您首先要开放使用MemoryStream,因此在我需要之前,我将避免写入磁盘。下面是一个完整的工作示例,它创建一个多页面,然后在第二遍中添加页码。

//Will hold our PDF as a byte array
Byte[] bytes;

//Create a sample multiple page PDF, nothing special here
using (var ms = new MemoryStream()) {
    using (var doc = new Document()) {
        using (var writer = PdfWriter.GetInstance(doc, ms)) {
            doc.Open();
            for (var i = 0; i < 1000; i++) {
                doc.Add(new Paragraph(String.Format("This is paragraph #{0}", i)));
            }
            doc.Close();
        }
    }
    //Store our bytes before
    bytes = ms.ToArray();
}

//Read our sample PDF and apply page numbers
using (var reader = new PdfReader(bytes)) {
    using (var ms = new MemoryStream()) {
        using (var stamper = new PdfStamper(reader, ms)) {
            int PageCount = reader.NumberOfPages;
            for (int i = 1; i <= PageCount; i++) {
                ColumnText.ShowTextAligned(stamper.GetOverContent(i), Element.ALIGN_CENTER, new Phrase(String.Format("Page {0} of {1}", i, PageCount)), 100, 10 , 0);
            }
        }
        bytes = ms.ToArray();
    }
}

var outputFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "t5.pdf");
System.IO.File.WriteAllBytes(outputFile, bytes);