2014-02-27 39 views
1

我有一个pdf,我希望从中删除所有图像和其他绘图内容。 并将结果保存为新的pdf。移除其他操作符并仅保留文本操作符(TJ,Tj)pdfBox

我知道如何使用TJ,TJ运营商,这是我目前如下

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

取出TJ,TJ运营商,而不是进行删除文本,是否有可能把这些文本运营商复制到另一pdf格式的文件完好无损,这样新的pdf变成纯文本的PDF格式吗? 如果使用非Tj,TJ操作符绘制的文本错过了,那么确定。

删除TJ,Tj的代码取自THIS stackoverflow后。但它部分起作用,它只是删除图像,使绘画和其他艺术品保持完好。

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

+0

页面内容有多复杂? I.e是否存在表单xobjects,这些表单又可能包含混合的文本和图像数据,因此也必须予以处理? – mkl

回答

1

... THIS stackoverflow post。但它部分起作用,它只是删除图像,使绘画和其他艺术品保持完好。

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

为了去除这些图形可以提高从你通过额外替换那些路径打击或由Ñ操作者这是填充运营商称为答案样品一个路径喷漆无操作

  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工具输出中)全部内容驻留在这样的表格xobjects中,包括所有文本

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

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

    为了解决这个问题,你还必须寻找出BI ... 键 - 值对 ... ID ... 图像数据 ... 在内容EI部分并删除它们。

+0

谢谢你这样详细的答案。我已阅读pdfReference.pdf许多次,但设法完全忽略了“n”运算符。总是想知道为什么移除路径运营商会使pdf损坏。正如你所提到的,我的pdf不包含任何表单对象,但你的亮点将在前面提供。 – codin

+0

mkl,真是太神奇了,知道你是一年多的计算器的一部分,甚至没有一个问题要问。答复了无数次,优越的答案。真的很感谢你的工作。 – codin

+1

好吧,我问了一个关于信息安全的问题;)无论如何,我通过回答问题学到了很多东西:我经常想出如何解决这个问题,但是制定细节提供了有趣的见解。 – mkl