如何在PDF文件中编写文本搜索和替换程序

31

我该如何以编程方式在大量的PDF文件中搜索和替换文本?我想删除一组文件中添加的URL。我已经能够使用Adobe Pro中的批处理下的JavaScript删除链接,但链接文本仍然存在。我看到有人建议使用文本触摸,手动操作有效,但我不想手动修改1300个文件。


我知道这已经很老了,但我遇到了这个问题,你是谷歌上的第一个结果。最终你使用了什么? - eri0o
我使用了Perl编程语言,CAM::PDF模块以及Chris Dolan的回答中提供的changepagestring.pl程序示例。那只是一次性的事情,所以现在不要问我如何做这个了;-) - rpilkey
11个回答

22

由于文档格式的图形特性,查找PDF中的文本可能会本质上变得困难--您正在搜索的字母在文件中可能不是连续的。尽管如此,CAM::PDF 具有一些搜索-替换功能和启发式技巧。请尝试使用 changepagestring.pl,看看它是否适用于您的PDF文档。

安装方法:

 $ cpan install CAM::PDF
 # start a new terminal if this is your first cpan module
 $ changepagestring.pl input.pdf oldtext newtext output.pdf

2
非常感谢你的回答和在CPAN上提供的模块,Chris。对我来说,那个很好用。希望Google能够收录这个页面,因为我在搜索中没有看到CAM::PDF模块。Roger - rpilkey
2
@rpilkey,能否给我提供一个示例样本?因为我是 Perl 的新手,不知道如何运行该软件包。 - Sundeep Pidugu
1
似乎只适用于简单文本,而不适用于任何具有字形偏移的TJ框,这似乎很常见... https://dev59.com/8HVC5IYBdhLWcg3wqzDV#67932076 - rogerdpack
我得到了警告:不能安装CAM-PDF,不知道这是什么。但是使用cpan install CAM::PDF却可以正常工作。 - Matthew Lock
1
@MatthewLock 谢谢,我已经将答案从“CAM-PDF”更改为“CAM::PDF”。CPAN在过去的13年中肯定有所改变 :-D 至于三个字母,是的,你的文档中可能有字距调整,这会将文本字符串分成几个部分,因此CAM::PDF的基本搜索/替换无法找到它。 - Chris Dolan
显示剩余5条评论

10

我也变得绝望了。我安装了10个需要付费的PDF编辑器,但都没有成功:

只需使用pdftk + 编辑器:

替换PDF文件中的文本

  • Use pdftk to uncompress PDF page streams

    pdftk original.pdf output original.uncompressed.pdf uncompress
    
  • Replace the text (sometimes this works, sometimes it doesn't) within original.uncompressed.pdf

  • Repair the modified (and now broken) PDF

    pdftk original.uncompressed.pdf output original.uncompressed.fixed.pdf
    

(from Joel Dare)


这个答案没有包含任何关于查找/替换操作的指示。经过查看pdftk,我认为这个工具无法完成这个任务。 - undefined

1

1
这只是一个解决方案的一半,但我使用了Touch up和AppleScript支持发送按键来替换数千个表格单元格中的字符串。根据您的页面布局方式,它可能适用于您。在我的情况下,我不得不手动插入光标到每个表格的开头(几十个表格 - 对于手动过程而言相当可管理),但之后我自动替换了数千个单元格。

0

似乎即使是未压缩的PDF,有时文本格式仍然会出现问题。这使得“常规”文本替换(如sed)无法工作或不是很简单。

我找不到任何看起来适用于字形间距偏移量的东西,即像这样的文本(在PDF中似乎非常常见),在此示例中,“其他信息”一词被存储为:

 [(O)-16(ther i)-20(nformati)-11(on )]TJ

我尝试编写一个工具来满足这个需求。对于常见的用例,它可以正常工作。你可以在这里查看。

首先解压缩你的pdf文件,然后进入已检出的git代码目录并执行以下命令:

语法

 $ crystal replaceinpdf.cr input_filename.pdf "something you want replaced" "what you want it replaced with" output_filename.pdf

祝您愉快!欢迎提出请求。


我尝试了这个命令,它显示“没有更改,PDF 是否已经压缩?”并返回退出代码 0。命令是 replaceinpdf SC13R0J_HTML/MANUAL.HTM/rm13r0j/ewd/contents/relay/pdf/JC_01.pdf 黒色 black out.pdf - Douglas Held
提交一个带有所有细节的问题报告 :) - rogerdpack

0

我建议您使用VeryPDF PDF Text Replacer Command Line软件批量替换PDF页面中的文本,您可以运行pdftr.exe轻松地替换PDF页面中的文本,例如:

pdftr.exe -contentreplace "我的名字=>你的名字" D:\in.pdf D:\out.pdf

pdftr.exe -searchandoverlaytext "我的名字=>你的名字" D:\in.pdf D:\out.pdf

pdftr.exe -searchandoverlaytext "我的名字=>D:\temp\myname.png*20*20" D:\in.pdf D:\out.pdf

pdftr.exe -pagerange 1-3 -contentreplace "旧文本=>新文本||VeryPDF=>VeryDOC||我的名字=>你的名字" D:\in.pdf D:\out.pdf

pdftr.exe -searchtext "字符串" C:\in.pdf

