如何使用itext和java读取pdf并获取表格单元格高度

时间:2013-10-28 07:52:13

标签: java pdf itextsharp itext

首先,我使用itext和java创建了一个pdf,然后放了一个表和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);

有可能......如果是的话。 怎么样?? Thanx提前

1 个答案:

答案 0 :(得分:1)

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

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

直接答案

这是不可能的。

首先,在创建PDF时,您拥有的tablecell对象在结果文件中不存在,它们仅被绘制为多行和一些文本(或者其他任何内容)你把它放进了细胞里。)

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

扭曲的回答

当然,您可以尝试解析页面内容流,以查找绘制线条的命令,找到为您感兴趣的cell绘制的线条,并尝试派生原始线条。线坐标中的cell维度属性。之后,您可以尝试将单元格下方的所有内容移动到所需的额外空间。

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

基本上,您必须增强PDF解析器包中的类,以便为PDF路径操作符处理和发出事件(如果您在iText中知道并且PDF规范不应超过一周或两周)并且创建一个合适的事件监听器,以找到您已经知道的单元格位置周围的线条(不超过一天的工作时间)。一些iText代码分析将显示固定单元格高度和周围线条的距离如何相关。

但最有可能的是,这是你工作中较小的一部分。更大的部分实际上是操纵页面内容:

如果幸运,您的所有网页内容都位于单个内容流中。在这种情况下,您只需要再次分析所有页面内容,但这次要实际更改它。最简单的方法是再次增强解析器包中的类(因为它们已经执行了大量必要的数学和簿记),以使用规范化坐标来通知内容流中的每个命令(这可能需要一周或两周) 。根据这些信息向您发出信号,构建了一个全新的内容流,您可以将所有内容放在单元格上方,向下移动下面的所有内容,然后拉伸所有跨越单元格底部边框的行(可能是另一周)。

如果你不太幸运,你必须与多个包含的形式xobjects越过战斗。由于这些xobjects也可以从其他流中使用,因此您无法更改它们,但必须更改副本或在新创建的流中包含xobject内容。

然后穿越线的图像怎么样?还是有趣的模式?在这种情况下,伸展细胞会彻底扭曲一切。

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

因此,尽管可以遵循这种方法,但请注意(取决于解决方案必须具有的通用性),其实施将使某些人在几个月内了解iText和PDF。

另一种方法

你在评论中说

  

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

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