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

时间:2014-02-27 11:46:04

标签: java pdf pdfbox

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

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

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

不是删除TJ,Tj运算符,是否可以将这些Text运算符复制到格式完整的其他pdf文件中,以便新的pdf原来只是纯文本pdf? 如果使用除Tj,TJ操作符以外的文本绘制的文本未命中,则可以。

删除TJ的代码,Tj取自THIS stackoverflow帖子。但它部分有效,它只是删除图像,使绘图和其他艺术完好无损。

编辑: 我能想到的其他选项是将BT ET块之外的所有其他运算符的cmyk颜色设置为白色。这样,pdf只会感觉到文字。这可能吗 ?如果是,请支持pdfBox中的代码示例。

1 个答案:

答案 0 :(得分:1)

  

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

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

要删除这些图形,您可以通过 n 运算符(路径绘制无操作)替换那些路径打击或填充运算符来改进您所引用的答案中的示例

            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:该引用答案中使用的图像删除代码有两个缺点:

  • 它删除太多,因为它不仅删除图像xobjects,而且还形成xobjects;有时(特别是在n-up工具输出中)所有内容都位于xobjects形式的内容中,包括所有文本

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

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

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