使用 GhostScript 创建 PDF 叠加层时,我可以让文本自动换行吗?

Can I have text wrapped automatically when creating a PDF overlay with GhostScript?

我正在尝试使用脚本将几行文本添加到 PDF 表单中。我无法控制表单的创建并且它不可编辑,但我发现问题“can I use Ghostscript to overlay a text (fax) header onto a PDF and/or TIFF?”的答案几乎解决了我的问题。除了我偶尔需要换行插入的文本,以便它分成两行。 我事先知道目标的宽度"box"。

我目前正在使用 GhostScript 和 pdfwrite,例如: gs -o /tmp/desc.$$.pdf -sDEVICE=pdfwrite -c "/Helvetica findfont 9 scalefont setfont" -c "87 328 moveto () show showpage"

简短的回答是 'no',因为 PostScript 不是这样工作的。您应该自己了解并跟踪 PostScript 程序中对象的位置和大小。

但是.... PostScript 一种编程语言,因此您可以编写一个 PostScript 程序来执行此操作,我希望在此处搜索 SO 可以得到一些答案。

否则搜索 comp.lang.postscript UseNet 新闻组存档将找到确定文本字符串宽度并将其缩短直到适合的方法。

感谢KenS给了我希望。我去了新闻组,根据我主要在 http://computer-programming-forum.com/36-postscript/509be34895135813.htm 中找到的内容,我在这里给出了一个 MWE:

DESCRIPTION="This Text is so long that I decided to break it into multiple lines. "
XCOORD=88
YCOORD=328
TEXTWIDTH=100

read -d '' WRAPFUNCTION << EOF
/Helvetica findfont 9 scalefont setfont
/wordbreak ( ) def
/linewidth $TEXTWIDTH def
/cwz {/curwidth 0 def} def
cwz
/nlwrap { /y y 12 sub def x y moveto nextword show ( ) show } def
/wrap { /text exch def
      {text wordbreak search
         {/nextword exch def pop
          /text exch def
          /wordwidth nextword stringwidth pop def
          /breakwidth wordbreak stringwidth pop def
          curwidth wordwidth add linewidth gt
            {nlwrap /curwidth wordwidth breakwidth add def}
            {nextword show ( ) show /curwidth curwidth wordwidth add
breakwidth add def }
            ifelse
          }
            {pop exit}
          ifelse
      }loop
    }def
/x $XCOORD def
/y $YCOORD def
x y moveto ($DESCRIPTION) wrap
showpage
EOF

gs -o desc.pdf -sDEVICE=pdfwrite -c "$WRAPFUNCTION"

该函数基本上逐字逐句,如果下一个字超过 TEXTWIDTH,则执行 CRLF。迭代算法很简单:注意输入文本的和处的 space。