пакетное преобразование и обрезка postscript в pdf

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

У меня много одностраничных postscript-файлов (графики/изображения), которые я хочу преобразовать в 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 на моей машине, а не исправленный скрипт, предоставленный calibre, если я понимаю 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-битный подход работает на высококачественных файлах, например, Postscript уровня 3, созданных PSTricks или стандартным 2D plot драйвером Maple, но не работает на старых файлах, например, Postscript уровня 2 (если это так), созданных классическим plot драйвером Maple.

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

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

Заранее благодарю вас за любые предложения. Предложение по linux было бы приемлемым. Мое предпочтение будет отдано решению, которое сможет обрабатывать разнообразие файлов одним нажатием клавиши "return".

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

EDIT: Я забыл сказать. Когда я применяю gswin32c/pdfmanipulate к высококачественному postscript-файлу уровня 3, файл с именем "bounding" заполняется информацией следующего содержания:

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

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

но при применении к низкокачественному файлу уровня 2 (или так он утверждает) postscript, "ограничивающий" файл заполняется:

%%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 в ориентации Portrait.

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

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

EDIT 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, если вы затем используете Calibre/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 в true, то он будет использовать их очень ограниченно (в основном комментарий 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 'translate', чтобы переместить содержимое страницы вниз и влево (так, чтобы оно начиналось с 0,0, левого нижнего угла). Также создается запрос устройства страницы для установки размера страницы, размер задается шириной = справа - слева и высотой = сверху - снизу. Передайте исходный файл вместе с операторами PostScript в Ghostscript и выберите устройство записи pdf, и вы получите PDF-файл.

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

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

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

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

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

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

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

EDIT 3. Я определил большую часть проблемы.

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

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

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

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

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
задан PatrickT 5 January 2012 в 22:42
поделиться