пакетное конвертирование и обрезка постскриптума в pdf - PullRequest
5 голосов
/ 03 января 2012

Я знаю едва достаточно, чтобы выжить в этом цифровом мире.

У меня есть много одностраничных файлов постскриптума (графики / изображения), которые я хочу преобразовать в pdf и автоматически обрезать до узкого поля. Я сейчас на Windows (я тоже использую Linux, поэтому не стесняйтесь размещать код для Linux)

В прошлом я добился успеха, объединив Ghostscript gswin32c.exe и Calibre pdfmanipulate.exe. Это, вероятно, знакомый подход для многих здесь.

Но такой подход чреват проблемами по нескольким причинам.

Одна проблема возникла после того, как я «обновился» до 64-битного gswin64c.exe. 32-битная версия gswin32c.exe все еще работает в моей системе, поэтому я не могу жаловаться слишком много.

Другая проблема возникла при работе с файлами postscript, которые, возможно, неправильно закодированы. Кажется, есть, по крайней мере, две проблемы, но я не уверен, кто, если таковые имеются, несет ответственность или если оба. Одна проблема заключается в том, что ограничивающая линия, например, %% BoundingBox: 135 179 484 587 не всегда размещается на второй строке сверху. Я понимаю, что это может быть проблемой. Другая проблема состоит в том, что ограничивающая рамка выше соответствует ориентации «Портрет» в Ghostscript, но кадрирование следует ориентации «Пейзаж». Еще одна проблема, которую я не определил, заключается в том, что для некоторых файлов обрезка кажется довольно случайной.

