手动编辑(每页的一个)Postscript文件

问题描述 投票:0回答:1

我想(手动)在postscript文件中插入附加的postscript命令,该文件是通过ghostscript的pdf2ps从PDF文件转换而来的。出于测试目的,我使用pdflatex从以下文件创建了一个PDF文件:

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

在转换后的postscript文件中,我进行了以下编辑:

...
%%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更改为字母大小,则会显示以下行:

%%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。实际上,在showpage命令之前插入命令到转换后的postscript文件中(当使用pdf2ps时根本不存在)工作正常。所以我可能已经找到了解决问题的方法。但是,我想了解使用pdf2ps时页面尺寸与它有什么关系。


感谢KenS的建议并参考他对this question的回答,我通过在postscript文件中添加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。)

ghostscript postscript poppler
1个回答
2
投票

PostScript是一种只写语言:-)

说真的,它是一种编程语言。为了理解发生了什么,你需要理解这个程序,在Ghostscript的ps2write设备输出的情况下,这个程序显然是非平凡的。

语法基本上是PDF,带有prolog程序,用PostScript术语解释它。

该程序将使用showpage,它在执行EndStream过程时执行,这是(基本上)当endobj关键字在页面流中进行封装时。你会看到它看起来像:

ET
Q
Q
Q

endstream
endobj
%%Page: 2 2

你可以在endstream和endobj之间放置任何你喜欢的东西,但是你需要知道那时的图形状态是由已经发生的任何操作决定的。这可能包括缩放,演化,倾斜,翻转垂直轴等。因此,只需将一些PostScript插入其中就不太可行了。您可以执行一个initgraphics,它至少会将图形状态重置为已知设置。

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

gs -sDEVICE = pdfwrite -o out.ps -c“showpage”-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文件中的'某些东西'覆盖整个页面,这并不完全不常见。

© www.soinside.com 2019 - 2024. All rights reserved.