Я знаю едва достаточно, чтобы выжить в этом цифровом мире.
У меня есть много одностраничных файлов постскриптума (графики / изображения), которые я хочу преобразовать в 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"
)