Почему этот файл PostScript/PS создает больше верхнего поля, чем указано?

Сценарий PS берет текстовый документ и создает из него PDF-файл. Большое спасибо @RedGrittyBrick за то, что выкопали этот фрагмент:

%!
%
% From: Jonathan Monsarrat ([email protected])
% Subject: PostScript -> ASCII *and* ASCII -> PostScript programs
% Newsgroups: comp.lang.postscript
% Date: 1992-10-01 04:45:38 PST 
%
% "If anyone is interested, here is an interesting program written by
% Professor John Hughes here at Brown University that formats ASCII
% in PostScript without a machine generator of any kind."
%
%%%
%%% Plan:
%%% Start with an empty string.
%%% For each character in the input stream, 
%%%    check to see if it's a carriage return.
%%%    if so, show the current string and reset it to empty
%%%    if not, add it to the current string.

/Courier findfont 10 scalefont setfont  %% Choose a fixed width font
/lineheight 
currentfont /FontBBox get dup      %% bbox bbox
0 2 getinterval    %% bbox {xm ym}
exch     %% {xm ym} bbox
2 2 getinterval    %% {xm ym} {xM yM}
aload pop    %% {xm ym} xM yM
3 2 roll     %% xM yM {xm ym}
aload pop
currentfont /FontMatrix get  %% xM yM xm ym MAT
transform    %% xM yM xm' ym'
4 2 roll
currentfont /FontMatrix get  %% xm' ym' xM yM MAT
transform    %% xm' ym' xM' yM'
exch pop     %% xm' ym' yM'
sub     %% xm' ym'-yM'
exch pop    %% dy
neg def 

lineheight pstack pop

/str 500 string def   %% Room to store a long string...
/empty 500 string def   %% An empty string to work with
/stringindex 0 def   %% How far we've filled the string
/inch {72 mul } def   %% A useful tool...
/pageheight 11 inch def
/topmargin 1 inch def
/botmargin 1 inch def
/leftmargin 1 inch def
/linesperpage pageheight topmargin sub botmargin sub lineheight div cvi def
/linenumber 1 def   %% the line we're about to write on

/newline {   %% move to a new line; flush page if necessary
   linenumber linesperpage gt {/linenumber 1 def showpage } if
   leftmargin pageheight topmargin sub linenumber lineheight mul sub moveto
   /linenumber linenumber 1 add def
} def

/cleanup {  %% print out the last bit of whatever you had there...
   str show showpage
} def

/startstring {  %% empty the string and reset its counter.
   str 0 empty putinterval
   /stringindex 0 def
} def

/showstring {  %% print the string on a new line and flush it
   newline
   str show 
   startstring
} def

pstack 

/addtostring {  %% put another character in the string, if there's room
   dup 500 gt {pop}{str exch stringindex exch put
   /stringindex stringindex 1 add def} ifelse
} def

%
% Main program: get characters and deal with them
%
{
   currentfile read {}{cleanup exit} ifelse
   dup 10 eq                   %% if it's a carriage return...
      {pop showstring}         %% write out this line of text and start over
      {dup 0 eq         %% if it's an end-of-file mark...
       {exit}                %% stop!
       {addtostring}           %% otherwise, add the character to current string
       ifelse}
      ifelse                   %% Sample data follows.
} loop

В нем есть:

/topmargin 1 inch def
/leftmargin 1 inch def

Но визуально выглядит так, будто верхнее поле составляет 4 дюйма, а не 1 дюйм, как указано в файле. Если я изменю его на 0, готовый PDF-файл визуально будет иметь верхнее поле шириной 1 дюйм. Если я, с другой стороны, изменю левое поле на 0 дюймов, оно дойдет до левой границы. Это не имеет смысла для меня.

Я использую SamutraPDF для открытия файлов PDF.

То, как это визуально выглядит правильно для меня, с правильными, ровными полями сверху/справа/снизу/слева, таково:

/topmargin 0 inch def
/leftmargin 0.8 inch def

Это, согласно коду, должно выглядеть неправильно, но вместо этого выглядит правильно.

Это меня очень беспокоит. Будут ли все остальные видеть мои документы с испорченными полями? Это как-то SumatraPDF делает что-то нестандартное? У него есть ошибка? Что происходит? Добавляет ли PDF невидимое верхнее поле для всех документов по умолчанию?

Должен признаться, что я ничего не понимаю в языке этого файла PostScript. В какой-то момент он упоминает «500», что кажется странно конкретным. Но мой вопрос действительно о «невидимом верхнем поле». Почему это происходит? Что я делаю не так? Почему сценарий, который, по словам парня, который мне его дал, не дает идеальной маржи? Он утверждает, что использовал его в течение очень долгого времени в самых разных средах, поэтому я не знаю, что с этим делать.