pdftr.exe -pagerange 1 -searchtext "字符串" C:\in.pdf

pdftr.exe -pagerange 1 -searchandoverlaytext "旧文本=>新文本||VeryPDF=>VeryDOC||我的名字=>你的名字" D:\in.pdf D:\out.pdf

pdftr.exe -overlaytextfontname "Arial" -overlaytextcolor FF0000 -overlaybgcolor 00FF00 -searchandoverlaytext "旧文字=>新文字||VeryPDF=>VeryDOC||我的名字=>你的名字" D:\in.pdf D:\out.pdf

pdftr.exe -opw 123 -upw 456 -contentreplace "旧文字=>新文字||VeryPDF=>VeryDOC||我的名字=>你的名字" D:\in.pdf D:\out.pdf

pdftr.exe -searchandoverlaytext "PDFcamp打印机=>VeryPDF打印机" -overlaytextfontsize 8 D:\in.pdf D:\out.pdf

pdftr.exe -searchandoverlaytext "PDFcamp打印机=>VeryPDF打印机" -overlaytextfontsize 80% D:\in.pdf D:\out.pdf


似乎不是免费的,仅限Windows系统。 - rogerdpack

0

我不确定是否愿意花费大量精力编写代码来修改您的1300个文件,而现有程序可以帮助您完成此任务。前几天,我使用了Infix的专业版,使用其“查找和替换文件”功能批量修改了近100个文件,效果非常好。为了找到类似于Microsoft Word的查找和替换功能,我已经评估了其他程序。Infix是我发现唯一能够胜任这项工作的程序。请查看:http://www.iceni.com/infix-pro.htm


0

虽然这个问题需要编程解决,但我还是想分享一个免费在线工具,它帮助我批量替换了一些PDF文件中的文本:

http://www.pdfdu.com/pdf-replace-text.aspx

在替换文本后,我没有注意到任何广告或其他修改的PDF文件。

我无法使用我尝试过的软件在本地进行更改。我认为主要问题是我缺少PDF中使用的字体,即使使用Acrobat Pro也无法正常工作。在线工具没有抱怨并产生了很好的结果。


3
楼主要求一个编程解决方案,而不是手动操作的解决方案。 - mkl
@mkl 你说得对,感谢指出这一点。我编辑了我的答案,使其更加清晰明了。在搜索一次性解决大规模替换PDF文本的方案时,我遇到了这个问题。我可以接受编程解决方案,但是我尝试过的所有方法都没有起作用。然而,那个在线工具确实起作用,所以我决定分享它。 - Dimitar

0
我刚试用了中缀表达式处理一个充满变音符的文本,并希望生成另一个文本,其中双重和复合变音符的字符被替换为单一变音符的替代字符。对于那些不想费心理解编程解决方案工作方式的人来说,中缀表达式确实是一个好的解决方案。所有请求更改都已生效。仍需要理解如何实现导致文本布局发生变化的单词重新排列的方法。

我在https://www.iceni.com/infix.htm找到了Infix。 根据他们的常见问题解答,Infix Server可以通过命令行进行查找和替换。它适用于Windows、Linux和MacOS。 - undefined

-1

虽然这是一个很旧的帖子,但我想分享一下一个用于在PDF中搜索和替换文本的Node.js软件包选项:Aspose.PDF Cloud SDK for Node.js。它是付费产品,但提供每月150次免费API调用。


const { PdfApi } = require("asposepdfcloud");
const { TextReplaceListRequest }= require("asposepdfcloud/src/models/textReplaceListRequest");
const { TextReplace }= require("asposepdfcloud/src/models/textReplace");

// Get Client ID and Client Secret from https://dashboard.aspose.cloud/
pdfApi = new PdfApi("xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx", "xxxxxxxxxxxxxxxxxxxxxx");
var fs = require('fs');

const name = "02_pages.pdf";
const remoteTempFolder = "Temp";
//const localTestDataFolder = "C:\\Temp";
//const path = remoteTempFolder + "\\" + name;
//const outputFile= "Replace_output.pdf";


// Upload File
//pdfApi.uploadFile(path, fs.readFileSync(localTestDataFolder + "\\" + name)).then((result) => {  
//                     console.log("Uploaded File");    
//                    }).catch(function(err) {
    // Deal with an error
//    console.log(err);
//});
    
const textReplace= new TextReplace();
        textReplace.oldValue= "origami"; 
        textReplace.newValue= "aspose";
        textReplace.regex= false;

const textReplace1= new TextReplace();
        textReplace1.oldValue= "candy"; 
        textReplace1.newValue= "biscuit";
        textReplace1.regex= false;
    
const trr = new TextReplaceListRequest();
            trr.textReplaces = [textReplace,textReplace1];


// Replace text
pdfApi.postDocumentTextReplace(name, trr, null, remoteTempFolder).then((result) => {    
    console.log(result.body.code);                  
}).catch(function(err) {
    // Deal with an error
    console.log(err);
});

//Download file
//const outputPath = "C:/Temp/" + outputFile;

//pdfApi.downloadFile(path).then((result) => {    
//  fs.writeFileSync(outputPath, result.body);
//    console.log("File Downloaded");    
//}).catch(function(err) {
    // Deal with an error
//    console.log(err);
//});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接