gpt4 book ai didi

c# - 使用 iTextSharp 创建 PDF 时放置页码

转载 作者:太空狗 更新时间:2023-10-29 22:22:31 27 4
gpt4 key购买 nike

我正在使用 ASP MVC,我使用 iTextSharp 在我的应用程序中生成 PDF。但现在我遇到了一个问题:我打印列表,当存在多个页面时,我想显示页码(例如:Page 1 to 4)。我找到了一些例子,但我认为它比我需要做的更复杂(比如 exameple )。

编辑:我找到了这个 example 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();
}

最佳答案

基本上,您有两种选择:一次创建文档,或者分两次创建文档。

如果一次性创建文档,事先不知道Y(总页数)的值,所以需要创建一个PdfTemplate 对象作为占位符。这在 MovieCountries1 中得到了证明。示例。

在这个例子中,我们创建了一个扩展 PdfPageEventHelperTableHeader 类。我们在 OnOpenDocument() 方法中为 total 创建了一个 PdfTemplate 类的实例,我们使用这个 total我们在 OnEndPage() 方法中添加页眉或页脚的占位符,并在 OnCloseDocument() 方法中填写总页数。

这种方法的缺点是很难预测total 所需的维度。优点是可以一次性创建文档(不需要先在内存中创建文档)。

如果分两步创建文档,首先创建不带页眉/页脚的文档,然后检查文档以找出它包含多少页。然后使用 PdfStamper 将页码添加到每一页。这显示在 TwoPasses 中。示例。

这些示例摘 self 的书“iText in Action - Second Edition”。您可以从此 URL 免费下载第 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
}
}

但是出于某种原因,您在 Google 上搜索了一个复杂得多的示例(对于您需要的内容来说有点矫枉过正)。

只需将 //添加内容 部分替换为:

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

请注意,我在 ShowTextAligned() 方法中修改了 x 值。您正在创建一个大小为 A4 的页面,这意味着您的页面有 595 个用户单位宽。如果在位置 x = 820 添加页码,页脚将被添加,但它会在页面的可见区域之外。请不要在不知道每个方法的参数的情况下复制/粘贴代码。

关于c# - 使用 iTextSharp 创建 PDF 时放置页码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22807292/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com