【问题标题】:PDF Generation Using CSS and JAVA使用 CSS 和 JAVA 生成 PDF
【发布时间】:2012-05-17 21:44:16
【问题描述】:

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

【问题讨论】:

  • 您使用什么库来生成 PDF?
  • 我正在使用 iTextRenderer 生成 PDF。
  • 如果您知道每个表中的列数,那么您应该能够知道 PDF 中结果页面的大小。
  • 您不会从列数 * 最小列宽中获取信息吗?您可能还需要验证您打算使用的 w.r.t 字体。
  • 使用 pdfbox 或 itextrenderer 生成 pdf - 基本上这些是您可以用于生成 pdf 的库。

标签: java css pdf itext


【解决方案1】:

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

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

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

问题:

  • 这是低效且不优雅的处理。
  • 这是错误的做法。控制页面布局应该是设计过程的一部分,并且应该反映在 (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 个场景进行线框/草图设计 - 一个用于纵向,一个用于横向
  • 确定两种方案下元素/行/列的大小
  • 确定使用每个场景的条件逻辑,纵向与横向。例如。如果我的行数是 X,列数是 Y - 然后使用横向,...
  • 现在创建两个 CSS 文件
  • 现在,当您生成 XHTML 时,使用条件逻辑链接到正确的 CSS

【讨论】:

    猜你喜欢
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多