【问题标题】:Edit (every page of a) Postscript file manually手动编辑(每页)Postscript 文件
【发布时间】:2019-02-24 09:50:24
【问题描述】:

我想(手动)在 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

postscipt/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 命令(使用pdf2ps 时根本不存在)之前将命令插入到转换后的postscript 文件中效果很好。所以我可能已经找到了解决我的问题的方法。但是,我想了解使用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】:

    PostScript 是一种只写语言 :-)

    说真的,它是一种编程语言。为了了解发生了什么,您需要了解该程序,对于 Ghostscript 的 ps2write 设备的输出而言,该程序显然很重要。

    语法基本上是 PDF,有一个 prolog 程序以 PostScript 术语解释它。

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

    ET
    Q
    Q
    Q
    
    endstream
    endobj
    %%Page: 2 2
    

    您可以在 endstream 和 endobj 之间放置任何您喜欢的东西,但您需要注意,此时的图形状态是由已经发生的任何操作决定的。这可能包括缩放、演说、倾斜、翻转垂直轴等。因此,简单地将一些 PostScript 插入其中是不可能的。您可以做一个 initgraphics 至少将图形状态重置为已知设置。

    作为测试,我运行了 Ghostscript 的 sd 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 文件,我无法告诉您为什么您的体验会有所不同。 (不,我无法运行 Latex 来生成这样的东西,即使我这样做了,我也无法知道您使用了哪个版本的 Ghostscript 和其他工具)。

    我的猜测是你的 PDF 文件中的“某些东西”覆盖了整个页面,这并不罕见。

    【讨论】:

    • 谢谢!我试图通过查找页面描述中的命令(q、Q、g、G、Td...)的定义来了解发生了什么(我也将它添加到我的原始帖子中)。至少其中之一 (/Td{translate 0 0 moveto}bind def) 确实转换了坐标系。我还注意到,在评论对象(5 0 objendobj)时,会绘制线条,但有效页面大小似乎是字母大小而不是 a4。所以看来你的猜测是正确的,除非我能弄清楚在哪里可以利用非平凡的代码,否则我很不走运(即使用 pdf2ps)。 :-/
    • 正如我所说,您可以在 endobj 之前的 endstream 之后将“initgraphics”粘贴到代码中。但是,除了简单地编辑文件之外,还有更多方法可以更改输出,具体取决于您要达到的目标。例如,您可以提供 BeginPage 或 EndPage 过程。如果这对你有用,你就不必编辑文件,它也可以在任何 2 级或更好的 PostScript 打印机上工作(基本上除了博物馆展览之外的任何东西)。
    • initgraphics 没有任何区别。但是指向 BeginPage/EndPage 过程的指针正是我想要的:最后我想在(外部提供的)PDF 文件的每一页上放置一个条形码;我试图将其归结为原始问题中的一个更基本的问题。我可能应该提到我的最终目标......非常感谢您指导我找到解决方案! (我会将您的答案标记为解决方案并将其添加到我的帖子中。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 2016-03-22
    • 2019-04-25
    • 2018-07-06
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多