Быстрая растеризация частей PDF с помощью Ghostscript
В моем приложении на C# я пытаюсь показать документ PDF в навигационном окне с параметрами увеличения, панорамирования и т. Д. Я использую Ghostscript.NET. Похоже, например, что Adobe Acrobat Reader способен отображать только заданную часть страницы, судя по скорости, с которой она движется. Я нашел только способ растеризации всей страницы, что не слишком практично, особенно при высоких уровнях масштабирования. Можно ли сначала обрезать прямоугольник (на основе рассчитанных угловых координат), а затем быстро растеризовать его без остальной части страницы?
Я попробовал следующую команду:
gswin64.exe -sDEVICE=pdfwrite -o C:/work/marked.pdf -dUseCropBox -c "[/CropBox [300 400 400 600] /PAGES pdfmark" -f "c:\big boat.pdf"
Что работает, технически говоря, но, насколько я понял, документ должен быть определен без собственной рамки обрезки, иначе он не будет работать.
1 ответ
Чтобы добавить CropBox (на страницу), вы можете использовать процедуру EndPage, отправив pdfmark в конец страницы вместо начала, он должен перезаписать любой ранее существующий CropBox.
Или, проще говоря, вы можете просто визуализировать часть мультимедиа напрямую, что звучит как то, что вы хотите сделать в первую очередь, и избегает (потенциально длительного) этапа обработки.
Установите размер носителя для области, которую вы хотите визуализировать. А пока давайте предположим, что вам нужен квадрат размером 2 дюйма, на 1 дюйм вверх от нижней части страницы. Итак, мы начинаем с того, что размер носителя составляет 2 дюйма, а затем исправляем, чтобы любой ввод не мог его изменить:
-dDEVICEWIDTHPOINTS=144 -dDEVICEHEIGHTPOINTS=144 -dFIXEDMEDIA
Если вы добавите это к командной строке, которую вы используете для рендеринга PDF-файла, вы увидите, что вы получите 2-дюймовый квадрат. Конечно, сейчас это левый нижний угол страницы, поэтому теперь нам нужно сместить позицию мультимедиа так, чтобы нужная часть находилась на странице. Для этого мы используем PostScript, в частности ключ PageOffet в словаре устройства страницы:
<</PageOffset [-72 0]>> setpagedevice
Обратите внимание, что мы смещаем нижний левый угол страницы, поэтому мы используем -72, мы хотим, чтобы угол уменьшился.
поскольку мы используем PostScript, нам нужно представить его с ключами -c и -f:
-c "<</PageOffset [-72 0]>> setpagedevice" -f
Таким образом, вся командная строка становится:
./gs -dDEVICEWIDTHPOINTS=144 -dDEVICEHEIGHTPOINTS=144 -dFIXEDMEDIA -c "<</PageOffset [-72 0]>> setpagedevice" -f input.pdf
Если вы действительно хотите добавить CropBox и создать PDF-файл, вам нужно добавить процедуру EndPage, которая добавит CropBox на каждую страницу отдельно:
./gs -sDEVICE=pdfwrite -o ./marked.pdf -c "<</EndPage {0 eq {[/CropBox [300 400 400 600] /PAGE pdfmark pop true}{pop false}ifelse}>>setpagedevice" -f "c:\big boat.pdf