【问题标题】:How to program a text search and replace in PDF files如何编写 PDF 文件中的文本搜索和替换
【发布时间】:2010-09-18 05:44:37
【问题描述】:

如何以编程方式搜索和替换大量 PDF 文件中的某些文本?我想删除已添加到一组文件的 URL。我已经能够在 Adob​​e Pro 的批处理下使用 javascript 删除链接,但链接文本仍然存在。我看到了使用文本修饰的建议,它可以手动工作,但我不想手动修改 1300 个文件。

【问题讨论】:

  • 我知道它真的很老了,但我遇到了这个问题,你是谷歌的第一个结果。你最后用了什么?
  • 我使用了 Perl、CAM::PDF 模块和示例 changepagestring.pl 程序,正如 Chris Dolan 的回答中所建议的那样。那是一次性的事情,所以现在不要问我该怎么做;-)

标签: javascript pdf replace


【解决方案1】:

由于文档格式的图形性质,在 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

【讨论】:

  • 非常感谢 Chris 的回答以及 CPAN 上的模块。这对我很有效。希望谷歌能找到这个页面,我在搜索中没有看到 CAM::PDF 模块。罗杰
  • 对于其他人来说,我尝试了verypdf.com/app/pdf-text-replacer/… 的试用版,效果很好。
  • @rpilkey 任何人都可以为我提供一个示例示例,因为我是 perl 新手,我不知道如何运行该包。
  • 似乎只适用于简单文本,不适用于任何带有字形偏移的 TJ 框,这似乎很常见...stackoverflow.com/questions/220445/…
  • @MatthewLock 谢谢,我将答案从“CAM-PDF”更改为“CAM::PDF”。在其间的 13 年中,cpan 一定发生了一些变化:-D 至于 3 个字母,是的,您的文档中可能有字距调整将文本字符串分成几部分,因此 CAM::PDF 的基本搜索/替换找不到它。
【解决方案2】:

我也变得绝望了。在安装了 10 次 PDF 编辑器后,都需要花钱,但没有成功:

pdftk + 编辑器就够了:

替换 PDF 文件中的文本

  • 使用 pdftk 解压 PDF 页面流

    pdftk original.pdf 输出 original.uncompressed.pdf 解压

  • 替换文本(有时这 有效,有时无效)在 original.uncompressed.pdf 中

  • 修复修改过的(现在坏了) PDF

    pdftk original.uncompressed.pdf 输出 original.uncompressed.fixed.pdf

(来自乔尔·戴尔)

【讨论】:

    【解决方案3】:

    您可以使用 Adob​​e Acrobat Pro 中的“编辑”功能在一个步骤中查找和替换单个文档中的所有引用...不确定是否可以自动执行多个步骤。

    http://help.adobe.com/en_US/Acrobat/9.0/Professional/WS5E28D332-9FF7-4569-AFAD-79AD60092D4D.w.html

    【讨论】:

      【解决方案4】:

      不确定我是否愿意做所有的工作来编写代码来修改你的 1300 个文件,如果有一个程序可以为你做这件事。前几天,我使用专业版的 Infix 使用其“在文件中查找和替换”功能批量修改了近 100 个文件。它工作得很好。我评估了其他程序,希望能找到类似于 Microsoft Word 的查找和替换功能。 Infix 是我发现的唯一一个可以做到的。签出:http://www.iceni.com/infix-pro.htm

      【讨论】:

        【解决方案5】:

        我刚刚完成了一个由带有变音符号的文本组成的文本的中缀尝试,希望生成另一个文本,其中具有双和组合变音符号的字符被替换为单变音符号。对于那些不关心理解程序化解决方案的工作的人来说,Infix 绝对是一个很好的解决方案。所有请求更改均已生效。仍然需要了解如何影响更改文本布局的单词重排。

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            问题是针对程序化解决方案,但我仍然会分享这个免费的在线工具,它帮助我批量替换某些 PDF 文件中的文本:

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

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

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

            【讨论】:

            • OP 要求程序化 解决方案,而不是手动解决方案。
            • @mkl 你说得对,感谢您指出这一点。我编辑了我的答案以使其更清楚。我在寻找大规模替换 PDF 中某些文本的一次性解决方案时遇到了这个问题。我对编程解决方案没意见,但我尝试过的没有任何效果。那个在线工具确实有效,但是,所以我还是决定分享它。
            【解决方案8】:

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

            pdftr.exe -contentreplace "My Name=>Your Name" D:\in.pdf D:\out.pdf

            pdftr.exe -searchandoverlaytext "My Name=>Your Name" 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 "string" C:\in.pdf

            pdftr.exe -pagerange 1 -searchtext "string" 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 Printer=>VeryPDF Printer" -overlaytextfontsize 8 D:\in.pdf D:\out.pdf

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

            【讨论】:

            • 好像不是免费的,只有windows。
            【解决方案9】:

            虽然这是一个相当古老的线程。只是想分享一个 Node.js 包选项来搜索和替换 PDF 中的文本: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);
            //});
            

            【讨论】:

              【解决方案10】:

              似乎即使使用未压缩的 pdf,文本有时也会被格式化。这使得“正常”文本替换,例如 sed,不起作用或不重要。

              我找不到任何似乎与glyph spacing offsets 一起工作的东西,即看起来像这样的文本(这在 pdf 中似乎很常见),在这个例子中,“其他信息”这个词是这样存储的:

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

              我试图自己编写一个满足这一点的工具。它适用于常见用例。看看here

              首先解压你的pdf,然后cd到签出的git代码,然后:

              语法

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

              享受吧!

              【讨论】:

                猜你喜欢
                • 2013-06-13
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多