2

我正在尝试使用带有 Ghostscript 解释器的 PostScript 解析 .txt 文件。.txt 文件是我需要从中提取日期戳的各种日志文件。文件中会有一行,例如“日期:[01-May-2011 06:41:52]”。我试图简单地将“01-May-2011 06:41:52”部分(不带括号等)输出到 PDF。

我的 PostScript 代码:

/grabdate {


linehold ([) search {  pop pop           % get everything after brackets
(]) search   {exch pop exch pop          % get everything before brackets

== flush 

} {pop} ifelse
} {pop} ifelse
} def


/strrx 256 string def                    % temp line stash
/filename (C:\\path\\to\\file.txt) def

filename (r) file /myworkfile exch def   % name of opened file

{myworkfile strrx readline {/linehold exch store grabdate} 
{myworkfile closefile exit} ifelse

} loop

在命令提示符下使用 Ghostscript 我发出命令:

gswin32c \
  -q \
  -dNOPAUSE \
  -dBATCH \
  -sOutputFile=out.pdf \
  -sDEVICE=pdfwrite myfile.ps

PostScript 代码部分有效,因为它将正确解析的“日期”行输出到标准输出(因为== flush),但我的问题是,我似乎无法让“grabdate”操作写入相同的“日期”字符串到 PDF,而不是到标准输出。我可以使用一组 PostScript 命令来执行此操作吗?我在这里想念什么?

任何帮助表示赞赏。

4

1 回答 1

3

'==' 运算符专门将输出发送到 stdout,它不是 'marking 运算符,即它在输出页面上不做任何标记。

Ghostscript 读取 PostScript 并解释程序,任何标记操作都作为图形基元提供给输出设备,并且设备决定如何处理它。在 pdfwrite 的情况下,它会将 PDF 标记操作(相当于 PostScript 操作)写入输出文件。

显然,非标记运算符不产生图形基元,因此它们不会传递给设备。

如果你想让你的'grabdate'例程在页面上写入文本,那么你必须选择一种字体,(可能重新编码)缩放它,设置当前点然后使用显示操作符发出文本。您必须跟踪当前点,如果它移动到页面边界之外,请采取行动(重新定位,或发出显示页面并开始新页面)

您应该查看 PostScript 运算符;findfont、scalefont、selectfont、setfont、moveto(及其变体 rmoveto)、currentpoint、stringwidth 以及整个显示运算符系列(show、widthshow、ashow、awidthshow、cshow、kshow、xshow、yshow、xyshow、glyphshow)。

您当前的程序不会在许多 PostScript 解释器上“工作”(在产生任何输出的意义上),因为您从不发出显示页面。你也应该这样做。

于 2013-06-04T07:29:23.937 回答