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 例如 Adob​​e / 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();`    

由于您仅使用默认 DocumentRendererDocument 填充主页区域,因此您可以简单地查询文档渲染器的当前区域。

例如这段代码在绘制相关行之前将可用 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.

将所有常规内容添加到文档后,只需如上查询文档渲染器当前区域即可。