pdf压模,pdfEventHandler在尝试使用itext在pdf文档上添加页码时不起作用

时间:2017-09-25 18:10:42

标签: c# asp.net-mvc-5 itext

我正在使用itext生成pdf文档,但我正在尝试使用现有的解决方案将页码添加到正在生成的pdf文档中,但它们似乎都不适用于我。

我尝试使用像

这样的东西
 using (MemoryStream stream = new MemoryStream())
 {
    PdfReader reader = new PdfReader(bytes);
    using (PdfStamper stamper = new PdfStamper(reader, stream))
    {
        int pages = reader.NumberOfPages;
        for (int i = 1; i <= pages; i++)

但我的代码不识别PdfStamper并要求我创建一个类。 同样,我尝试使用

MemoryStream ms = new MemoryStream();
PdfReader reader = new PdfReader(pdf);
int n = reader.NumberOfPages;
Rectangle psize = reader.GetPageSize(1);

.NumberOfPages和.GetPageSize上有错误。

我也尝试创建一个单独的PageEventHandler类,但问题仍然存在。

现在,我可以生成pdf,但我想添加页码,我有一个代码,如

 private MemoryStream MakeDocument(Application application)
    {
    MemoryStream ms = new MemoryStream();
    PdfWriter writer = new PdfWriter(ms);
    PdfDocument pdfDocument = new PdfDocument(writer);

        using (var document = new Document(pdfDocument))
        {
            var sections = new List<IDocumentSection>
            {
                new Header(),  
                new Projects(application.Projects),                
                //Footer
            };

            foreach (var section in sections)
                section.AddTo(document);

        Rectangle pageSize;
        PdfCanvas canvas;
        int n = pdfDocument.GetNumberOfPages();
        for (int i = 1; i <= n; i++)
        {
            PdfPage page = pdfDocument.GetPage(i);
            pageSize = page.GetPageSize();
            canvas = new PdfCanvas(page);
            canvas.BeginText()                    
       .SetFontAndSize(PdfFontFactory.CreateFont(FontConstants.HELVETICA), 7)
                .MoveText(pageSize.GetWidth() / 2 - 7, 10)
                .ShowText(i.ToString())
                .ShowText(" of ")
                .ShowText(n.ToString())
                .EndText();
        }
   }
   return ms;
       var outputStream = MakeDocument(application);

        var response = new HttpResponseMessage
        {
            StatusCode = HttpStatusCode.OK,
            Content = new ByteArrayContent(outputStream.ToArray())
        };

        response.Content.Headers.Add("Content-Type", "application/pdf");
        return response;

但它在GetPageSize抱怨 你调用的对象是空的。即使我将页面大小设置为A4,它也会在canvas = new PdfCanvas(页面)上开始抱怨;

1 个答案:

答案 0 :(得分:1)

您似乎正在使用iText 7.或者更确切地说,当我看到时,这就是我的假设:

PdfStamper

MemoryStream stream = new MemoryStream(); PdfWriter writer = new PdfWriter(stream); PdfReader reader = new PdfReader(bytes); PdfDocument pdfDoc = new PdfDocument(reader, writer); Document document = new Document(pdfDoc); Rectangle pageSize; PdfCanvas canvas; int n = pdfDoc.GetNumberOfPages(); for (int i = 1; i <= n; i++) { PdfPage page = pdfDoc.GetPage(i); pageSize = page.GetPageSize(); canvas = new PdfCanvas(page); // draw page numbers on the canvas } pdfDoc.close(); 类是iText 5类。它在iText 7中不存在。请参阅Chapter 5jump-start tutorial。你可能想要这样的东西:

PdfStamper

如果您没有使用iText 7,那么您的问题就出现了问题。在这种情况下,您应该澄清在同一个句子中使用概念PdfEventHandler和{{1}}时的含义,因为这没有任何意义。