我有一个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中的代码示例。
答案 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 ... 图像数据内容中的em> ... EI 部分并将其删除。