PDF - 不使用特殊付费工具编辑原始文本

3
有没有一种方法可以在没有任何特殊付费软件的情况下编辑PDF的原始文本?因此,存在可突出显示文本的PDF。我认为文本存储在文件中某个位置。
我尝试将PDF拖放到vscode中,但它只显示未知字符。即使有一点元数据,但如果我编辑元数据,文件大部分会损坏。除此之外,在vscode编辑器中找不到所需PDF的任何文本内容。
是否有人知道是否有一种解决方案,例如检查并以某种方式更改源代码,而无需使用特殊软件?我想编辑内容,而不是元数据。
(我使用macOS)

1
所有的文本都是在页面上硬编码(x,y坐标),因此编辑文本需要大量重新定位单词。 - rioV8
但是我首先如何能够像这样编辑它呢? - Ljonja
因为PDF是一种文本格式,所以可能会被压缩。 - rioV8
你没有回答我的问题 :( 我该如何编辑它?用什么工具?正如我所说,用 Visual Studio Code 打开它没有起作用 :/ - Ljonja
1个回答

1
PDF页面上的文本可以以数十种不同的方式构建,实际上有数百万用户,使用可能有数百甚至数千种不同方法。
更新 问题是关于MacOS,但要实现原生跨平台,需要使用mime text/pdf才能普遍适用。但举个例子,在Windows中,可以通过逐行编写来实现,比如使用cmd,以下是几十行代码的片段 :-)
echo %%PDF-1.0>demo.pdf
echo %%µ¶µ¶>>demo.pdf
echo/>>demo.pdf

for %%Z in (demo.pdf) do set "FZ1=%%~zZ"
echo 1 0 obj>>demo.pdf
echo ^<^</Type/Catalog/Pages 2 0 R^>^>>>demo.pdf
echo endobj>>demo.pdf
echo/>>demo.pdf

要了解更多关于“功能蔓延”的内容,现在已经超过100行并且还在增加,请访问以下链接:
https://github.com/GitHubRulesOK/MyNotes/raw/master/MAKE-PDF.cmd

这里有一个JScript变体,可以被您的手机或机器人读取“Hello World”,但是由于网络损坏,二维码会显示扭曲的字符,因此可以通过以下链接进行原始下载:
https://github.com/GitHubRulesOK/MyNotes/tree/master/JScriptSamples

var ByteStream = new ActiveXObject("ADODB.Stream");
ByteStream.Type = 2; // Writer
ByteStream.Charset = "Windows-1252"; //Best for PDF writer
var BS = ByteStream; // Abreviate for ease of edit
BS.Open();
BS.Position = 0;

BS.WriteText("%PDF-1.0\n");
BS.WriteText("%Åѧ¡\n");

BS.WriteText("1 0 obj <</Type/Catalog/Pages 2 0 R>> endobj\n");
BS.WriteText("2 0 obj <</Type/Pages/Count 1/Kids[3 0 R]>> endobj\n");
BS.WriteText("3 0 obj <</Type/Page/MediaBox[0 0 144 144]/Rotate 0/Resources<</XObject<</Img0 4 0 R>>>>/Contents 5 0 R/Parent 2 0 R>> endobj\n");
BS.WriteText("4 0 obj <</Type/XObject/Subtype/Image/Height 25/Width 24/BitsPerComponent 1/Length 75/ColorSpace[/Indexed/DeviceRGB 1<FF0000FFFFFF>]>> stream\n");
BS.WriteText('ÿÿÿÿÿÿÀmß[}ÑoEÑ[EÑqEßE}ÀUÿñÿÁ«Á¬ÛZcýÖÇÈ"}ÿÕïÀMsß`§Ñ]9ÑNÑE·ßLÇÀA[ÿÿÿÿÿÿ');
BS.WriteText("\nendstream\nendobj\n");
var Pos1 = "000000000"+BS.Position
BS.WriteText("5 0 obj <</Length 101>> stream\n");
BS.WriteText("q\n1 0 0 -1 18 54 cm\n35 0 0 -36 0 36 cm\n/Img0 Do\nQ\nq\n1 0 0 -1 71 144 cm\n70 0 0 -72 0 72 cm\n/Img0 Do\nQ\n");
BS.WriteText("\nendstream\nendobj\n\n");
var Pos2 = BS.Position
BS.WriteText("xref\n0 6\n");
BS.WriteText("0000000000 00001 f \n0000000015 00000 n \n0000000060 00000 n \n0000000111 00000 n \n0000000237 00000 n \n"+Pos1.slice(-10)+" 00000 n \n");
BS.WriteText("\ntrailer\n<</Size 6/Info<</Producer(JScrip2pdf)>>/Root 1 0 R>>\nstartxref\n"+Pos2+"\n%%EOF\n");

BS.SaveToFile("HelloWorldR&W.pdf", 2);
BS.Close();

然而,尽管纯文本可能是最简单的形式,但除了用来证明可能性的概念观点之外,很少使用。其他时候,我们会使用你所称之为“特殊软件”(PDF生成器/编辑器)来压缩文件对象,最常见的是不同的优化二进制流。
因此,一些文本可能是扫描的像素,而另一些文本可能是看起来像字母的线条形状,或者有时是没有字体但有命名样式的普通字母,甚至是在文件中包含字体(嵌入)的字母(首选选项)。
从许多方面来看,每个页面的构建方式可能都不同,因此一般情况下没有两个PDF文件会使用相同的结构,除非像银行对账单那样使用一个几乎每个月都不会变化太多的格式,即使余额有所波动。
因此,总结起来,最好的工具是那个涵盖了Adobe所设想的每一种可能性,并且仍然保持结果是一个有效的Adobe PDF文件。
因此,Acrobat PRO 3D就放在我的书架上(即使从一年到下一年都没有使用过)。
有许多更便宜的编辑器,我经常用于小修改的是Tracker Xchange和FreePDF PRO,它们都有不同的限制。
对于MacOS来说,你的选择会更有限,因此请寻找你愿意支付的最好的选项。

1
谢谢,我明白你说的有很多可能性。我希望像编辑HTML文件一样编辑PDF文件(显然我对PDF的工作原理不是很了解)。但是你不知道是否有一种技术解决方案可以更改源代码(如果可能的话),或者只有应用程序可以完全为您完成此操作,而无法以编码方式进行操作? - Ljonja
看看这个!Apache PDFBox 也很有趣,可以用它来操作 PDF,它似乎可以与 Java 一起使用。 - Ljonja

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