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

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

%!
%
% From: Jonathan Monsarrat (jgm@cs.brown.edu)
% 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», что выглядит странно заданным c. Но мой вопрос действительно о «невидимой верхней границе». Почему это происходит? Что я делаю неправильно? Почему сценарий, который, по словам парня, который дал его мне, не дает идеальных полей? Он утверждает, что очень долго использовал его в любых условиях, поэтому я не знаю, что с этим делать.

1 Ответ

0 голосов
/ 02 мая 2020

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

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

...