Редактировать (каждую страницу) файл Postscript вручную - PullRequest
0 голосов
/ 24 февраля 2019

Я хочу (вручную) вставить дополнительные команды postscript в файл postscript, который был преобразован из файла PDF с помощью pdf2ps ghostscript.В целях тестирования я создал файл PDF из следующего файла, используя pdflatex:

\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]
...

Я, очевидно, что-то здесь упускаю (что неудивительно, учитывая мои элементарные знания постскриптума).У меня вопрос: как мне сделать так, чтобы линия отображалась без изменений размеров страницы?

PS: комментарий, на который я наткнулся, упомянул, что pdftops (из poppler-utils) в некотором смысле превосходит pdf2ps.Действительно, вставка команд в преобразованный файл postscript непосредственно перед командой showpage (которой вообще нет при использовании pdf2ps) работала нормально.Так что я, наверное, уже нашел решение своей проблемы.Тем не менее, я хотел бы узнать, что размеры страницы связаны с ним при использовании pdf2ps.


Решение

Благодаря совету KenS и обращению к его ответу на этот вопрос Мне удалось достичь желаемого эффекта, добавив процедуру EndPage в файл postscript:

<<
/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 голосов
/ 24 февраля 2019

PostScript - это язык только для записи: -)

Серьезно, это язык программирования.Чтобы понять, что происходит, вам нужно понять программу, которая в случае вывода с устройства Ghostscript ps2write явно нетривиальна.

Синтаксис в основном PDF, с прологовой программой, котораяинтерпретирует его в терминах PostScript.

Программа будет использовать showpage, она делает это при выполнении процедуры EndStream, то есть (в основном), когда ключевое слово endobj находится в потоке страницы.Вы увидите, что это выглядит так:

ET
Q
Q
Q

endstream
endobj
%%Page: 2 2

Вы можете поместить все что угодно между конечным потоком и конечным узлом, но вы должны знать, что графическое состояние в этой точке определяется тем, какие операции имеютуже состоялось.Это может включать в себя масштабирование, рутирование, создание каркаса, переворот по вертикальной оси и т. Д. Поэтому просто вставить туда немного PostScript вряд ли удастся.Вы можете создать initgraphics, которая, по крайней мере, сбросит графическое состояние до известной настройки.

В качестве теста я запустил устройство Ghostscript'sd ps2write следующим образом:

gs -sDEVICE = pdfwrite -oout.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 перезаписало всю страницу, это не редкость.

...