【发布时间】:2020-08-26 06:54:33
【问题描述】:
我正在尝试使用 PDFBOX 2.0 替换空白或删除文本模式(在我的情况下,我想从所有 PDF 中删除所有“[QR]”字),但我找不到任何适用于我。
我尝试了itext,但还是一样,没有任何效果。
我的 pdf 中的“[QR]”字符串在创建 PDF 后被编辑,也许这就是它们不显示为 tj 运算符的原因?
我的主要:
replaceText(documentoPDF, "[QR]", "");
我的方法(我打印了 Tj 值并且我的模式没有出现在那里):
public void replaceText(PDDocument documentoPDF, String searchString, String replacement) throws IOException{
for ( PDPage page : documentoPDF.getPages()){
PDFStreamParser parser = new PDFStreamParser(page);
parser.parse();
List<?> tokens = parser.getTokens();
for (int j = 0; j < tokens.size(); j++){
Object next = tokens.get(j);
if (next instanceof Operator){
Operator op = (Operator) next;
String pstring = "";
int prej = 0;
//Tj and TJ are the two operators that display strings in a PDF
if (op.getName().equals("Tj"))
{
// Tj takes one operator and that is the string to display so lets update that operator
COSString previous = (COSString) tokens.get(j - 1);
String string = previous.getString();
string = string.replaceFirst(searchString, replacement);
previous.setValue(string.getBytes());
} else
if (op.getName().equals("TJ"))
{
COSArray previous = (COSArray) tokens.get(j - 1);
for (int k = 0; k < previous.size(); k++)
{
Object arrElement = previous.getObject(k);
if (arrElement instanceof COSString)
{
COSString cosString = (COSString) arrElement;
String string = cosString.getString();
if (j == prej) {
pstring += string;
} else {
prej = j;
pstring = string;
}
}
}
System.out.println(pstring.trim());
if (searchString.equals(pstring.trim()))
{
COSString cosString2 = (COSString) previous.getObject(0);
cosString2.setValue(replacement.getBytes());
int total = previous.size()-1;
for (int k = total; k > 0; k--) {
previous.remove(k);
}
}
}
}
}
// now that the tokens are updated we will replace the page content stream.
PDStream updatedStream = new PDStream(documentoPDF);
OutputStream out = updatedStream.createOutputStream(COSName.FLATE_DECODE);
ContentStreamWriter tokenWriter = new ContentStreamWriter(out);
tokenWriter.writeTokens(tokens);
out.close();
page.setContents(updatedStream);
}
documentoPDF.save("resources\\resultado\\nuevo.pdf");
}
这是一个带有一些 [QR] 模式的 pdf 示例:http://www.mediafire.com/file/9w3kkc4yozwsfms/file
如果有人可以提供帮助,我将不胜感激。
如果你需要,我可以上传我的整个项目
提前致谢。
【问题讨论】:
-
这不起作用的原因很简单——您完全忽略了该文本字体的编码。在内容流中实际上有
[( >) ( 4) ( 5) ( @) ] TJ指令(“>”、“4”、“5”和“@”之前的“空格”实际上是零字节,0x00)。因此,显然编码是一些 16 位编码,也没有自然嵌入 ASCII。 -
那么,做我想做的事是不可能的?我是 pdfbox 中的菜鸟,我不知道如何使用其他编码或转换它:(
-
这不是不可能的。至少通常不会;存在用于文本提取的信息不完整或不正确的 PDF,这通常使您的任务无法完成。对于其他 PDF,它只是比您的方法更复杂。
-
那么,有什么帮助吗?我怎样才能重新编码,并能够取出并比较它的纯文本,从而替换它?