【问题标题】:Itextsharp PdfDocument or PdfDocument from It.DocumentIt.Document 中的 Itextsharp PdfDocument 或 PdfDocument
【发布时间】:2012-06-05 18:36:25
【问题描述】:

我正在使用 ITextSharp 将页码添加到 pdf 文档的底部 问题是,它由 4 或 5 个通过该过程组合的不同 PDF 组成,并且有一些动态添加的页面,因此 PDF 的大小可能会有所不同。我不能调用 document.PageCount 因为它“缺少 get 访问器”。

我做了一个计数器来跟踪我在哪个页面上,并且可以让最后一页显示“第 9 页,共 9 页”,但其余页面仅显示“第 7 页,共 9 页”。 我在想我可以通过 PdfReader 运行整个文档来调用 reader.NumberOfPages 并重新运行每一页并在底部添加最终数字,但我不知道如何从 iTextSharp.text.Document 类型中创建一个,也不知道如何以后再做吧。

这是别人发起的一个项目,之前几乎没接触过iTextSharp,实在是太大了,无法重做class。

有人知道我能做什么吗?或者如何将 1 个数字添加到 iTextSharp.text.Document 的每一页?

【问题讨论】:

  • 所以你在做事,在这个过程中合并多个PDF并在它们上面绘制文本,对吧?在这里查看我的编辑。基本上,最简单的方法是只进行两次传递,第一次合并,第二次绘制文本。 stackoverflow.com/a/9845722/231316
  • 嘿,谢谢,我完全会这样做,但不幸的是,文档存储在内存中,因此在第一次通过后它没有物理路径。它只是存储并保存在内存流中。顺便说一句,您应该回答问题而不是发表评论,这样我就可以给您更多积分。

标签: pdf itextsharp page-numbering


【解决方案1】:

找到了,伙计们:D

所以,无论何时你让你的作家:

using (MemoryStream MS = new MemoryStream())
        {
            PdfWriter writer = PdfWriter.GetInstance(doc, MS);
            writer.ViewerPreferences = PdfWriter.PageModeUseOutlines;
            PdfFooter eventHandler = new PdfFooter();
            writer.PageEvent = eventHandler;

ect.
}

对于 PdfFooter:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using iTextSharp.text.pdf;
using iTextSharp.text;

public class PdfFooter : PdfPageEventHelper
{
    // This is the contentbyte object of the writer
    PdfContentByte cb;

// we will put the final number of pages in a template
PdfTemplate template;

// this is the BaseFont we are going to use for the header / footer
BaseFont bf = null;

// This keeps track of the creation time
DateTime PrintTime = DateTime.Now;

#region Properties
private string _Title;
public string Title
{
    get { return _Title; }
    set { _Title = value; }
}

private string _HeaderLeft;
public string HeaderLeft
{
    get { return _HeaderLeft; }
    set { _HeaderLeft = value; }
}

private string _HeaderRight;
public string HeaderRight
{
    get { return _HeaderRight; }
    set { _HeaderRight = value; }
}

private Font _HeaderFont;
public Font HeaderFont
{
    get { return _HeaderFont; }
    set { _HeaderFont = value; }
}

private Font _FooterFont;
public Font FooterFont
{
    get { return _FooterFont; }
    set { _FooterFont = value; }
}
#endregion

// we override the onOpenDocument method
public override void OnOpenDocument(PdfWriter writer, Document document)
{
    try
    {
        PrintTime = DateTime.Now;
        bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
        cb = writer.DirectContent;
        template = cb.CreateTemplate(50, 50);
    }
    catch (DocumentException de)
    {
    }
    catch (System.IO.IOException ioe)
    {
    }
}

public override void OnEndPage(PdfWriter writer, Document document)
{
    base.OnEndPage(writer, document);

    int pageN = writer.PageNumber;
    String text = "Page " + pageN + " of ";
    float len = bf.GetWidthPoint(text, 8);

    Rectangle pageSize = document.PageSize;

    cb.SetRGBColorFill(100, 100, 100);

    cb.BeginText();
    cb.SetFontAndSize(bf, 8);
    cb.SetTextMatrix(pageSize.GetRight(70), pageSize.GetBottom(15));
    cb.ShowText(text);
    cb.EndText();

    cb.AddTemplate(template, pageSize.GetRight(70) + len, pageSize.GetBottom(15));
}

public override void OnCloseDocument(PdfWriter writer, Document document)
{
    base.OnCloseDocument(writer, document);

    template.BeginText();
    template.SetFontAndSize(bf, 8);
    template.SetTextMatrix(0, 0);
    template.ShowText("" + (writer.PageNumber - 1));
    template.EndText();
}

}

希望这对将来的人有所帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多