0

首先,我使用 itext 和 java 创建了一个 pdf 并放置了一个 table 和 tableCell

 PdfPTable table = new PdfPTable(2);
        table.setWidths(new int[]{1, 2});
        PdfPCell cell;
        table.addCell("Address:");
        cell = new PdfPCell(new Phrase(""));
        cell.setFixedHeight(60);
        table.addCell(cell);  

我有另一个程序读取这个 pdf 文件

  PdfReader reader = new PdfReader("path_of_previously_created_pdf");

现在我想获取 TableCell 单元格并想要更改单元格高度 cell.setFixedHeight(new_Fixed_Height);

有可能......如果是的话。如何??提前感谢

4

1 回答 1

1

如果您的 PDF 只包含那个简单的 1x2 表格,那么当然可以实现一些东西,为您提供具有您选择的单元格高度的 PDF。

但我认为它最终意味着包含更多。您通过谷歌驱动器提供的代码已经包含更多(更多表格单元格和表单元素),而且该代码在 PDF 构造方面看起来也未完成。因此,...

直接回答

这不可能。

首先,您在创建 PDF 时拥有的tablecell对象在结果文件中并不存在,它们只是被绘制为多行和一些文本(或您放入单元格中的任何内容)。

因此,您甚至无法检索cells要更改的内容,更不用说更改它了。

扭曲的答案

cell当然,您可以尝试解析页面内容流以找到用于绘制线条的命令,找到其中为您感兴趣的那些绘制的命令,并尝试cell从线条坐标中导出原始尺寸属性。之后,您可以尝试将单元格下方的所有内容向下移动以创建所需的额外空间。

根据您所拥有的信息(您知道单元格的大致位置吗?如果不知道,您至少知道它的一些独特内容吗?)读取当前单元格高度将包括一些猜测和大量编码,因为不幸的是 iText 解析器框架尚不支持解析路径操作。

本质上,您必须增强 PDF 解析器包中的类,以便还处理和发出 PDF 路径运算符的事件(如果您了解 iText 和 PDF 规范中的方法,不应该超过一两个星期)并创建一个适当的事件侦听器以查找您已经知道的单元格位置周围的线条(不超过一天的工作)。一些 iText 代码分析将显示固定单元格高度和周围线条的距离之间的关系。

不过,这很可能是你工作的一小部分。更大的部分实际上是操纵页面内容:

如果幸运的话,您的所有页面内容都位于单个内容流中。在这种情况下,您只需要再次分析所有页面内容,但这次要实际更改它。最简单的方法是再次增强解析器包中的类(因为它们已经做了很多必要的数学和簿记),以用标准化坐标从内容流中发出每个命令(这可能需要一两个星期) . 根据向您发送信号的这些信息,您构建了一个全新的内容流,您将所有内容留在单元格上方,将所有内容向下移动,并拉伸所有内容,使其越过单元格底部边界所在的线(可能再过一周)。

如果您不那么幸运,则必须与多个包含的表单 xobjects 越界进行斗争。由于这些 xobject 也可以从其他流中使用,因此您无法更改它们,但必须更改副本或在新创建的流中包含 xobject 内容。

那么越界的图像呢?或有趣的模式?在那种情况下,拉伸细胞会完全扭曲一切。

然后是注释,例如您的表单字段。你也需要移动和拉伸它们。

因此,虽然可以采用这种方法,但请注意(取决于解决方案的通用性)它的实施将需要几个月的时间来了解 iText 和 PDF。

另一种方法

你在评论中说

我正在处理 Pdf 表单。我曾经使用 TextField(MULTILINE TEXT) 创建了 itext 表单。阅读此 pdf 并填写表格后,但当内容增加时,它会显示滚动条和内容隐藏。我的问题是,一旦我打印了 pdf,它就没有打印隐藏内容。

为什么不简单地为每组数据构建一个单独的 PDF,其中所有单元格都足够大以容纳相应数据集的表单内容,并将字段值复制到这个新的 PDF 中。这是一种相当简单的方法,但足够灵活,不会浪费太多空间,同时又不会隐藏内容。

于 2013-10-28T08:07:51.443 回答