person Community    schedule 28.01.2020    source источник
comment
Этот PostScript утверждает, что его страница имеет высоту 11, но не устанавливает это значение. Ваш интерпретатор PS использует другой размер по умолчанию. Вместо этого это может быть 8,5x14, но также может быть и совершенно другое значение, например A4. Вам нужно будет проверить его настройки.   -  person Jongware    schedule 28.01.2020
comment
@ usr2564301 Я думал, что весь смысл PDF в том, что вы всегда получаете копию 1: 1? Нет разницы в ОС/компьютерах/средах/настройках? И что вы подразумеваете под тем, что не устанавливает это значение? Что ты посоветуешь?   -  person    schedule 28.01.2020
comment
В этом файле нет ничего, что устанавливало бы окончательный размер страницы, поэтому будет использоваться размер по умолчанию интерпретатора PS. У вас другие размеры, чем по умолчанию, которые использовались при написании этого кода. Вот почему поля кажутся выключенными.   -  person Jongware    schedule 28.01.2020
comment
@usr2564301 usr2564301 Ну, что мне изменить, чтобы задать указанный размер страницы?   -  person    schedule 28.01.2020
comment
‹‹ /PageSize [‹width› ‹height›] ›› setpagedevice, где ‹width› и ‹height› — количество точек (1/72 дюйма), будет запрашивать определенный размер носителя. То, что вы на самом деле получите, может отличаться в зависимости от политики PageSize. Вы не сказали, как вы создаете файл PDF из PostScript. 500 — это длина скретч-строки. Положение каждой строки на странице определяется путем вычисления, включающего количество строк на странице, заданную высоту страницы и количество напечатанных строк. Но, как говорит usr2564301, нет ничего, что запрашивает определенный размер страницы.   -  person KenS    schedule 28.01.2020
comment
@KenS Но ... Зачем запрашивать? Опять же, разве весь смысл PDF не в том, чтобы все было последовательно? Не зависит от настроек просмотра? На что мне его поменять? Почему он не настроен правильно (видимо)? Изменилось ли что-то между 1992 годом и сейчас, что устарело?   -  person    schedule 28.01.2020
comment
Существует ли неиспорченный PostScript, которому не 28 лет и который явно устарел? Я не знаю, что вы ожидаете, что я сделаю с этим.   -  person    schedule 28.01.2020
comment
Люсина, вы начинаете с PostScript, а не с PDF. PostScript — это язык программирования, то, что у вас есть, — это программа, когда вы ее запускаете, происходит всякое такое. Когда вы делаете из него PDF-файл, он (вроде) делает его замороженную версию. Размер носителя в PDF фиксирован, но какой размер нам следует использовать? Ваша программа не запрашивает размер (это запрос, потому что принтер может не иметь нужного вам размера, то, что он делает, зависит от Политики, он может использовать больший и центральный, меньший и обрезанный, сдаться и попросить о помощи, и т.д). Поскольку вы не запрашиваете размер носителя, вы получаете интерпретатор по умолчанию.   -  person KenS    schedule 28.01.2020
comment
Я не ожидаю, что вы будете что-то делать с этим, я пытаюсь ответить на ваши вопросы. Вероятно, первый вопрос, который я бы задал, это «что вы на самом деле пытаетесь сделать?» И «с какой стати вы пытаетесь использовать для этого PostScript?» PostScript — почтенный язык, хорошо подходящий для определенных приложений, он может быть хорош для того, что вы пытаетесь сделать, а может и нет. Но поскольку вы не сказали нам, чего хотите достичь, все, что мы можем сделать, это ответить на ваши вопросы, что мы и сделали. Если вы дадите нам больше информации, мы сможем помочь лучше.   -  person KenS    schedule 28.01.2020


Ответы (2)


Эта программа postscript 1992 года работает правильно при использовании ps2pdf с ghostscript 9.52 в моем Linux. Высота страницы составляет 11 дюймов, а верхнее поле — 1 дюйм, поэтому первая строка начинается с высоты 10 дюймов. Я проверил это с размером букв, за исключением того, что текст должен начинаться с позиции 10 дюймов даже при разных размерах бумаги. Возможно, SumatraPDF действительно отличается или попробуйте это:

Постскриптум начинает чтение текста с первой строки после «петли». Содержимое этой строки должно быть на высоте 10 дюймов. Если текст начинается после первой строки или если есть несколько пустых строк, то в pdf будет столько пустых строк перед печатью. Поля такие же, как указано по постскриптуму, поэтому ваш ввод должен быть пустыми строками, напечатанными перед началом вашего собственного текста.Убедитесь, что между циклом и вашим текстом, который будет напечатан, нет пустых строк.

person beginner6789    schedule 02.05.2020

Я прочитал эту программу и думаю, что ее можно безопасно изменить, чтобы использовать параметры страницы, определенные средой.

Все, что вам нужно сделать, это закомментировать строку, которая жестко кодирует размер страницы:

%/pageheight 11 inch def

И замените его этой строкой, которая получает высоту от устройства страницы,

/pageheight currentpagedevice /PageSize get 1 get def

Или эта версия, которая использует ограничивающую рамку контура клипа,

/pageheight newpath clippath pathbbox 4 1 roll pop pop pop def

Обратите внимание, что в этой программе нет переноса слов или макета документа. Текст должен иметь явные символы новой строки.

person luser droog    schedule 14.05.2020