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来说,你的选择会更有限,因此请寻找你愿意支付的最好的选项。