укажите номер страницы при создании PDF с помощью iTextSharp

c# asp.net-mvc pdf-generation itextsharp

29631 просмотра

2 ответа

2790 Репутация автора

Я работаю с ASP MVC и использую iTextSharp для создания PDF в моем приложении. Но теперь у меня есть проблема: я печатаю списки, и когда существует более одной страницы, я хочу показать номер страницы (например:) Page 1 to 4. Я нашел несколько примеров, но я думаю, что это сложнее, чем мне нужно (например, exameple ).

РЕДАКТИРОВАТЬ: я нашел этот пример 2 . Я могу посчитать количество страниц, но я не могу напечатать число в страницах.

Что я сделал:

public ActionResult downloadListaISCC(DateTime? DataFimFiltro)
{

//Code to generate list to PDF

   //My document
   Document doc1 = new Document();
   doc1.SetPageSize(iTextSharp.text.PageSize.A4);
   doc1.SetMargins(0f, 0f, 0f, 0f);
   doc1.NewPage();

   MemoryStream pdfStream = new MemoryStream();
   PdfWriter pdfWriter = PdfWriter.GetInstance(doc1, pdfStream);

   //Code to create table
   doc1.Add(table); //table list in document

   //Follow the example 2 (link)
   pdfWriter.CloseStream = true;
   doc1.Close();


   //E fui seguindo o exemplo do segundo link
   string file = "D:/gerarPDFOleotorres/"+ nomeDoc +""; 

   // add page numbers
   Document copyDoc = new Document();
   PdfCopy copyPdf = new PdfCopy(copyDoc, new FileStream(file, FileMode.Create));
   copyPdf.SetPageSize(PageSize.A4.Rotate());
   copyDoc.Open();

   // read the initial pdf document
   PdfReader reader = new PdfReader(pdfStream.ToArray());
   int totalPages = reader.NumberOfPages;

   PdfImportedPage copiedPage = null;
   iTextSharp.text.pdf.PdfCopy.PageStamp stamper = null;

   for (int i = 0; i < totalPages; i++)
   {

       // get the page and create a stamper for that page
       copiedPage = copyPdf.GetImportedPage(reader, (i + 1));
       stamper = copyPdf.CreatePageStamp(copiedPage);

       // add a page number to the page
       ColumnText.ShowTextAligned(stamper.GetUnderContent(), Element.ALIGN_CENTER, new Phrase((i + 1) + "/" + totalPages, fontetexto), 820f, 15, 0);
        stamper.AlterContents();

       // add the altered page to the new document
       copyPdf.AddPage(copiedPage);
   }

   copyDoc.Close();
   reader.Close();

   // flush and clear the document from memory
   pdfStream.Flush();
   pdfStream.Close();
    }
Автор: CesarMiguel Источник Размещён: 02.04.2014 09:35

Ответы (2)


11 плюса

65288 Репутация автора

Решение

По сути, у вас есть два варианта: либо вы создаете документ за один раз, либо вы создаете документ за два прохода.

Если вы создаете документ за один раз, вы не знаете заранее значение Y (общее количество страниц), поэтому вам нужно создать PdfTemplateобъект в качестве заполнителя. Это продемонстрировано в примере MovieCountries1 .

В этом примере мы создаем TableHeaderкласс, который расширяется PdfPageEventHelper. Мы создаем экземпляр PdfTemplateкласса для метода totalin OnOpenDocument(), мы используем этот totalзаполнитель в OnEndPage()методе, где добавляем верхний или нижний колонтитул, и заполняем общее количество страниц в OnCloseDocument()методе.

Недостатком этого подхода является то, что трудно предсказать размеры, для которых это необходимо total. Преимущество заключается в том, что вы можете создать документ за один раз (вам не нужно сначала создавать документ в памяти).

Если вы создаете документ в два этапа, сначала вы создаете документ без верхнего / нижнего колонтитула, а затем изучаете документ, чтобы узнать, сколько страниц в нем содержится. Затем вы используете, PdfStamperчтобы добавить номера страниц на каждой странице. Это показано в примере TwoPasses .

Эти примеры взяты из моей книги «iText in Action - второе издание». Вы можете скачать главу 6 бесплатно по этому адресу: http://manning.com/lowagie2/samplechapter6.pdf

Пожалуйста, обратитесь к [ официальной документации ] [4], если у вас есть сомнения по поводу конкретной функциональности.

