【问题标题】:Page break in an Xfinium flow documentXfinium 流文档中的分页符
【发布时间】:2024-01-14 05:54:01
【问题描述】:

我正在使用 Xfinium.PDF 为 UWP 创建一个 PdfFlowDocument。我需要插入分页符,但前提是某个部分(包含段落和表格)不适合当前页面。这是一种“保持在一起”的功能。

我怎样才能完成我的任务?

更新:我已将需要保存在一起的内容量减少到一个表中。虽然它是一个流表,但我知道我需要将它转换为一个固定大小的表来计算它的高度。如果我能在渲染所有流内容后以某种方式找出页面上的当前位置,我将能够计算出页面上还剩下多少空间。如果表格有足够的空间,我会将其呈现在页面上。如果没有,我会发出分页符并将其呈现在下一页上。

有没有在渲染流内容后找出页面当前位置的功能?

【问题讨论】:

    标签: c# pdf uwp


    【解决方案1】:

    您可以通过调用 PdfFlowDocument.StartNewPage 来强制分页。
    公共 API 中不提供流内容的大小信息,您无法在代码中测试内容对象是否适合当前可用空间。
    我们将在下一个版本中支持此功能。

    【讨论】:

    • 那是个坏消息 :( 我的 PDF 文档上有一个签名部分,我需要将它保存在一起。它可能不会跨越两页。我已经更新了我的问题。也许有一个解决方法。
    • 唯一的解决方案是在添加这个新部分之前强制一个新页面,无论它是否适合当前页面。
    • 是否可以从 PdfFlowDocument 中删除流元素?如果是这样,这是一个可能有效的技巧:1)通过 PdfFlowDocument.GetFixedDocument().Pages.Count 获取页数。 2)添加要保持在一起的元素 3)再次检查页数。如果相同,则将添加的元素留在页面上。如果页数增加,则表示添加的元素跨越两页 4) 删除元素。 5) 插入分页符 6) 再次添加元素。你认为它会起作用吗?
    • @ata6502 流内容对象一旦添加就无法删除
    • @Patrick 是的,关于流内容大小的信息现在可以在公共 API 中获得。 PdfFlowContent.GetContentHeight 方法为您提供流内容对象的高度。
    【解决方案2】:

    创建一个包含单行和单元格的表格。对于单元格,请使用 PdfFlowTableCompositeCell。它有一个属性Content,它是流内容对象的集合。在行上设置EnableRowSplit = false

            var table = new PdfFlowTableContent(1);
    
            //column width in %
            table.Columns[0].Width = 100;
    
            var row = table.Rows.Add();
            row.EnableRowSplit = false;
            var cell = new PdfFlowTableCompositeCell();
    
            //text
            cell.Content.Add(new PdfFlowTextContent(new PdfFormattedContent(KswModuleTranslator.PdfFaultReportStationAssuranceText)));
    
            //image
            var image = new PdfPngImage(new MemoryStream(signatureData.Signature));
            var imgDings = new PdfFlowImageContent(image);
            cell.Content.Add(imgDings);
    
            //text
            cell.Content.Add(new PdfFlowTextContent(new PdfFormattedContent(signatureInfo.SigneeName)));
    
            row.Cells.Add(cell);
    
            document.AddContent(table);
    

    【讨论】: