有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    正如在注释中已经提到的,您不需要使用单一编码来解码整个字节数组,因为其中的每个字符串对象可以进行不同的编码

    必须逐个指令解析字节数组指令,跟踪当前选择的字体,当遇到文本绘制指令时,必须根据当前字体的属性对其字符串参数进行解码

    要使用的属性可能是它的编码、它的ToUnicode映射、来自底层字体文件的信息,。。。取决于它是哪种字体类型,以及给出了哪些可选信息

    但是,即使这样做了,也不能简单地替换原始pdf中的文本。this answer(在PDFBox库中的一个类似问题中)说明了一些障碍,特别是字体(可能仅嵌入子集)不包含所需的字形和不清楚的布局考虑


    要了解如何解决前一个问题,请查看以下答案:

    • This answer为Java和C#提供PdfContentStreamEditor类,可作为编辑内容流指令的基类;这些类还特别跟踪图形状态,包括当前的文本状态参数
    • This answer(不幸的是,OP删除了这个问题,所以你需要一些声誉才能获得阅读答案的权限)使用PdfContentStreamEditorJava类为特定字体的文本实现一个文本移除器,为大字体的文本实现另一个文本移除器
    • This answer使用PdfContentStreamEditorC#类实现BigTextRemover,该类根据文本的字体大小识别文本并将其删除
    • This answer描述如何防止轮换文档的PdfContentStreamEditor问题
    • This answer还描述了如何防止旋转文档的PdfContentStreamEditor问题,并另外修复了PdfContentStreamEditor中的一个错误
    • This answer使用PdfContentStreamEditorJava类实现一个编辑器,将黑色文本的颜色更改为绿色
    • This answer提供了PdfContentStreamEditor到iText 7/Java的一个端口作为PdfCanvasEditor,并显示了按字体名称或字体大小删除文本并将黑色文本重新着色为绿色的示例用法
    • This answer使用PdfContentStreamEditorC#类实现TextRemover删除所有文本绘图指令
    • This answer使用PdfContentStreamEditorJava类来实现SimpleTextRemover,该类在文本绘制指令中识别搜索文本,将其删除,并返回删除文本的位置(在此处解释的一些限制下)。在这些位置可以绘制新文本

    学习第一个答案中的PdfContentStreamEditor(第五个答案中的修饰符)和SimpleTextRemover,你就会知道如何查找文本。如果你想用不同的方式编辑PDF,其他答案可能会很有趣

    至于替换,考虑字体可能是不完整的,因此,一般来说,不能简单地替换文本绘图指令的字符串参数的内容,而是可能需要为替换的文本绘图指令添加新的字体和切换字体。p>