PDF 页面上剩余 Space
Remaining Space on PDF Page
我目前正在为客户设计一份报告,我必须在最后一页的底部放置一段文字。我必须在每个季度生成 16k pdf 时这样做。
使用iText 7.1.5,下个版本会升级到最新版本。
在每个页面上都使用页脚不是一种选择,因为该段落最多可以有 14 行文本。在文档末尾添加一个普通段落也不是解决方案,因为我的客户要求文本位于页脚之上。
预期结果:
当前生成的 PDF
PdfADocument pdf = new PdfADocument(...)
...
// handler for adding header and footer on every page
pdf.AddEventHandler(PdfDocumentEvent.END_PAGE, headerFooterHandler);
Document doc = new Document(pdf);
doc.SetTopMargin(ConversionUtility.MillimeterToPoint(48));
doc.SetLeftMargin(ConversionUtility.MillimeterToPoint(26));
doc.SetRightMargin(ConversionUtility.MillimeterToPoint(18));
doc.SetBottomMargin(ConversionUtility.MillimeterToPoint(26));
... Some customer specific code
// paragraphs and data table is added
foreach(var feeLine in feeList.Values) {
switch (feeLine.Type) {
case "U":
case "T1":
case "T2":
case "BS":
doc.Add(GenerateTextBlock(feeLine, CheckSameType(feeLine.Type, feeList, i)));
break;
case "U3":
doc.Add(GenerateTextBlock(feeLine, CheckSameType(feeLine.Type, feeList, i)));
GenerateTableBlockStart(GetColumnCount(feeList[i + 1]));
break;
default:
if (CheckEndOfTable(feeList, i)) {
var table = GenerateTableBlock(feeLine, ColumnCount, true);
doc.Add(table);
table.Complete();
} else {
GenerateTableBlock(feeLine, ColumnCount, false);
}
break;
}
}
headerFooterHandler.WritePageTotal(pdf);
doc.Close();
我需要一些建议/一段代码如何在最后一页找到剩余的 space。放置和书写文字都没有问题。
您可以使用绝对定位将文本放在最后一页所需的位置。您需要知道的就是找到要放置段落的位置。这可以通过打开 PDF Reader 中的任何 pdf Reader 例如 Adobe / Foxit Reader 并将标尺更改为点来完成。现在您只需放大并找到要放置文本的位置。例如
`string dest = "destination pdf's path"
//Initialize PDF Writer
writer = new PdfWriter(dest);
//Initialize PDF Document
pdf = new PdfDocument(writer);
// Initialize document
document = new Document(pdf, PageSize.A4);
//You page text here
Paragraph p = new Paragraph("bla bla bla bla ");
document.Add(p);
//Write what ever you want to write on the page...
.
.
Paragraph footer = new Paragraph("some text")
footer.SetFixedPosition(72f, 50f, 500f);
footer.SetFontSize(6f);
document.Add(footer);
document.Close();`
由于您仅使用默认 DocumentRenderer
的 Document
填充主页区域,因此您可以简单地查询文档渲染器的当前区域。
例如这段代码在绘制相关行之前将可用 space 的边界框写入每一行:
using (PdfWriter pdfWriter = new PdfWriter(@"DetermineRemainingSpace.pdf"))
using (PdfDocument pdfDocument = new PdfDocument(pdfWriter))
using (Document document = new Document(pdfDocument))
{
for (int i = 0; i < 30; i++)
{
Rectangle currentBox = document.GetRenderer().GetCurrentArea().GetBBox();
string current = string.Format(CultureInfo.InvariantCulture, "{0:F}×{1:F} from ({2:F}, {3:F}) to ({4:F}, {5:F})", currentBox.GetWidth(), currentBox.GetHeight(),
currentBox.GetLeft(), currentBox.GetBottom(), currentBox.GetRight(), currentBox.GetTop());
document.Add(new Paragraph(string.Format("{0:D2}, previously available {1}", i, current)));
}
}
输出:
因此,
I would need some advise / piece of code how to find the remaining space on the last page. Placing and writing the text is no problem.
将所有常规内容添加到文档后,只需如上查询文档渲染器当前区域即可。
我目前正在为客户设计一份报告,我必须在最后一页的底部放置一段文字。我必须在每个季度生成 16k pdf 时这样做。
使用iText 7.1.5,下个版本会升级到最新版本。
在每个页面上都使用页脚不是一种选择,因为该段落最多可以有 14 行文本。在文档末尾添加一个普通段落也不是解决方案,因为我的客户要求文本位于页脚之上。
预期结果:
当前生成的 PDF
PdfADocument pdf = new PdfADocument(...)
...
// handler for adding header and footer on every page
pdf.AddEventHandler(PdfDocumentEvent.END_PAGE, headerFooterHandler);
Document doc = new Document(pdf);
doc.SetTopMargin(ConversionUtility.MillimeterToPoint(48));
doc.SetLeftMargin(ConversionUtility.MillimeterToPoint(26));
doc.SetRightMargin(ConversionUtility.MillimeterToPoint(18));
doc.SetBottomMargin(ConversionUtility.MillimeterToPoint(26));
... Some customer specific code
// paragraphs and data table is added
foreach(var feeLine in feeList.Values) {
switch (feeLine.Type) {
case "U":
case "T1":
case "T2":
case "BS":
doc.Add(GenerateTextBlock(feeLine, CheckSameType(feeLine.Type, feeList, i)));
break;
case "U3":
doc.Add(GenerateTextBlock(feeLine, CheckSameType(feeLine.Type, feeList, i)));
GenerateTableBlockStart(GetColumnCount(feeList[i + 1]));
break;
default:
if (CheckEndOfTable(feeList, i)) {
var table = GenerateTableBlock(feeLine, ColumnCount, true);
doc.Add(table);
table.Complete();
} else {
GenerateTableBlock(feeLine, ColumnCount, false);
}
break;
}
}
headerFooterHandler.WritePageTotal(pdf);
doc.Close();
我需要一些建议/一段代码如何在最后一页找到剩余的 space。放置和书写文字都没有问题。
您可以使用绝对定位将文本放在最后一页所需的位置。您需要知道的就是找到要放置段落的位置。这可以通过打开 PDF Reader 中的任何 pdf Reader 例如 Adobe / Foxit Reader 并将标尺更改为点来完成。现在您只需放大并找到要放置文本的位置。例如
`string dest = "destination pdf's path"
//Initialize PDF Writer
writer = new PdfWriter(dest);
//Initialize PDF Document
pdf = new PdfDocument(writer);
// Initialize document
document = new Document(pdf, PageSize.A4);
//You page text here
Paragraph p = new Paragraph("bla bla bla bla ");
document.Add(p);
//Write what ever you want to write on the page...
.
.
Paragraph footer = new Paragraph("some text")
footer.SetFixedPosition(72f, 50f, 500f);
footer.SetFontSize(6f);
document.Add(footer);
document.Close();`
由于您仅使用默认 DocumentRenderer
的 Document
填充主页区域,因此您可以简单地查询文档渲染器的当前区域。
例如这段代码在绘制相关行之前将可用 space 的边界框写入每一行:
using (PdfWriter pdfWriter = new PdfWriter(@"DetermineRemainingSpace.pdf"))
using (PdfDocument pdfDocument = new PdfDocument(pdfWriter))
using (Document document = new Document(pdfDocument))
{
for (int i = 0; i < 30; i++)
{
Rectangle currentBox = document.GetRenderer().GetCurrentArea().GetBBox();
string current = string.Format(CultureInfo.InvariantCulture, "{0:F}×{1:F} from ({2:F}, {3:F}) to ({4:F}, {5:F})", currentBox.GetWidth(), currentBox.GetHeight(),
currentBox.GetLeft(), currentBox.GetBottom(), currentBox.GetRight(), currentBox.GetTop());
document.Add(new Paragraph(string.Format("{0:D2}, previously available {1}", i, current)));
}
}
输出:
因此,
I would need some advise / piece of code how to find the remaining space on the last page. Placing and writing the text is no problem.
将所有常规内容添加到文档后,只需如上查询文档渲染器当前区域即可。