手动编辑(每页)后记文件

时间:2019-02-24 09:50:25

标签: ghostscript postscript poppler

我想(手动)在通过ghostscript的pdf2ps从PDF文件转换的Postscript文件中插入其他Postscript命令。为了进行测试,我使用pdflatex从以下文件创建了PDF文件:

\documentclass[a4paper]{article}
\begin{document}
Mostly empty.
\end{document}

在转换后的脚本文件中,进行以下编辑:

...
%%Page: 1 1
%%PageBoundingBox: 0 0 595 841
%%BeginPageSetup
4 0 obj
<</Type/Page/MediaBox [0 0 595.28 841.89]
/Parent 3 0 R
/Resources<</ProcSet[/PDF]
/Font 8 0 R
>>
/Contents 5 0 R
>>
endobj
%%EndPageSetup
% BEGIN MANUAL EDIT
0 setgray 0 0 moveto 595 841 lineto stroke
% END MANUAL EDIT
5 0 obj
<</Length 257>>stream
q 0.1 0 0 0.1 0 0 cm
0 G
0 g
q
10 0 0 10 0 0 cm BT
/R6 9.9626 Tf
1 0 0 1 139.746 706.129 Tm
[(M)-0.699638(os)-0.399443(t)-0.900585(l)-0.798886(y)-333.819(e)-0.400668(m)-0.300195(p)-0.599165(t)26.0974(y)83.192(.)-0.800112]TJ
154.421 -615.691 Td
(1)Tj
ET
Q
Q

endstream
endobj
pagesave restore
%%PageTrailer
%%Trailer
end
%%EOF

postcipt / PDF文件没有产生对角线,而是(似乎)保持不变。但是,如果我将页面尺寸从A4更改为letter大小,则会显示以下行:

%%Page: 1 1
%%PageBoundingBox: 0 0 612 792
%%BeginPageSetup
4 0 obj
<</Type/Page/MediaBox [0 0 612 792]
...

我显然在这里缺少某些东西(考虑到我对后记的基本了解,这不足为奇)。我的问题是:如何在保持页面尺寸不变的同时使线条出现?

P.S .:我偶然发现的一条评论提到pdftops(来自poppler-utils)在某种意义上要优于pdf2ps。确实,将命令插入转换后的Postscript文件中的紧接showpage命令之前(使用pdf2ps时根本不存在)可以很好地工作。因此,我可能已经找到解决问题的方法。但是,我想了解使用pdf2ps时页面尺寸与它有什么关系。


解决方案

感谢KenS的建议,并参考他对this question的回答,通过在后记文件中添加EndPage过程,我能够达到预期的效果:

<<
/EndPage
{
  exch pop 2 lt
  {
    gsave
    0 0 translate
    0 setgray 0 0 moveto 596 842 lineto stroke
    grestore
    true
  }{false} ifelse
} bind
>> setpagedevice

(假设页面大小为a4。)

1 个答案:

答案 0 :(得分:2)

PostScript是一种只写语言:-)

严重的是,它是一种编程语言。为了了解正在发生的事情,您需要了解该程序,对于Ghostscript的ps2write设备的输出而言,它显然是不平凡的。

语法基本上是PDF,带有一个Prolog程序,可以用PostScript术语对其进行解释。

程序使用showpage,它在执行EndStream过程时执行,即(基本上)在页面流中包含endobj关键字时执行。您会看到它看起来像:

ET
Q
Q
Q

endstream
endobj
%%Page: 2 2

您可以在端点和endobj之间放置任何您喜欢的东西,但是您需要知道,此时的图形状态取决于已经执行的任何操作。这可能包括缩放,调整,倾斜,翻转垂直轴等。因此,仅在其中插入一些PostScript不太可能起作用。您可以进行初始化,至少可以将图形状态重置为已知设置。

作为测试,我运行了Ghostscript的ds ps2write设备,如下所示:

gs -sDEVICE = pdfwrite -o out.ps -c“显示页面” -f

生成PostScript程序,其中(有效)内容为:

%%EndResource
%%EndProlog
%%Page: 1 1
%%PageBoundingBox: 0 0 595 842
%%BeginPageSetup
4 0 obj
<</Type/Page/MediaBox [0 0 595 842]
/Parent 3 0 R
/Resources<</ProcSet[/PDF]
>>
/Contents 5 0 R
>>
endobj
%%EndPageSetup
5 0 obj
<</Length 23>>stream
q 0.1 0 0 0.1 0 0 cm
Q

endstream
endobj
%%Trailer
end
%%EOF

然后按照您的建议或多或少地对此进行了修改:

%%EndPageSetup
0 setgray 0 0 moveto 595 842 lineto stroke
5 0 obj
<</Length 23>>stream
q 0.1 0 0 0.1 0 0 cm
Q

endstream
endobj
%%Trailer

对我来说,这产生了从左下到右上的预期笔画。显然,没有您最初生成的PostScript文件,我无法告诉您您的体验为何不同。 (不,我无法运行乳胶来生产这种东西,即使我这样做,我也无法知道您使用的是哪个版本的Ghostscript和其他工具)。

我的猜测是您PDF文件中的“某些内容”覆盖了整个页面,但这并非完全不常见。