【问题标题】:iText shrink table column to fit contentsiText 缩小表格列以适应内容
【发布时间】:2017-10-12 18:02:55
【问题描述】:

在我的 iText 文档中,我有很多表格,每个表格只有一行两列。我想自动缩小最左边的列以适应其内容,并扩展最右边的列以填充剩余空间。

这两列的确切内容差异很大,因此无法提前确定确切的宽度应该是多少。

此屏幕截图中的所有内容都包含在一个外部表格中。每个嵌套表都有两列突出显示为红色和蓝色。我想在不强制文本占用更多行的情况下尽可能缩小红色列。

在这种情况下,每个红色单元格的内容只是一个段落,但它们可能包含一个进一步嵌套的表格,其中包含两个自己的单元格(这可能面临同样的问题)。

有没有一种简单的方法可以在不指定确切或相对宽度的情况下扩展一列并缩小另一列?

【问题讨论】:

  • 既然您使用的是 itext 标签,我想您使用的是 iText5 的某个版本?如果是这样的话,我猜所有东西都放在一张桌子上,因为你想要边框?老实说,如果可能的话,我建议只切换到 iText7 并将表格放在一起。在 iText7 中,您可以在任何块状元素上设置边框,并将宽度也设置为内容的宽度。在 iText5 中,我什至不想开始思考如何去做。
  • 在 iText 7 中像这样将两个块彼此相邻放置的等效元素是什么?
  • 我会看看如何在 java 中重现上述布局并将其作为答案发布在这里,cmets 对于代码讨论/示例来说有点太有限了

标签: java itext


【解决方案1】:

如果您使用的是 iText7(并且完全放弃了表格进行布局),则可以通过构建以下示例来实现此外观和布局:

输出如下所示:

上面用来生成输出的代码:

 public void createPdf(String dest) throws IOException, FileNotFoundException{
    PdfWriter writer = new PdfWriter(dest);
    PdfDocument pdfDoc = new PdfDocument(writer);
    Document doc = new Document(pdfDoc);

    Paragraph p = new Paragraph();

    Text t = new Text("Date:").setBold();
    p.add(t);
    t= new Text("10/12/17").setUnderline();
    p.add(t);
    p.add(new Tab());
    p.add(createTwoPartBorderedText("Catalog Year:   ","2017"));
    p.add(new Tab());
    p.add(createTwoPartBorderedText("L Number","2019284"));

    doc.add(p);

    doc.close();
}

public Paragraph createTwoPartBorderedText(String contentOne, String contentTwo){
    Paragraph container= new Paragraph();

    Text one = new Text(contentOne).setBold();
    Border solidRed = new SolidBorder(Color.RED,1f);
    one.setBorder(solidRed);
    container.add(one);

    Text two  =new Text(contentTwo);
    two.setUnderline();
    Border solidBlue = new SolidBorder(Color.BLUE,1f);
    two.setBorder(solidBlue);
    container.add(two);
    return container;
}

【讨论】:

  • 太好了,谢谢。我猜从 iText 5 更新到 7 可能需要付出很多努力,所以我现在无法处理这个问题,但感谢您的指点!
  • 移植工作量取决于您的代码库的范围,某些东西很容易移植(html 到 pdf 转换),其他东西在 iText7 中更容易(见上文),有些东西可能需要很大的努力,因为 API 发生了变化,它们涉及很多操作(手动放置布局)。有些东西被删除了,它们的功能被分割到其他类上(很好摆脱,ColumnText.go())。您可以查看 iText7 快速入门教程以了解 7 并自行决定移植工作量:)
  • 我今天发现我们使用 iText 5 的原因是它是我们可以在没有许可证的情况下在我们的闭源产品中使用的最后一个(?)免费版本。有没有办法在 iText 5 的范围内实现这种外观?还是我们只能忍受它,直到我们决定让步并购买许可证?
  • eeeeuh,您可能需要仔细检查您的项目是否符合 AGPL,它有条件使您的源代码可用。顺便说一句,没有任何版本的 iText5 不是 AGPL,对于您的项目(封闭源代码)的一般描述,您需要商业许可证。
  • 好吧,感谢您指出这一点。我们现在正在获得许可证并准备升级到 iText 7。完成后我会尝试您的解决方案。
猜你喜欢
  • 1970-01-01
  • 2019-12-05
  • 1970-01-01
  • 1970-01-01
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多