2016-12-14 20 views
0

Здесь уже было немало вопросов и ответов об обрезке документов с помощью Ghostscript. Однако ответы не соответствуют моим конкретным потребностям и до сих пор запутывают меня. Я ожидал, что будет один вариант, например. «-AutoCropToBBox» или что-то в этом роде.Ghostscript: Как автоматически обрезать STDIN в «ограничительную рамку» и писать в PDF?

Для пояснения, как ограничивающий прямоугольник, я понимаю самый маленький прямоугольный ящик, который содержит все (небелые (?)) Напечатанные объекты полностью.

Кроме того, я хочу/должен использовать перенаправление портов принтера (RedMon) для создания обрезанного PDF-файла путем печати на Postcript-принтер из практически любого приложения. Так, под Win7/64bit, я поставил перенаправленные свойства порта: Redirected port properties Win7/64bit

Выход переадресованные C:\Windows\system32\cmd.exe

Аргументы для программы являются:

/c gswin64c.exe -sDEVICE=pdfwrite -o -sOutputFile="%1".pdf -

«% 1 "содержит пользовательский ввод для имени файла. С этим я получаю полностраничный PDF-файл. Отлично!

Но как добавить параметры обрезки?

Дополнительный вопрос: Если у меня есть многостраничный документ, будет ли такое (автоматическое) обрезка индивидуальным для каждой страницы? Или есть возможность сохранить все это, например. как первая страница или как самая большая ограничивающая рамка всех страниц?

Другая связанная с этим проблема: окно для запроса имени файла всегда появляется за приложением, с которого я печатаю. Любые идеи всегда принести его на фронт?

