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

标签 java pdf itextsharp itext

首先,我使用 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);

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

最佳答案

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

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

直接回答

这不可能。

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

因此,您甚至无法检索 cells你想改变,更别说改变了。

扭曲的答案

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

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

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

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

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

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

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

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

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

另一种方法

你在评论中说

I am working on Pdf Form.I have created itext form using TextField(MULTILINE TEXT) once. After read this pdf and fill up the form but when the content increases it shows scroll Bar and content hide. My problem is Once i print the pdf it did't print hide content.



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

关于java - 如何使用 itext 和 java 读取 pdf 并获取表格单元格高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19629544/

相关文章:

javascript - asp.net mvc 4 下载 pdf 不工作

pdf - 使用 iTextSharp 设置 PDF 版本

java - java中如何获取当前显示器的宽度和高度

java - Spring Boot 记录器换行符

java - 如何在 Spring WebFlux 的一个 Mono 中基于另一个请求执行连续的 Web 请求?

r - 使用 knitr 在 PDF 中制作动画,不仅支持 Adob​​e Reader

c# - 使用 dot net 或任何其他语言在内存中进行 ghostscript 转换

excel - 如何在itextSharp(dll)中保留原始旋转页面

c# - ITextSharp 编辑现有的 pdf

java - Simpledateformat 解析然后格式化日期不匹配