Обновление: я не понимаю, почему вы предпочитаете смотреть на неофициальные примеры. Пример, который я привел вам, выглядит следующим образом:

using (PdfStamper stamper = new PdfStamper(reader, ms2)) {
    // Loop over the pages and add a header to each page
    int n = reader.NumberOfPages;
    for (int i = 1; i <= n; i++) {
        // Add content
    }
}

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

Просто замените // Add contentдеталь на:

ColumnText.ShowTextAligned(stamper.GetUnderContent(), Element.ALIGN_CENTER, new Phrase((i + 1) + "/" + totalPages, fontetexto), 297f, 15f, 0);

Обратите внимание, что я адаптировал значение x в ShowTextAligned()методе. Вы создаете страницу размером А4, что означает, что ваша страница имеет ширину 595 пользовательских единиц. Если вы добавите номера страниц в позиции x = 820, нижний колонтитул будет добавлен, но он будет находиться за пределами видимой области страницы. Пожалуйста, не копируйте / вставляйте код, не зная параметров каждого метода.

Автор: Bruno Lowagie Размещён: 02.04.2014 10:17

0 плюса

27 Репутация автора

Для записей - я использовал этот способ

byte[] bytes = memoryStream.ToArray();

                //Save pdf in the temporary location.
System.IO.File.WriteAllBytes(Server.MapPath("~/TempReports/") + lbReports.Text + "_JEA.pdf", bytes);

/*This is a page counter - it stamps the number of pages in the document. 
 It will read dynamically the 'document' that was just closed above [document.Close();] from the location, 
 then in memory will write the new content plus the one from [byte[] bytes = memoryStream.ToArray();] 
 Solution has been applied from: https://www.aspsnippets.com/Articles/iTextSharp-Add-Page-numbers-to-existing-PDF-using-C-and-VBNet.aspx
 */
try
{
    File.ReadAllBytes(Server.MapPath("~/TempReports/") + lbReports.Text + "_JEA.pdf");
    iTextSharp.text.Font blackFont = FontFactory.GetFont("Arial", 7, iTextSharp.text.Font.BOLD, BaseColor.BLACK);
    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++)
            {
                ColumnText.ShowTextAligned(stamper.GetUnderContent(i),
                 @Element.ALIGN_LEFT, new Phrase(lbReports.Text + " - HD - JEA", blackFont), 63f, 24f, 0);

                ColumnText.ShowTextAligned(stamper.GetUnderContent(i),
                @Element.ALIGN_CENTER, new Phrase("Page " + i.ToString() + " of " + pages, blackFont), 300f, 24f, 0);

                ColumnText.ShowTextAligned(stamper.GetUnderContent(i),
                @Element.ALIGN_RIGHT, new Phrase("" + DateTime.Now, blackFont), 549f, 24f, 0);
            }

            txConnection.Text = "This report contains " + pages + " page(s)";
        }

        bytes = stream.ToArray();

    }//End of page counter

    /*System.IO.File.WriteAllBytes will write all bytes to file again*/

    System.IO.File.WriteAllBytes(Server.MapPath("~/TempReports/") + lbReports.Text + "_JEA.pdf", bytes);

    // Temporary path that is used to display the pdf in the embed.
    System.IO.File.WriteAllBytes(Server.MapPath("~/TempReports/ReportsEmbed/") + lbReports.Text + "_JEA.pdf", bytes);

    /*this is what sends the PDF to the embed viewer object
     The ltEmbed is what receives the plugin to dispplay the file*/

    string embed = "<object data=\"{0}\" type=\"application/pdf\" width=\"698px\" height=\"450px\">";
    embed += "If you are unable to view file, you can download it from <a href = \"{0}\">here</a>";
    embed += " or download <a target = \"_blank\" href = \"http://get.adobe.com/reader/\">Adobe PDF Reader</a> to view it.";
    embed += "</object>";

    ltEmbed.Text = string.Format(embed, ("http://localhost:65423/TempReports/ReportsEmbed/") + lbReports.Text + "_JEA.pdf");
    memoryStream.Close();

    this.Context.ApplicationInstance.CompleteRequest();
}
catch (DocumentException exe)
{
    txConnection.Text = "There has been an error generating the file. Please try again. Error: " + exe;
}

Счетчик номеров страниц iTextSharp

Автор: Mr. Munoz Размещён: 01.04.2017 06:19
Вопросы из категории :
32x32