java如何使用itext从具有内置编码的pdf中提取PRStream?
我需要替换原始pdf中的文本并创建一个新的。为此,我使用java中的itext库。到现在为止,我只有带有ANSI编码的PDF。因此,我将运行以下行:
PdfReader reader = new PdfReader(SOURCE_PDF);
PdfDictionary page = reader.getPageN(1);
byte[] pageContentInput = ContentByteUtils.getContentBytesForPage(reader, 1);
String dd = new String(pageContentInput, BaseFont.CP1252);
BaseFont。CP1252帮助我解码编码&;我会得到字符串“dd”中的文本。如果我使用CP1252,结果有点像这个Tj,在ANSI的例子中是Tj
此外,我不仅需要从页面的文本,还需要整个格式,即与Tj,Tf等,以便我可以创建一个新的pdf格式相同。这就是我使用getContentBytesForPage的原因
如何从内置编码的PDF中获取PDF文本流
# 1 楼答案
正如在注释中已经提到的,您不需要使用单一编码来解码整个字节数组,因为其中的每个字符串对象可以进行不同的编码
必须逐个指令解析字节数组指令,跟踪当前选择的字体,当遇到文本绘制指令时,必须根据当前字体的属性对其字符串参数进行解码
要使用的属性可能是它的编码、它的ToUnicode映射、来自底层字体文件的信息,。。。取决于它是哪种字体类型,以及给出了哪些可选信息
但是,即使这样做了,也不能简单地替换原始pdf中的文本。this answer(在PDFBox库中的一个类似问题中)说明了一些障碍,特别是字体(可能仅嵌入子集)不包含所需的字形和不清楚的布局考虑
要了解如何解决前一个问题,请查看以下答案:
PdfContentStreamEditor
类,可作为编辑内容流指令的基类;这些类还特别跟踪图形状态,包括当前的文本状态参数李>PdfContentStreamEditor
Java类为特定字体的文本实现一个文本移除器,为大字体的文本实现另一个文本移除器李>PdfContentStreamEditor
C#类实现BigTextRemover
,该类根据文本的字体大小识别文本并将其删除李>PdfContentStreamEditor
问题李>PdfContentStreamEditor
问题,并另外修复了PdfContentStreamEditor
中的一个错误李>PdfContentStreamEditor
Java类实现一个编辑器,将黑色文本的颜色更改为绿色李>PdfContentStreamEditor
到iText 7/Java的一个端口作为PdfCanvasEditor
,并显示了按字体名称或字体大小删除文本并将黑色文本重新着色为绿色的示例用法李>PdfContentStreamEditor
C#类实现TextRemover
删除所有文本绘图指令李>PdfContentStreamEditor
Java类来实现SimpleTextRemover
,该类在文本绘制指令中识别搜索文本,将其删除,并返回删除文本的位置(在此处解释的一些限制下)。在这些位置可以绘制新文本李>学习第一个答案中的
PdfContentStreamEditor
(第五个答案中的修饰符)和SimpleTextRemover
,你就会知道如何查找文本。如果你想用不同的方式编辑PDF,其他答案可能会很有趣至于替换,考虑字体可能是不完整的,因此,一般来说,不能简单地替换文本绘图指令的字符串参数的内容,而是可能需要为替换的文本绘图指令添加新的字体和切换字体。p>