Itextsharp PdfDocument или PdfDocument из It.Document

Я добавляю номера страниц в конец pdf-документа с помощью ITextSharp. Дело в том, что он состоит из 4 или 5 разных PDF-файлов, которые объединяются в процессе, и есть некоторые динамически добавляемые страницы, поэтому PDF-файл может различаться по размеру. Я не могу вызвать document.PageCount, потому что ему «не хватает средства доступа get».

Я сделал счетчик, чтобы отслеживать, на какой странице я нахожусь, и могу заставить последнюю страницу сказать «Страница 9 из 9», а остальные говорят только «Страница 7 из». Я думал, что могу запустить весь документ через PdfReader, чтобы вызвать reader.NumberOfPages и перезапустить каждую страницу и добавить окончательный номер внизу, но я не знаю, как сделать один из типа iTextSharp.text.Document, ни как заняться этим потом.

Это проект, начатый кем-то другим, и я почти не касался iTextSharp раньше, я не могу переделать класс, потому что он слишком велик.

Кто-нибудь знает, что я могу сделать? Или как добавить этот 1 номер на каждую страницу iTextSharp.text.Document?


person Solid1Snake1    schedule 05.06.2012    source источник
comment
Итак, вы делаете что-то, объединяя несколько PDF-файлов и рисуя в них текст, верно? Смотрите мое редактирование здесь. По сути, самый простой способ — просто сделать два прохода, первый объединяет, а второй рисует текст. stackoverflow.com/a/9845722/231316   -  person Chris Haas    schedule 05.06.2012
comment
Эй, спасибо, я бы так и сделал, но, к сожалению, документ хранится в памяти, поэтому после первого прохода у него нет физического пути. Он просто хранится и хранится в потоке памяти. Кстати, вы должны ответить на вопрос, а не оставлять комментарий, чтобы я мог дать вам еще несколько баллов.   -  person Solid1Snake1    schedule 11.06.2012


Ответы (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();
}

}

Надеюсь, это поможет кому-то в будущем :)

person Solid1Snake1    schedule 12.06.2012