我正在生成一个由多个表格组成的 PDF,我想知道是否有某种方法可以让我知道表格大小是否会超过 PDF 页面大小。我正在使用这些信息来决定我是以纵向还是横向模式生成 PDF。有可能得到这个尺寸吗?
问问题
1145 次
1 回答
2
知道表格大小是否会超过 PDF 页面大小
- 表格大小由您的 XHTML 表格内容(行、列、页眉、页脚等)以及您的 CSS 文档(宽度、高度和边框属性)确定。
- 渲染引擎 (ITextRenderer) 只知道您的表格大小,以及它在应用 CSS 后是否适合页面,作为将 XHTML 转换为渲染输出的过程的一部分。
因此,如果您要查询
ITextRenderer
此信息,则需要:- 创建一个
ITextRenderer
实例,传入你Document
的 viarenderer.setDocument()
,然后应用 CSS viarenderer.layout()
,导致所有布局计算基于原始页面方向发生 - 以某种方式查询以确定表格是否适合页面
- 如果没有,请在纵向/横向之间切换。但这意味着更改为新的 CSS,设置不同的页面形状:
- 选择一个适合新页面方向的新 CSS 并将其设置在您的文档中
- 创建一个新
ITextRenderer
实例,传入您Document
的 viarenderer.setDocument()
,然后应用 CSS viarenderer.layout()
,从而根据新的页面方向进行所有布局计算。 - 通过创建 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 回答