使用GhostScript创建PDF叠加层时,是否可以自动包装文本?

时间:2015-05-20 13:20:49

标签: pdf overlay ghostscript

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

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

2 个答案:

答案 0 :(得分:0)

简短的回答是'不',因为PostScript不能那样工作。您需要自己知道并跟踪PostScript程序中对象的位置和大小。

但是...... PostScript 一种编程语言,所以你可以编写一个PostScript程序来实现这一目标,我希望在这里搜索一下就可以得到一些答案。

否则,搜索comp.lang.postscript UseNet新闻组档案将会启动确定文本字符串宽度的方法,并将其缩短直至适合。

答案 1 :(得分:0)

感谢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。迭代算法很简单:注意输入文本和输入文本的空间。