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 页,PdfDocument.GetNumberOfPages 是第 1
- 这应该是第 2 页,PdfDocument.GetNumberOfPages 是第 3 页
- 这应该是第 3 页,PdfDocument.GetNumberOfPages 是第 4 页
- 这应该是第 4 页,PdfDocument.GetNumberOfPages 是第 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
)
使用我目前的代码,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 页,PdfDocument.GetNumberOfPages 是第 1
- 这应该是第 2 页,PdfDocument.GetNumberOfPages 是第 3 页
- 这应该是第 3 页,PdfDocument.GetNumberOfPages 是第 4 页
- 这应该是第 4 页,PdfDocument.GetNumberOfPages 是第 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
)