使用CSS和JAVA生成PDF

使用CSS和JAVA生成PDF,java,css,pdf,itext,Java,Css,Pdf,Itext,我正在生成一个由多个表组成的PDF,我想知道是否有某种方法可以让我知道表大小是否会超过PDF页面大小。我正在使用这些信息来决定是以纵向模式还是横向模式生成PDF。有可能买到这个尺寸的吗 知道表格大小是否会超过PDF页面大小 表格大小由XHTML表格内容(行、列、页眉、页脚等)加上CSS文档(宽度、高度和边框属性)决定 作为将XHTML转换为渲染输出过程的一部分,渲染引擎(ITextRenderer)只知道您的表大小,以及它在应用CSS后是否适合页面 因此,如果要查询ITextRenderer,

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

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

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

  • 创建一个
    ITextRenderer
    实例,通过
    renderer.setDocument()
    传入
    文档
    ,然后通过
    renderer.layout()
    应用CSS,根据原始页面方向进行所有布局计算
  • 以某种方式查询以确定表是否适合页面
  • 如果没有,则在纵向/横向之间切换。但这意味着要更改为新的CSS,设置不同的页面形状:
  • 选择适合新页面方向的新CSS,并在文档中进行设置
  • 创建一个新的
    ITextRenderer
    实例,通过
    renderer.setDocument()
    传入
    文档,然后通过
    renderer.layout()
    应用CSS,使所有布局计算基于新页面方向进行
  • 通过
    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

建议的备选方案:

  • 使用两种场景进行线框/草图设计-一种用于纵向,另一种用于横向
  • 确定两种场景下元素/行/列的大小
  • 确定使用每个场景的条件逻辑,纵向和横向。例如,如果I的行数为X,列数为Y,则使用横向
  • 现在创建两个CSS文件
  • 现在,在生成XHTML时,使用条件逻辑链接到正确的CSS

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