4

我正在生成一个由多个表格组成的 PDF,我想知道是否有某种方法可以让我知道表格大小是否会超过 PDF 页面大小。我正在使用这些信息来决定我是以纵向还是横向模式生成 PDF。有可能得到这个尺寸吗?

4

1 回答 1

2

知道表格大小是否会超过 PDF 页面大小

  • 表格大小由您的 XHTML 表格内容(行、列、页眉、页脚等)以及您的 CSS 文档(宽度、高度和边框属性)确定。
  • 渲染引擎 (ITextRenderer) 只知道您的表格大小,以及它在应用 CSS 后是否适合页面,作为将 XHTML 转换为渲染输出的过程的一部分。
  • 因此,如果您要查询ITextRenderer此信息,则需要:

    1. 创建一个ITextRenderer实例,传入你Document的 via renderer.setDocument(),然后应用 CSS via renderer.layout(),导致所有布局计算基于原始页面方向发生
    2. 以某种方式查询以确定表格是否适合页面
    3. 如果没有,请在纵向/横向之间切换。但这意味着更改为新的 CSS,设置不同的页面形状:
      1. 选择一个适合新页面方向的新 CSS 并将其设置在您的文档中
      2. 创建一个新ITextRenderer实例,传入您Document的 via renderer.setDocument(),然后应用 CSS via renderer.layout(),从而根据新的页面方向进行所有布局计算。
      3. 通过创建 PDF 输出renderer.createPDF()

问题:

  • 这是低效且不优雅的处理。
  • 这是以错误的方式做事。控制页面布局应该是设计过程的一部分,并且应该反映在 (a) 生成的内容 (XHTML) 和 (b) 格式 (CSS) 中。如果正确完成,则无需执行渲染时魔术来重新格式化整个页面。
  • 在步骤 (2) 中,没有简单的查询界面可以简单地告诉您表格是否适合页面。相反,您必须查询格式化的输出块,并尝试自己确定表格在哪里以及它是否适合页面。例如:

     BlockBox root = renderer.getRootBox();
     List  pageList = root.getLayer().getPages() 
     PageBox page = (PageBox)pageList.get(2);
     List childBoxList = page.getChildren();
     Box childBox = (Box)childBoxList.get(0);
     // etc... until you locate your table
    
  • 在步骤 (4) 中,ITextRenderer 期望您的 CSS 从您的 XHTML 文档中链接。这意味着您首先需要修改您的 XHTML 源代码,然后您需要将它重新提交给 ITextRenderer。

建议的替代方案:

  • 使用 2 个场景进行线框/草图设计 - 一个用于纵向,一个用于横向
  • 确定2个场景下元素/行/列的大小
  • 确定使用每个场景的条件逻辑,纵向 v 横向。例如,如果我的行数是 X,列数是 Y - 然后使用横向,...
  • 现在创建两个 CSS 文件
  • 现在,当您生成 XHTML 时,使用条件逻辑链接到正确的 CSS
于 2013-07-02T06:26:54.343 回答