Страница X из Y выпуск - PullRequest
       18

Страница X из Y выпуск

13 голосов
/ 23 марта 2012

Я пробовал 3 разных способа отображения номеров страниц, OnCloseDocument содержимое не отображается на странице, ни один из них не работал.

Мое намерение отображает Номера страниц вот так

1 из 10
2 0f 10
..............
............
10 из 10 на каждой странице

Я знаю, как отобразить

1
2
3
4
....
10

но не знаю, как отобразить общее количество страниц

Я использую OnCloseDocument для отображения количества страниц, но содержание в нем не отображается.

public class MyPdfPageEventHelpPageNo : iTextSharp.text.pdf.PdfPageEventHelper
{
    protected PdfTemplate total;
    protected BaseFont helv;
    private bool settingFont = false;

    public override void OnOpenDocument(PdfWriter writer, Document document)
    {
        template= writer.DirectContent.CreateTemplate(100, 100);       

        bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.NOT_EMBEDDED);
    }
    public override void OnCloseDocument(PdfWriter writer, Document document)
    {
    //See below
    }

1-Й ПУТЬ:

    public override void OnCloseDocument(PdfWriter writer, Document document)     
    {
        //I create a table with one column like below.
        PdfPTable pageNumber2 = new PdfPTable(1);
        pageNumber2.TotalWidth = 50;
        pageNumber2.HorizontalAlignment = Element.ALIGN_RIGHT;

        pageNumber2.AddCell(BuildTable2RightCells("Page " + writer.PageNumber));
        pageNumber.AddCell(BuildTable2LeftCells(writer.PageCount));
        pageNumber2.WriteSelectedRows(0, -1, 500, 
        (document.PageSize.GetBottom(140)), cb);
    }    

2-Й ПУТЬ:

    public override void OnCloseDocument(PdfWriter writer, Document document)     
    {
        ColumnText.ShowTextAligned(template,Element.ALIGN_CENTER,new
        Phrase(writer.PageNumber.ToString()), 500, 140, 0);
    }

3-Й ПУТЬ:

    public override void OnCloseDocument(PdfWriter writer, Document document)     
    {
        template.BeginText();
        template.SetFontAndSize(bf, 8);
        template.SetTextMatrix(500, 140);
        template.ShowText(Convert.ToString((writer.PageNumber - 1)));
        template.EndText();
    }

Я что-то не так делаю?

Ответы [ 2 ]

18 голосов
/ 23 марта 2012

Ваш второй путь, вероятно, самый простой. Ниже приведена очень, очень урезанная, но рабочая версия:

public class MyPdfPageEventHelpPageNo : iTextSharp.text.pdf.PdfPageEventHelper {
    public override void OnEndPage(PdfWriter writer, Document document) {
        ColumnText.ShowTextAligned(writer.DirectContent, Element.ALIGN_CENTER, new Phrase(writer.PageNumber.ToString()), 500, 140, 0);
    }
}

И использовать его:

//Create a file on our desktop
string outputFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "OnCloseTest.pdf");
//Standard PDF creation, adjust as needed
using (FileStream fs = new FileStream(outputFile, FileMode.Create, FileAccess.Write, FileShare.None)) {
    using (Document doc = new Document(PageSize.LETTER)) {
        using (PdfWriter writer = PdfWriter.GetInstance(doc, fs)) {

            //Find our custom event handler
            writer.PageEvent = new MyPdfPageEventHelpPageNo();

            doc.Open();

            //Add text the first page
            doc.Add(new Paragraph("Test"));

            //Add a new page with more text
            doc.NewPage();
            doc.Add(new Paragraph("Another Test"));

            doc.Close();
        }
    }
}

EDIT

Извините, я думал, что у вас проблемы с базовой настройкой событий, моя ошибка.

Я видел только два способа сделать то, что вы пытаетесь сделать, либо сделать два прохода, либо использовать синтаксис PdfTemplate, который, насколько мне известно, отображает изображение .

Я бы порекомендовал просто выполнить два прохода: первый просто для создания PDF-файла, а второй - для добавления номеров страниц. Вы можете запустить свой первый проход на MemoryStream, чтобы вам не приходилось дважды нажимать на диск, если хотите.

PdfReader reader = new PdfReader(outputFile);
using (FileStream fs = new FileStream(secondFile, FileMode.Create, FileAccess.Write, FileShare.None)) {
    using (PdfStamper stamper = new PdfStamper(reader, fs)) {
        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)), 500, 140, 0);
        }
    }
}
3 голосов
/ 05 сентября 2013

Вот пример кода для объяснения «Крис Хаас» (двухпроходный метод без записи файла на жесткий диск)

«Код для копирования и вставки» с использованием потока памяти для вывода страницы x of y

protected void Button2_Click(object sender, EventArgs e)
{
    byte[] b = CreatePDF2();        
    string ss = HttpContext.Current.Request.PhysicalApplicationPath;
    string filenamefirst = ss + DateTime.Now.ToString("ddMMyyHHmmss");
    string filenamefirstpdf = filenamefirst + ".pdf";

    using (PdfReader reader = new PdfReader(b))
    {
        using (FileStream fs = new FileStream(filenamefirstpdf, FileMode.Create, FileAccess.Write, FileShare.None))
        {
            using (PdfStamper stamper = new PdfStamper(reader, fs))
            {
                int PageCount = reader.NumberOfPages;
                BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.EMBEDDED);

                for (int i = 1; i <= PageCount; i++)
                {
                   string sss = String.Format("Page {0} of {1}", i, PageCount);
                   PdfContentByte over=  stamper.GetOverContent(i);
                   over.BeginText();                        
                   over.SetTextMatrix(500, 750);
                   over.SetFontAndSize(bf, 8);                                              
                   over.ShowText(sss);
                   over.EndText();
                }
            }
        }
    }
}

private byte[] CreatePDF2()
{
    Document doc = new Document(PageSize.LETTER, 50, 50, 50, 50);

    using (MemoryStream output = new MemoryStream())
    {
        PdfWriter wri = PdfWriter.GetInstance(doc, output);
        doc.Open();

        Paragraph header = new Paragraph("My Document") { Alignment = Element.ALIGN_CENTER };
        Paragraph paragraph = new Paragraph("Testing the iText pdf.");
        Phrase phrase = new Phrase("This is a phrase but testing some formatting also. \nNew line here.");
        Chunk chunk = new Chunk("This is a chunk.");

        PdfPTable tab = new PdfPTable(3);
        PdfPCell cell = new PdfPCell(new Phrase("Header", new Font(Font.FontFamily.HELVETICA, 24F)));
        cell.Colspan = 3;
        cell.HorizontalAlignment = 1; //0=Left, 1=Centre, 2=Right   //Style
        cell.BorderColor = new BaseColor(System.Drawing.Color.Red);
        cell.Border = Rectangle.BOTTOM_BORDER; // | Rectangle.TOP_BORDER;
        cell.BorderWidthBottom = 3f;
        tab.AddCell(cell);
        //row 1

        for (int i = 1; i < 120; i++)
        {
            //row 1
            tab.AddCell("R1C1");
            tab.AddCell("R1C2");
            tab.AddCell("R1C3");
            //row 2
            tab.AddCell("R2C1");
            tab.AddCell("R2C2");
            tab.AddCell("R2C3");
        }

        doc.Add(header);
        doc.Add(paragraph);
        doc.Add(phrase);
        doc.Add(chunk);
        doc.Add(tab);
        doc.Close();
        return output.ToArray();
    }
}
...