Другой вопрос: Существует Perl-скрипт «ps2eps» и программа bbox.exe (см. http://ctan.org/pkg/ps2eps). Там сказано, что Ghostscript (или ps2epsi) является случайным (?) Вычислением неправильных ограничивающих прямоугольников. Действительно ли это (правда)?

Благодарим за помощь.

+0

FYI вы можете получить bbox, запустив 'gswin64c.exe -sDEVICE = bbox -dBATCH -dNOPAUSE pdfname' –

+0

Спасибо, @Stefan Hegny. То, что я также нашел здесь: 'gswin64c.exe -q -dBATCH -dNOPAUSE -sDEVICE = bbox -dLastPage = 1 GsCrop.ps | findstr %% BoundingBox' Мой вопрос: как я могу использовать эти числа дальше? – theozh

ответ

1

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

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

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

Так вот, простой коммутатор, которого вы хотите, не существует, он нарушит нормальное функционирование интерпретатора для рендеринга.

Итак, первое, что вам нужно сделать, это определить ограничительную рамку содержимого. Вы можете сделать это, как говорит Стефан, используя устройство bbox. И на этом примечании, насколько я знаю, устройство bbox производит точный вывод. Если это не так, мы будем благодарны за сообщение об ошибке, подтверждающее его, чтобы мы могли это исправить. Если люди не сообщают об ошибках, как мы должны знать о них? Его неутешительно видеть, что кто-то распространяет FUD вместо того, чтобы помогать с сообщением об ошибке .......

ps2epsi не Ghostscript, его дрянной дешевый и веселый сценарий, я бы не использовал его. Однако ..... Если исходный PostScript оставляет материал в стеке, он будет поврежден (или недействителен) EPS-файл, и исходный PostScript должен быть исправлен, прежде чем пытаться использовать его, поскольку он нарушит любую программу PostScript, которая пытается (например, если вы включили EPS в документ, а затем распечатали его).

Итак, если вы используете Ghostscript, и хотите взять программу PostScript и получить EPS из нее, используйте устройство eps2write. У него не будет предварительного просмотра, честно говоря, кого это волнует.

Теперь, если я правильно помню запись bbox (и eps2write) всех операций маркировки, вы не можете просто записывать все небелые операции маркировки; что, если белый переписывает существующую метку на странице? Что делать, если носитель не белый? Обратите внимание, что если вы передаете PNG с Ghostscript, нетронутая часть вывода будет прозрачной, тогда как белые метки не будут.

Таким образом, bbox является степенью всех операций маркировки, независимо от цвета. Единственный способ продолжения - сделать контент и подсчитать не-белые пиксели. Но это работает только с определенным разрешением, изменяет разрешение и может также меняться точная ограничивающая рамка.

Как только у вас есть ограничивающая коробка, вы можете указать Ghostscript, чтобы использовать носитель такого размера. Обратите внимание, что почти наверняка также должны перевести источник, так как маловероятно, что контент начнет плотно в нижнем левом углу. Для установки размера носителя вам понадобятся -dDEVICEWIDTHPOINTS и -dDEVICEHEIGHTPOINTS, и вам нужно будет использовать -c и -f для отправки PostScript, чтобы соответствующим образом изменить исходный код. В простых случаях достаточно выполнить «-x-y translate», но если программа выполняет initgraphics, вам придется установить процедуру BeginPage для изменения исходного CTM.

Если вы установили размер носителя с -dDEVICEWIDTHPOINTS и т. Д., То все страницы будут иметь одинаковый размер. Если вы этого не хотите, вам нужно написать процедуру BeginPage для изменения размера каждой страницы в отдельности (вам также нужно будет зацепить setpagedevice и удалить записи/PageSize из словаря.

Я понятия не имею, почему Windows поместив диалоговое окно за активное окно, похоже, он начал делать это с Windows 7 (или, возможно, с Vista). Я не вижу никакого способа изменить это, потому что я не уверен, что вызывает диалог .... .

Лично я предлагаю вам попробовать двухэтапный подход к запуску оригинала через устройство eps2write Ghostscript, а затем взять EPS и создать файл PDF с помощью устройства pdfwrite и переключателя -dEPSCrop. Двойное преобразование плохое, но другие решения хуже. Обратите внимание, что файлы EPS не может быть быть многостраничным, поэтому вам нужно будет создать «n» EPS-файлы из n-страничной программы PostScript, а затем предоставить командную строку, в которой перечислены все файлы EPS в качестве входных данных для устройства pdfwrite.

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

+0

Спасибо @KenS за это подробное объяснение. Я должен переварить это первым и попробовать еще ... – theozh

+0

Я попробовал теперь эту командную строку: '/ c gswin64c.exe -q -sDEVICE = eps2write -sOutputFile ="% 1 ".eps -o - && gswin64c.exe -q -sDEVICE = pdfwrite -dEPSCrop -o "% 1" .pdf "% 1" .eps', который создает EPS и PDF. Оба обрезаны, однако, не с минимально возможным полем. Левая сторона выглядит нормально, сверху и снизу слишком много свободного места. Это ошибка или функция? Справа в моем тестовом файле есть вертикальная строка, которую я не вижу, открываю ли я PDF в AcrobatReader. Ошибка Acrobat? Однако, если посмотреть на EPS и PDF в GSView, я вижу линию. Довольно странно ?! – theozh

+0

Извините, правая сторона кажется тоже нормально. Линия была едва заметна в Acrobat из-за темного фона вокруг страницы. – theozh

0

Как я понял из @KenS объяснений:

  1. Кстати eps2write работ, оно не может или не будет, или фактически не может привести к минимально возможному ограничивающему прямоугольнику
  2. он должен быть 2-ступенчатой процесс через -sDEVICE = BBOX

Итак, теперь я в конечном итоге с помощью следующего процесса «печать» в формате PDF с правильным минимально возможным кадрированием:

REDIR ected порт принтера для cmd.exe C:\Windows\system32\cmd.exe

Аргументы для программы:

/c gswin64c.exe -q -o "%1".ps -sDEVICE=ps2write - && gswin64c.exe -q -dBATCH -dNOPAUSE -sDEVICE=bbox -dLastPage=1 "%1".ps 2>&1 >nul | perl.exe C:\myFiles\CropPS2PDF.pl "%1" 

К сожалению, это требует небольшой скрипт на Perl (назовем его: CropPS2PDF.pl):

#!usr/bin/perl -w 
use strict; 
my $FileName = $ARGV[0]; 
$/ = undef; 
my $Crop = <STDIN>; 

$Crop =~ /%%BoundingBox: (\d+) (\d+) (\d+) (\d+)/s; # get the bbox coordinates 
my ($llx, $lly, $urx, $ury) = ($1, $2, $3, $4); 
print "\n$FileName: $llx, $lly, $urx, $ury \n"; # print just to check 

my $Command = qq{gswin64c.exe -q -o $FileName.pdf -sDEVICE=pdfwrite -c "[/CropBox [$llx $lly $urx $ury]" -c " /PAGE pdfmark" -f $FileName.ps}; 

print $Command; # print just to check 
system($Command); # execute command 

Кажется, что работает ... :-) Усовершенствования приветствуются.

Мои вопросы еще:

  1. Можно ли это сделать как-то без Perl? Просто Win7, cmd.exe и Ghostscript?
  2. Может ли быть способ без записи PS-файла на диск, который мне не нужен? Конечно, я мог бы также удалить его с помощью Perl-скрипта.