iText 7 .net 第 2 页丢失了吗? 7.2.2

iText 7 .net page 2 missing? 7.2.2

使用我目前的代码,PDF 有 201 页,最后一页是空白,没有第 2 页

第 1 页:亲爱的 GUY JR LANDA,- 第 Number:1

第 2 页:亲爱的 JOYCE JOHNSTON,- 第 Number:3

Settings settings = SettingsFactory.GetSettings();
List<ILetter> letters = LetterFactory.GetLetters();
for (int i = 0; i < letters.Count/200; i++)
{
    var group = letters.Skip(i * 200).Take(200);
    using PdfWriter pdfWriter = new(Path.Combine(settings.OutputFolder, $"checks_{i + 1}.pdf"));
    using PdfDocument pdfDocument = new(pdfWriter);
    using Document document = new(pdfDocument);
    pdfDocument.SetDefaultPageSize(iText.Kernel.Geom.PageSize.LEGAL);

    Resource Resources = new();

    foreach (var l in group)
    {
        l.SetPDF(pdfDocument, document, Resources);
        l.PrintPages();
    }
}

public override void PrintPages()
{
    CurrentPage = PdfDocument?.AddNewPage(iText.Kernel.Geom.PageSize.LEGAL);
    Greeting();
    Document?.Add(new AreaBreak(AreaBreakType.NEXT_PAGE));
}
public void Greeting()
{
    Paragraph P = new();
    P.Add(new Text($"Dear {Data?.Address?.Name},").SetFont(Resources?.Times_Roman));
    P.Add(new Text(" - Page Number:"+PdfDocument?.GetNumberOfPages().ToString()));

    Document?.Add(P);
}

您的代码不是 self-contained。因此,我将其简化为必需品:

using (PdfWriter pdfWriter = new PdfWriter(@"PageNumberFromNumberOfPages.pdf"))
using (PdfDocument pdfDocument = new PdfDocument(pdfWriter))
using (Document document = new Document(pdfDocument))
{
    for (int i = 1; i < 5; i++)
    {
        pdfDocument.AddNewPage(PageSize.LEGAL);

        Paragraph paragraph = new Paragraph();
        paragraph.Add(new Text($"This should be page {i}"));
        paragraph.Add(new Text($" and PdfDocument.GetNumberOfPages is {pdfDocument.GetNumberOfPages()}"));
        document.Add(paragraph);

        document.Add(new AreaBreak(AreaBreakType.NEXT_PAGE));
    }
}

结果与你的相似:

  1. 这应该是第 1 页,PdfDocument.GetNumberOfPages 是第 1
  2. 这应该是第 2 页,PdfDocument.GetNumberOfPages 是第 3 页
  3. 这应该是第 3 页,PdfDocument.GetNumberOfPages 是第 4 页
  4. 这应该是第 4 页,PdfDocument.GetNumberOfPages 是第 5 页
  5. [空]

这实际上是有道理的:

  • 最初 PdfDocument 有 0 页。 Document 还没有当前页面。
  • 对于i == 1
    • AddNewPage 添加一页 -> PdfDocument 1 页。
    • 因此,该段落包含“PdfDocument.GetNumberOfPages is 1”。
    • Add(paragraph) 使用现有的第一页写入。 -> Document 当前页 1.
    • Add(new AreaBreak(AreaBreakType.NEXT_PAGE)) 使 Document 成为下一页的目标。由于还没有 none ,它首先生成一个新页面。 -> PdfDocument 2 页; Document 当前第 2 页。
  • 对于i == 2
    • AddNewPage 添加一页 -> PdfDocument 3 页。
    • 因此,该段落包含“PdfDocument.GetNumberOfPages is 3”。
    • Add(new AreaBreak(AreaBreakType.NEXT_PAGE)) 使 Document 指向下一页,即已经存在的第三页。 -> PdfDocument 3 页; Document 当前第 3 页。
  • 对于i == 3
    • AddNewPage 添加一页 -> PdfDocument 4 页。
    • 因此,该段落包含“PdfDocument.GetNumberOfPages is 4”。
    • Add(new AreaBreak(AreaBreakType.NEXT_PAGE)) 使 Document 指向下一页,即已经存在的第四页。 -> PdfDocument 4 页; Document 当前第 4 页。
  • ...

因此,您观察到的正是预期的结果。


可能您不仅想知道为什么观察到的行为是正确的,您可能还想知道如何检索实际的当前页码。

首先,使用 PdfDocument.GetNumberOfPages 本身并不是一个坏主意,只要页面仅通过添加到 Document class 创建。 但是,一旦您通过不同的机制添加页面,当前 Document 页码和 PdfDocument 中的页数就会不同。

因此,如果您需要通过不同的机制更改页数,则需要另一种方法来查询当前 Document 页码。您可以通过查询关联的 DocumentRenderer 来做到这一点,例如像这样

paragraph.Add(new Text($" and CurrentArea.GetPageNumber is {document.GetRenderer().GetCurrentArea().GetPageNumber()}"));

(PageNumber 测试 UsingNumberOfPages)