0

我正在寻找一种方法来“打印”一些纯文本并将其保存为 PDF 文件,将其覆盖到某种形式的“文具”(可能是另一个 PDF?)上并保存到文件中。

我可以使用 DeskPDF 在 GUI 模式下执行此操作,这很公平,但我的要求是批处理(月末发票运行) - 所以从一个充满文本文件的文件夹开始(invoice-1.txt,invoice -2.txt 等),生成另一个充满 PDF 的文件夹(invoice-1.pdf、invoice-2.pdf 等)。

我可以通过文件删除/文件夹监视作为命令行运行某些东西,或者理想情况下作为 COM-这是从脚本系统以一种称为 MAPPER 的语言运行的。大多数 PDF 转换器似乎都安装为伪打印机,但以批处理模式从 MAPPER 打印到一个似乎效果不佳。

我可以用 MAPPER 注册打印机,但发送给它的任何东西似乎都消失了。

另一种方法似乎是使用 LaTex 之类的东西,这是一座我真的不想爬的山!

外面有这样的吗?我的 Google-fu 在这方面似乎很弱。

4

2 回答 2

1

我会为此使用 tex(latex、pdftex、luatex 等)。FOP 或任何其他 xsl-fo 处理器都会很好。您还可以使用带有普通 postscript 文件的 ghostscript(使用 ps2pdf)。这也相当简单。最后,如果一切都失败了,您可以自己编写 PDF。

使用 COM,您可以使用 word 和 indesign(他们有一个令人讨厌的仅限管理员的限制,也很像 xsl-fop)。还有很多其他工具。

选择真的是你的。

这是一个简单的构建您自己的 Windows 批处理示例(外部参照已损坏,但 acrobat 可以处理):

@echo off

FOR /F "tokens=1,2 delims=;" %%N IN (list.txt) DO (
    call :build_pfd "%%N" "%%O" "%%N"
)
exit /b

:build_pfd  %1 %2 %3 (name adress file)
(
echo.%%PDF-1. 4
echo.1 0 obj
echo.^<^< /Type /Catalog
echo./Outlines 2 0 R
echo./Pages 3 0 R
echo.^>^>
echo.endobj
echo.2 0 obj
echo.^<^< /Type /Outlines
echo./Count 0
echo.^>^>
echo.endobj
echo.3 0 obj
echo.^<^< /Type /Pages
echo./Kids [ 4 0 R ]
echo./Count 1
echo.^>^>
echo.endobj
echo.4 0 obj
echo.^<^< /Type /Page
echo./Parent 3 0 R
echo./MediaBox [ 0 0 595 420]
echo./Contents 5 0 R
echo./Resources ^<^< /ProcSet 6 0 R
echo./Font ^<^< /F1 7 0 R ^>^>
echo.^>^>
echo.^>^>
echo.endobj
echo.5 0 obj
echo.^<^< /Length 73 ^>^>
echo.stream
echo.BT
echo./F1 24 Tf
echo.300 300 Td
echo.^( %~1 ^) Tj
echo.ET
echo.BT
echo.300 276 Td
echo.^( %~2 ^) Tj
echo.ET
echo.endstream
echo.endobj
echo.6 0 obj
echo.[ /PDF /Text ]
echo.endobj
echo.7 0 obj
echo.^<^< /Type /Font
echo./Subtype /Type1
echo./Name /F1
echo./BaseFont /Helvetica
echo./Encoding /MacRomanEncoding
echo.^>^>
echo.endobj
echo.xref
echo.0 8
echo.0000000000 65535 f
echo.0000000009 00000 n
echo.0000000074 00000 n
echo.0000000120 00000 n
echo.0000000179 00000 n
echo.0000000364 00000 n
echo.0000000466 00000 n
echo.0000000496 00000 n
echo.trailer
echo.^<^< /Size 8
echo./Root 1 0 R
echo.^>^>
echo.startxref
echo.625
echo.%%%%EOF
) ^> %3.pdf

假设你有 list.txt

Bob the Builder;On TV
Spiderman;At Daily Bugle

编辑:对上述内容进行一些澄清。虽然 PDF 可以通过压缩二进制格式的数据来尽可能多地制作。它的基本功能非常简单,与 postscript 很相似。您可以在地址中或多或少地找到您想知道的所有信息:

http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdf_reference_1-7.pdf

我生成的文件与简单文本示例中的文件几乎相同。该文件本身包含几个块,最后一个块是快速参考,因此您无需阅读整个文件。它包含每个块的偏移量,以便快速浏览文件。此部分已损坏,但由于文件非常小,因此随机查找不太可能需要它并不重要。

现在您可以很容易地将 2 个块放在同一页面上,这意味着您可以使用任何您想要的 PDF 生成系统打印一个页面,并在顶部手工制作您自己的部分并只修改它。希望这可以帮助。请参阅链接的 pdf 中的“G.6 更新示例”(没有添加不需要是注释)。

基本上,您搜索 pages /Contents 指令并将其更改为

/Contents id1 ver1 R

其中 id1 和 ver1 是指向相关对象的任意数字。将您自己的对象附加为下一个空闲 ID 号并将 /Contents 更改为

/Contents [id1 ver1 R youID 0 R]

这就是你可以做到的方式。

于 2013-11-14T21:20:15.110 回答
1

我一直在使用的是Apache FOP。用java开发,但使用来自命令行。您用 XML 描述页面并使用 FOP 中的二进制文件将它们转换为 PDF。我将 XML 文件用作模板,其中包含从脚本替换的变量。简单、稳定且易于使用。

于 2013-11-14T07:25:00.270 回答