Итак, вот мой 32-битный подход (который работает для высококачественных файлов), за которым следует 64-битная адаптация, которая не работает (возможно, потому что она вызывает на моем компьютере какой-нибудь скрипт pypdf, а не пропатченный скрипт, предоставленный калибром, если я понимаю https://bugs.launchpad.net/ubuntu/+source/calibre/+bug/800551 и http://www.mobileread.com/forums/archive/index.php/t-103097.html, но я просто догадываюсь и не знаю обходного пути в любом случае):

@echo off echo batch processing with Latex ps2pdf followed by Ghostscript gswin64c.exe and Calibre2 pdfmanipulate.exe for %%I in (*.ps,*.eps) do ( "C:\Program Files\MiKTeX 2.9\miktex\bin\x64\ps2pdf" %%I ) for %%I in (*.pdf) do ( "C:\Program Files (x86)\Ghostscript\gs9.00\bin\gswin32c.exe" -dSAFER -dNOPAUSE -dBATCH
-sDEVICE#bbox "%%I" 2> bounding "C:\Program Files (x86)\Calibre2\pdfmanipulate.exe" crop -o "%%~nICropped32.pdf" -b bounding "%%I" pause "C:\Program Files\Ghostscript\gs9.04\bin\gswin64c.exe" -dSAFER -dNOPAUSE -dBATCH
-sDEVICE#bbox "%%I" 2> bounding "C:\Program Files (x86)\Calibre2\pdfmanipulate.exe" crop -o "%%~nICropped64.pdf" -b bounding "%%I" pause )

Вышеупомянутый 32-битный подход работает с файлами высокого качества, например, Постскриптум уровня 3, созданный PSTricks или стандартным 2D-драйвером Maple, но не для старых файлов, например. Постскриптум уровня 2 (если таковой), созданный классическим драйвером сюжета Maple.

Я нашел обходной путь для некоторых таких файлов. Он заключается в использовании epstopdf из дистрибутива (MiKTeX) LaTeX. Он работает с этими классическими файлами Maple. К сожалению, он не работает с некоторыми другими файлами PostScript, сгенерированными мной несколько лет назад с помощью PSTricks и других программ, таких как Matlab.

И поэтому мне нужно сделать несколько преобразований и выбрать те, которые сработали. Интересно, есть ли у вас предложения, которые облегчили бы мою жизнь? Если я смогу исправить проблемы с BoundingBox и Portrait / Landscape, я должен быть вполне доволен.

Заранее благодарю за любые предложения. Предложение Linux будет приемлемым. Я предпочитаю решение, которое могло бы справиться с разнообразием файлов одним нажатием клавиши «возврат».

И, конечно, я ищу обрезку без потерь, которая заключается только в интерпретации ограничивающего прямоугольника, но не в преобразовании его в (возможно) более низкое качество pdf.

РЕДАКТИРОВАТЬ: Я забыл сказать. Когда я применяю gswin32c / pdfmanipulate к файлу postScript высокого уровня 3, файл с именем «bounding» заполняется такой информацией, как:

%% BoundingBox: 34 128 567 667 %% HiResBoundingBox: 34.364390 128.875004 566.054069 666.071980

В приведенном выше примере файл уже в значительной степени обрезан. Обратите внимание на близость между %% BoundingBox и %% HiResBoundingBox

, но применительно к файлу постскриптума низкого уровня 2 (или так оно и есть), «ограничивающий» файл заполняется:

%% BoundingBox: 189 137 574 467 %% HiResBoundingBox: 189,485994 137,843996 573,299983 466,668478

но ограничивающий прямоугольник действительно должен быть %% BoundingBox: 135 179 484 587 Выше (135 179 484 587) - ограничивающий прямоугольник, предоставленный самим файлом postscript (который я переместил во вторую строку путем вставки копии), и он согласуется с ограничивающим прямоугольником, интерпретируемым Ghostview / Ghostscript в книжной ориентации.

Но Ghostscript полностью игнорирует его ...

Я не знаю, откуда взялись 189 137 574 467 - это очень неправильно ...

РЕДАКТИРОВАТЬ 2.Я хотел бы уточнить несколько моментов в ответ на вопросы Кена:

Привет, Кен, спасибо за ваш ответ,

извините, если мой вопрос был неясным - тем не менее, вы, похоже, понялиПонял суть этого - позвольте мне ответить на ваши вопросы по очереди:

Я не уверен, почему вы используете 2 приложения, должно быть возможно выполнить полное преобразование только с помощью Ghostscript.

Я не нашел способа сделать все это с Ghostscript, поэтому я использовал другой способ.Я нашел предложение Ghostscript / Calibrate здесь, http://www.mobileread.com/forums/archive/index.php/t-72885.html, и в других местах, попробовал его, и оно работало до недавнего времени.

Я не говорю, что невозможно сделать все это с Ghostscript, япросто сказать, что я не нашел способ.

"Одна проблема возникла после того, как я" обновился "до 64-битного gswin64c.exe" Вы не сказали, в чем проблемаВы сообщили об этом как об ошибке?Если люди не сообщают об ошибках, они не исправляются ......

Я дал ссылки, описывающие проблему и отчет об ошибке, здесь: https://bugs.launchpad.net/ubuntu/+source/calibre/+bug/800551, http://www.mobileread.com/forums/archive/index.php/t-103097.html, Моя проблема точно такая же.

Кажется, у вас есть некоторая путаница между программами PostScript и комментариями.Любая строка в программе PostScript, начинающаяся с «%», является комментарием и не влияет на работу программы.Так что комментарии BoundingBox вообще ничего не сделают.

Я позволю себе не согласиться.Возьмите файл postscript, удалите %% Bounding Box, сохраните и откройте его в Ghostview.Ghostview выдает сообщения об ошибках и затем отображает их, не используя информацию ограничивающего прямоугольника, например фигуру, окруженную большим количеством пустого пространства вместо плотно окруженного ограничивающим прямоугольником.Так что да, этот комментарий что-то делает, по крайней мере, в Ghostview.Удалив %% Bounding Box, если вы затем используете Caliber / pdfmanipulate для обрезки PDF-файла, он будет неправильно обрезан в тех случаях, когда наличие %% Bounding Box сработало бы.Так что этот «комментарий» весьма полезен в контексте отображения и обрезки.

Обратите внимание, что для него не требуется указывать вторую строку файла .....

Рекомендуется Adobe.Цитата из Adobe,

"Второй требуемый комментарий заголовка DSC содержит информацию о размере файла EPS и должен присутствовать, чтобы приложение-приложение могло преобразовать и обрезать файл EPS должным образом. Это ограничивающий комментарий."

http://partners.adobe.com/public/developer/en/ps/5002.EPSF_Spec.pdf

Adobe говорит" должен ".Лично мне было все равно, нужно это или нет, если я могу создавать pdf из моих eps, которые правильно ограничены.

В общем, Ghostscript игнорирует комментарии DSC, однако, если вы устанавливаете ProcessDSCк истине, тогда он будет использовать его очень ограниченно (в первую очередь комментарий BoundingBox для установки размера страницы).

с pdfmanipulate он делает все различия между правильно обрезанным pdf и неправильно обрезанным.

Двигаемся дальше.Вы говорите, что используете LaTeX ps2pdf, если у вас уже есть файл PostScript, вы можете отправить его в Ghostscript для преобразования в PDF.Мне не ясно, для чего именно вы используете Ghostscript в этом случае, просто чтобы найти реальную ограничивающую рамку страницы?

да.

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

Я имею в виду, что я нехотите, чтобы процесс кадрирования "растеризовал" (или как он там называется, вы будете знать этот термин) все изображение.Обрезанная часть файла мне не нужна, так что это не большая потеря.Часть файла в кадрировании должна быть такого же качества, что и оригинал.Это общая идея.

Вы можете найти комментарии об этом здесь, в одном месте, где я нашел полезную информацию, http://www.charlietanksley.net/philtex/reading-pdfs-on-portables/

Достаточно легко выполнить преобразование за один проход, если вы знаете нужный размерчтобы обрезать до,

нет, я не знаю размер, поэтому я собираюсь на такие длины, чтобы программное обеспечение рассчитало его для меня, и это, очевидно, не простая вещь, потому что Ghostscript и epstopdfне всегда согласны с оптимальной обрезкой, одна правильно подходит для некоторых файлов, но не для других, другая - для других файлов, но не для некоторых ...

, если вы неЧтобы узнать размер, вы можете сделать это за 2 прохода, используя только Ghostscript, сначала извлекая BoundingBox, как вы это сделали.Это даст вам 4 числа, слева внизу и справа вверху ограничительной рамки (если я правильно помню).Затем вы создаете «перевод» PostScript-операции для перемещения содержимого страницы вниз и влево (так, чтобы оно начиналось с 0,0, левый нижний угол).Вы также создаете запрос устройства страницы, чтобы установить размер страницы, размер которой задается по ширине = справа - слева и высоте = сверху вниз.Отправьте исходный файл вместе с операторами PostScript в Ghostscript и выберите устройство pdfwrite, и вы получите файл PDF.

Пример пакетного файла был бы полезен, если у вас есть один удобный.Я видел несколько примеров, основанных на pdfwrite, и ни один, который я пробовал, не работал.Дьявол кроется в деталях.

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

Все файлы были созданы с помощью таких программ, как Matlab, Maple, PSTricks, и это маловероятно (но, очевидно, нетневозможно) что за пределами области, заданной ограничительной рамкой %%, будут невидимые белые отметки.

Во многих случаях комментарий ограничительной рамки %% содержит всю необходимую информацию, и я хотел бы Ghostscriptили Caliber, или pdfwrite, или кому угодно, чтобы использовать эту информацию.

Я не могу предложить всеобъемлющее решение, не зная больше о том, что вы хотите сделать, и в идеале просматривая один или несколько проблемных файлов.

Это было бы очень легкоКак я могу опубликовать постскрипт файл для вашего просмотра?Это 420 килобайт.

Спасибо, Кен, будем надеяться, что мы сможем найти работоспособное решение.

РЕДАКТИРОВАТЬ 3. Я выявил большую часть проблемы.

Мой файл postscript имеет следующую ограничивающую рамку, довольно близкую к оптимальной обрезке: %% BoundingBox: 135 179 484 587

Когда я запускаю Ghostscript gswin64c / gswin32c для вычисления ограничивающей рамки, а именно

for %%I in (*.ps,*.eps) do ("C:\Program Files\Ghostscript\gs9.04\bin\gswin64c.exe" -dSAFER -dNOPAUSE -dBATCH -dAutoRotatePages=/None -sDEVICE#bbox "%%I" 2> bounding)

Я получаю:

%% BoundingBox: 145 189 475 574 %% HiResBoundingBox: 145.331574 189.485994 474.155986 573.299983

Когда я запускаю ps2pdfзатем Ghostscript gswin64c, то есть

for %%I in (*.ps,*.eps) do ("C:\Program Files\MiKTeX 2.9\miktex\bin\x64\ps2pdf" %%I)
for %%I in (*.pdf) do ("C:\Program Files\Ghostscript\gs9.04\bin\gswin64c.exe" -dSAFER -dNOPAUSE -dBATCH -dAutoRotatePages=/None -sDEVICE#bbox "%%I" 2> bounding)

Я получаю следующую ограничивающую рамку:

%% BoundingBox: 189 137 574 467 %% HiResBoundingBox: 189.395994 137.843996 573.299983 466.668478 1161

Таким образом, проблема в том, что преобразование из ps в pdf с помощью ps2pdf вносит изменение в информацию ограничивающего прямоугольника, что приводит к неправильному кадрированию.Поэтому замена ps2pdf чем-то другим, например, eps2pdf, решает проблему здесь.Конечно, есть и другие решения.Особенно ценными являются решения, включающие только Ghostcript, как это было предложено Кеном и Люзером Дрогом.Их очень ценные (и превосходящие мои быстрые исправления) предложения приведены ниже.Как-то так сработало:

for %%I in (*.eps,*.ps) do ("C:\Program Files\MiKTeX 2.9\miktex\bin\x64\epstopdf" %%I)
for %%I in (*.pdf) do (
"C:\Program Files\Ghostscript\gs9.04\bin\gswin64c.exe" -dSAFER -dNOPAUSE -dBATCH -dAutoRotatePages=/None -sDEVICE#bbox "%%I" 2> bounding
"C:\Program Files (x86)\Calibre2\pdfmanipulate.exe" crop -o "%%~nICropped.pdf" -b bounding "%%I"
)

Ответы [ 5 ]

4 голосов
/ 06 января 2012

Недостаточно места в комментариях, чтобы добавить это, поэтому я боюсь, что выкладываю еще один ответ ....

Причина, по которой BoundingBox выглядит фальшиво для PDF-файла, заключается в возможности PDF-файла.Процесс конвертации.По умолчанию он поворачивает страницы до тех пор, пока большая часть текста не станет горизонтальной, в случае этого файла (и, я полагаю, другие файлы с той же проблемой), это привело к повороту на 90 градусов по часовой стрелке.

Этоозначает, конечно, что ограничивающая рамка также вращается, и проверка значений показывает, что это то, что произошло.Таким образом, BoundingBox является правильным для повернутого PDF-файла .

Теперь я поставил несколько программ PostScript по частной электронной почте, вот что я добавил:

1pass.ps

Это считывает строку BoundingBox из исходного файла PostScript и использует ее для настройки размера страницы и смещения.Вы передаете имя файла для использования, устанавливая 'SourceFileName' Например, с предоставленным вами файлом:

gs -sDEVICE=pdfwrite -sSourceFileName=classic.ps -o out.pdf 1pass.ps

создаст файл с именем out.pdf, который будет результатом чтения BoundingBox, ипреобразование в файл PDF со страницей, обрезанной до этого размера.

%!PS  

%% redefine setpagedevice to prevent changes by the PostScript program  
%% But keep a copy under a different name, so we cna use it.  
/Oldsetpagedevice /setpagedevice load def  
/setpagedevice {pop} bind def  

(File to process is ) print SourceFileName ==  

/SourceFile SourceFileName (r) file def  
/BoxString 65535 string def  
/LLx 0 def  
/LLy 0 def  
/URx 0 def  
/URy 0 def  
/FoundBox false def  

/GetValues {  
  token {                   % read a PostScript token  
    /LLx exch def               % Assume its a number for now  
    token {  
      /LLy exch def  
      token {  
        /URx exch def  
        token {  
          /URy exch def  
          pop                       % Get rid of any remaining string data  
          true              % return success code  
        }{  
          (Failed to read a number from the string) ==  
          false             % return failure code  
        } ifelse  
      }{  
        (Failed to read a number from the string) ==  
        false               % return failure code  
      } ifelse  
    }{  
      (Failed to read a number from the string) ==  
      false                 % return failure code  
    } ifelse  
  } {  
    (Failed to read a number from the string) ==  
    false                   % return failure code  
  } ifelse  
} bind def  

{  
  SourceFile BoxString readline {  
    (%%BoundingBox:) anchorsearch {  
      pop                           %% discard matching string  
      GetValues             %% extract BBox  
      /FoundBox exch def        %% Note success/failure  
      exit                  %% exit this loop  
    } {  
      pop                   %% discard string, no match  
    } ifelse  
  } {  
    (Failed to find a %%BoundingBox comment) ==  
    exit                            %% No more data, exit loop  
  } ifelse  
} loop  

SourceFile closefile            %% close the file  

FoundBox {  
  (LLx = ) print LLx ==  
  (LLy = ) print LLy ==  
  (URx = ) print URx ==  
  (URy = ) print URy ==  
  > Oldsetpagedevice  
  LLx neg LLy neg translate  
  SourceFileName run  
} if  

2pass.ps

Это предназначено для использования в том виде, в котором вы сейчас работаете, оно имеет два преимущества перед 1pass.ps:

  1. Работает как с файлами PDF, так и с файлами PostScript, а также с файлами, которые не содержат комментарий %%BoundingBox.
  2. BoundingBox является точным.

Недостатком является то, что вы должны обрабатывать каждый файл дважды, один раз, чтобы получить ограничивающий прямоугольник, и один раз, чтобы создать файл PDF.

Это принимает два параметра, имя файла, содержащеевывод устройства bbox и имя файла для конвертации.Опять же, используя отправленный файл, вы должны использовать его следующим образом:

Первая команда:

  gs \
   -sDEVICE=bbox \
    classic.ps 2> bounding.txt

Вторая команда:

  gs \
   -sDEVICE=pdfwrite \
   -sBoxFileName=bounding.txt \
   -sPostScriptFileName=classic.ps \
   -o out.pdf \
    2pass.ps

Код PostScript для classic.ps:

%!PS  

%% redefine setpagedevice to prevent changes by the PostScript program  
%% But keep a copy under a different name, so we cna use it.  
/Oldsetpagedevice /setpagedevice load def  
/setpagedevice {pop} bind def  

(Bounding Box parameters in file ) print BoxFileName ==  
(File to process is ) print PostScriptFileName ==  

/BoxFile BoxFileName (r) file def  
/BoxString 256 string def  
/HiResBoxString 256 string def  
/LLx 0 def  
/LLy 0 def  
/URx 0 def  
/URy 0 def  

BoxFile BoxString readline  % Read first line from file  
{  
  /BoxString exch def       % redefine string to be the one we read  
}{  
  (Encountered EOF before newline reading %%BoundingBox) == flush  
} ifelse  

BoxFile HiResBoxString readline % Read first line from file  
{  
  /HiResBoxString exch def      % redefine string to be the one we read  
}{  
  (Encountered EOF before newline reading %%HiResBoundingBox) == flush  
} ifelse  

BoxFile closefile               % close the file  

BoxString (%%BoundingBox:) anchorsearch  
{  
  pop                       % Get rid of the mathcing string  
  token {                   % read a PostScript token  
    /LLx exch def               % Assume its a number  
    token {  
      /LLy exch def  
      token {  
        /URx exch def  
        token {  
          /URy exch def  
          pop                       % Get rid of any remaining string data  
        }{  
          (Failed to read a number from the string) ==  
        } ifelse  
      }{  
        (Failed to read a number from the string) ==  
      } ifelse  
    }{  
      (Failed to read a number from the string) ==  
    } ifelse  
  } {  
    (Failed to read a number from the string) ==  
  } ifelse  
}{  
  print (does not contain a BoundingBox) ==  
} ifelse  

(LLx = ) print LLx ==  
(LLy = ) print LLy ==  
(URx = ) print URx ==  
(URy = ) print URy ==  

> Oldsetpagedevice  
LLx neg LLy neg translate  

PostScriptFileName run  
4 голосов
/ 04 января 2012

Если просто принудительно комментарий BoundingBox будет делать то, что вы хотите, вы можете заменить первый вызов ghostscript текстовым сканером.

Вот sh-версия скрипта выше (не может выдержать эти пути Windows!)

for i in *.pdf ; 
do 
    gs -dSAFER -dNOPAUSE -dBATCH -sDEVICE=bbox "$i" 2> bounding ; 
    pdfmanipulate crop -o "${i%.pdf}-cropped.pdf" -b bounding "$i" ; 
done

И вы можете изменить его, чтобы использовать grep, например:

for i in *.pdf ; 
do 
    grep '%%BoundingBox' "$i" > bounding ; 
    pdfmanipulate crop -o "${i%.pdf}-cropped.pdf" -b bounding "$i" ; 
done

Если бы я пытался сделать это в Windows, я бы установил cygwin и использовал бы тот же сценарий.

2 голосов
/ 04 января 2012

ОК, кратко коснувшись DSC, ваша точка зрения о Ghostview верна, но Ghostview:

  1. не является частью Ghostscript (как это ни удивительно)
  2. приложение, поддерживающее DSC.

Мои комментарии были применимы к языку PostScript и предназначены для объяснения того, почему Ghostscript игнорирует эти комментарии.

Пункт о «втором обязательном комментарии»; он должен присутствовать (для соответствия DSC), он не должен быть второй строкой. Хотя я не удивлюсь, услышав, что некоторые приложения ошибочно требуют этого.

Как правило, устройство вывода PDF в Ghostscript не конвертирует ничего в растры. Есть некоторые редкие исключения, обычно связанные с необычными типами шрифтов или цветовыми пространствами, или при преобразовании PDF с прозрачностью в PDF-версию до поддержки прозрачности (например, PDF / A или PDF / X).

Чтобы создать файл PDF, обрезанный по мере необходимости, из Ghostscript:

 gswin32c ^
  -o out.pdf ^
  -sDEVICE=pdfwrite ^
  -dPAGEWIDTHPOINTS=xx -dPAGEHEIGHTPOINTS=yy ^
  -dFIXEDMEDIA ^
  -c "-x -y translate" ^
  -f input.ps

Вам придется вычислять xx, yy, x и y из возвращенного BoundingBox предыдущего вызова, если ваш файл PostScript еще не содержит эту информацию. Учитывая то, что вы говорите выше, похоже, это так.

В общем случае:

  • xx = urx - llx,
  • уу = уры-лили,
  • x = llx,
  • y = lly

Лучшим решением, вероятно, было бы написать программу PostScript для установки, это достаточно просто сделать.

Вы можете отправить файл по электронной почте на «ken.sharp AT artifex.com» или воспользоваться любым удобным средством передачи файлов и отправить мне URL-адрес. Меня больше всего интересует случай, когда возвращаемый BoundingBox не тот, что вы ожидаете ....

Я посмотрел URL-адреса, которые вы разместили выше, и не вижу ни одного, описывающего проблемы с 64-битной версией Ghostscript. И последний вопрос: какую версию Ghostscript вы используете?

2 голосов
/ 03 января 2012

"В прошлом я добился успеха, объединив Ghostscript gswin32c.exe и Calibre pdfmanipulate.exe. Это, вероятно, многим здесь знакомый подход. "

Я не уверен, почему вы используете 2 приложения, должно быть возможно выполнить полное преобразование только с помощью Ghostscript.

«Одна проблема возникла после того, как я« обновился »до 64-разрядной версии gswin64c.exe»

Вы не сказали, в чем проблема, вы сообщили об этом как об ошибке? Если люди не сообщают об ошибках, они не исправляются ......

Похоже, у вас возникла путаница между программами PostScript и комментариями. Любая строка в программе PostScript, начинающаяся с «%», является комментарием и имеет нет влияния на работу программы. Так что комментарии BoundingBox вообще ничего не сделают.

Тем не менее, существует соглашение (Document Structure Convention, DSC для краткости), которое описывает способ встраивания комментариев в файлы PostScript, которые могут использовать процессоры DSC. Существуют правила, описывающие, как программа должна быть структурирована, чтобы это работало. Если программа PostScript начинает%! PS-Abode-m.n, где m и n являются целыми числами, то она объявляет себя программой, совместимой с DSC, и версия, с которой она совместима, является числом «m.n». В этом случае комментарий BoundingBox не будет использоваться интерпретатором PostScrip, но процессор DSC может использовать его. Обратите внимание, что нет необходимости указывать вторую строку файла .....

Как правило, Ghostscript игнорирует комментарии DSC, однако, если для ProcessDSC задано значение true, он будет использоваться очень ограниченно (в первую очередь комментарий BoundingBox для установки размера страницы).

Двигаемся дальше. Вы говорите, что используете LaTeX ps2pdf, если у вас уже есть файл PostScript, вы можете отправить его в Ghostscript для преобразования в PDF. Мне не ясно, для чего именно вы используете Ghostscript в этом случае, просто чтобы найти реальную ограничивающую рамку страницы?

Мне непонятно, что вы имеете в виду под обрезкой без потерь: если вы обрезаете контент, вы, должно быть, теряете что-то явно, даже если это просто пробел .....

Достаточно просто выполнить преобразование за один проход, если вы знаете размер, который хотите обрезать, если вы не знаете размер, то вы можете сделать это за 2 прохода, используя только Ghostscript, сначала извлекая BoundingBox по мере сделано. Это даст вам 4 числа, слева внизу и справа вверху ограничительной рамки (если я правильно помню). Затем вы создаете «перевод» Операция PostScript для перемещения содержимого страницы вниз и влево (чтобы оно начиналось с 0,0, левый нижний угол). Вы также создаете запрос устройства страницы, чтобы установить размер страницы, размер которой задается по ширине = справа - слева и высоте = сверху вниз. Подайте исходный файл вместе с операторами PostScript в Ghostscript и выберите устройство pdfwrite, и вы получите файл PDF.

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

Я не могу предложить комплексное решение, не зная больше о том, что вы хотите сделать, и в идеале просматривая один или несколько проблемных файлов.

0 голосов
/ 25 октября 2012

Ответ о caliber / pdfmanipulate.exe

Калибр удалил pdfmanipulate.exe из последних выпусков.Я обнаружил, что мне нужно вернуться к версии 0.8.66, чтобы получить pdfmanipulate, я скачал переносную версию: calibre-portable-0.8.66.zip

...