укажите номер страницы при создании PDF с помощью iTextSharp
29631 просмотра
2 ответа
Я работаю с 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
Источник
Размещён: 12.11.2019 09:45
Ответы (2)
11 плюса
По сути, у вас есть два варианта: либо вы создаете документ за один раз, либо вы создаете документ за два прохода.
Если вы создаете документ за один раз, вы не знаете заранее значение Y (общее количество страниц), поэтому вам нужно создать PdfTemplate
объект в качестве заполнителя. Это продемонстрировано в примере MovieCountries1 .
В этом примере мы создаем TableHeader
класс, который расширяется PdfPageEventHelper
. Мы создаем экземпляр PdfTemplate
класса для метода total
in 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, нижний колонтитул будет добавлен, но он будет находиться за пределами видимой области страницы. Пожалуйста, не копируйте / вставляйте код, не зная параметров каждого метода.
0 плюса
Для записей - я использовал этот способ
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;
}
Автор: Mr. Munoz
Размещён: 01.04.2017 06:19
Вопросы из категории :
- c# Преобразовать десятичную в двойную?
- c# Как рассчитать чей-то возраст в C #?
- c# Как вы сортируете словарь по значению?
- c# В чем разница между int и Integer в Java и C #?
- c# Как создать новый экземпляр объекта из Типа
- asp.net-mvc Каков наилучший способ проверки полей с использованием ASP.NET MVC?
- asp.net-mvc От клиента было обнаружено потенциально опасное значение Request.Form
- asp.net-mvc Проверка на стороне клиента ASP.NET MVC
- asp.net-mvc ASP.NET MVC - передача параметров в контроллер
- asp.net-mvc Разница между ViewData и TempData?
- pdf-generation Как сделать слияние почты поверх PDF?
- pdf-generation Преобразование HTML + CSS в PDF с помощью PHP?
- pdf-generation Буквицы в pdfLaTeX
- pdf-generation Delphi PDF поколения
- pdf-generation Преобразование файлов HTML в PDF
- itextsharp Конвертировать HTML в PDF в .NET
- itextsharp Как вернуть PDF в браузер в MVC?
- itextsharp iTextSharp получить PDF DPI
- itextsharp Столы с закругленными углами
- itextsharp Извлечение изображения из PDF с / CCITTFaxDecode filter