当前位置: 首页 > 知识库问答 >
问题:

删除其他运算符并仅保留文本运算符(TJ, Tj)pdfBox

子车俊哲
2023-03-14

我有一个pdf,我希望从中删除所有的图像和其他绘图内容。并将结果另存为新pdf。

我知道如何使用TJ、TJ操作符删除文本,我目前执行的操作如下

op.getOperation().equals( "TJ")

代替删除TJ、Tj运算符,是否可以将这些Text运算符复制到另一个格式完整的pdf文件中,以便新pdf变成纯文本pdf?如果使用Tj以外的文本绘制,则可以,TJ运算符遗漏。

删除TJ的代码,TJ取自此stackoverflow post。但它只起到了部分作用,只是删除了图像,使绘画和其他艺术完好无损。

编辑:我能想到的另一个选项是将BT ET块之外的所有其他操作符的cmyk颜色设置为白色。这样pdf将只显示文本。这可能吗?如果是,请在pdfBox中提供代码示例支持。

共有1个答案

傅和璧
2023-03-14

...这个stackoverflow帖子。但它部分有效,它只是删除图像,保持绘画和其他艺术完好无损。

位图图形以外的图形的主要来源是矢量图形。它们通常由路径定义组成,后跟填充或抚摸路径的命令。

要删除这些图形,您可以通过使用n操作符(路径绘制no-op)额外替换这些路径敲击或填充操作符来改进您所引用答案中的示例。

            if( token instanceof PDFOperator )
            {
                PDFOperator op = (PDFOperator)token;
                if( op.getOperation().equals( "Do") )
                {
                    //remove the one argument to this operator
                    COSName name = (COSName)newTokens.remove( newTokens.size() -1 );
                    continue;
                }
                else if (PAINTING_PATH_OPS.contains(op.getOperation()))
                {
                    // replace path painting operator by path no-op
                    token = PDFOperator.getOperator("n");
                }
            }

哪里

final static List<String> PAINTING_PATH_OPS = Arrays.asList("S", "s", "F", "f", "f*", "B", "b", "B*", "b*");

包含路径删除或填充运算符。

PS:在参考答案中使用的图像移除代码有两个缺点:

>

  • 它删除了太多,因为它不仅删除了图像XObject,而且还形成了XObject;有时(尤其是在n-up工具输出中),所有内容都驻留在这样的表单XObject中,包括所有文本。

    要解决此问题,您必须检查引用的xobject的类型,并且仅当其具有子类型image时才将其删除。由于表单xobject反过来也可以包含图像,因此必须递归到表单xobject(它有自己的内容流)。

    它删除的太少,因为它忽略了内联图像。

    要解决此问题,您还必须注意BI...键值对... ID...图像数据...内容中的EI部分并将其删除。

  •  类似资料:
    • void 运算符 void运算符的作用是执行一个表达式,然后不返回任何值,或者说返回undefined。 void 0 // undefined void(0) // undefined 上面是void运算符的两种写法,都正确。建议采用后一种形式,即总是使用圆括号。因为void运算符的优先性很高,如果不使用括号,容易造成错误的结果。比如,void 4 + 7实际上等同于(void 4) + 7。

    • IBM 开源的一个 DIY 纸板机器人:TJBot ,召集世界各地的 Bot 爱好者来制作属于自己的个性化 Bot。 TJBot 延续了手工社区的精神,它是一套 DIY 工具包,可让你建立由 Waston 驱动的可编程纸板机器人。该机器人由一块切割的纸板(可以是 3D 打印或者激光切割)、Raspberry Pi 和多种插件(包括一个 RGB LED 灯、一个麦克风、一个伺服电机和一个摄像头)构成

    • serve 是简单的命令行 Node.js 文件/目录 服务器连接构建,支持 stylus,jade 等等。灵感来源于 http-server。 使用: Usage: serve [options] [dir]Options:  -v, --version        output the version number  -F, --format <fmt>   specify the log 

    • 有人能解释一下PHP中三元运算符速记()和空合并运算符()之间的区别吗? 他们什么时候表现不同,什么时候表现相同(如果发生的话)? VS。

    • 2. 其它运算符 2.1. 复合赋值运算符 复合赋值运算符(Compound Assignment Operator)包括*= /= %= += -= <<= >>= &= ^= |=,一边做运算一边赋值。例如a += 1相当于a = a + 1。但有一点细微的差别,前者对表达式a只求值一次,而后者求值两次,如果a是一个复杂的表达式,求值一次和求值两次的效率是不同的,例如a[i+j] += 1和a

    • 运算符是一种用来检查、改变或者合并值的特殊符号或组合符号。举例来说,加运算符( + )能够把两个数字相加(比如 let i = 1 + 2  )。更复杂的栗子包括逻辑与运算 &&  比如 if enteredDoorCode && passedRetinaScan  。 Swift 在支持 C 中的大多数标准运算符的同时也增加了一些排除常见代码错误的能力。赋值符号( = )不会返回值,以防它被误用