【问题标题】:pdf stamper, pdfEventHandler not working when trying to add page number on the pdf document using itextpdf压模,pdfEventHandler在尝试使用itext在pdf文档上添加页码时不起作用
【发布时间】:2017-09-25 18:10:42
【问题描述】:

我正在使用 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(page);

【问题讨论】:

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


    【解决方案1】:

    看来您使用的是 iText 7。或者更确切地说,这就是我看到时的假设:

    PdfWriter writer = new PdfWriter(ms);
    PdfDocument pdfDocument = new PdfDocument(writer);
    Document document = new Document(pdfDocument);
    

    PdfStamper 类是 iText 5 类。它在 iText 7 中不存在。请参阅 Chapter 5jump-start tutorial。你可能想要这样的东西:

    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 7,那么您的问题有问题。在这种情况下,当您在同一个句子中使用概念 PdfStamperPdfEventHandler 时,您应该澄清您的意思,因为这没有任何意义。

    【讨论】:

    • 是的,你说得对,我正在使用 itext7。我仍然很难添加页码。
    • 您是否阅读了快速入门教程?添加页眉,添加页脚,添加水印,......这一切都在教程中进行了解释。你能详细说明你不明白的地方吗?
    • 我已经修改了我的问题,如果您能就此提出更多建议。是的,我确实读过它,但问题是他们使用了两个单独的文件。这不是问题。但我想在文档中添加更多部分。所以我不能使用固定文件,
    • 基本上是在抱怨 pageSize = page.GetPageSize();
    • 抱怨时发出什么声音?我不知道你是否意识到这一点,但你不是很有帮助。就好像你不想被帮助一样。检查line 113 of the PdfPage class。那里有一个方法GetPageSize(),那你在抱怨什么?您确定您使用的是正确的 Rectangle 类吗?
    猜你喜欢
    • 2014-02-17
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 2014-03-24
    • 2014-09-19
    • 1970-01-01
    相关资源
    最近更新 更多