Быстрая растеризация частей PDF с помощью Ghostscript - PullRequest
0 голосов
/ 30 октября 2018

В моем приложении 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 Ответ

0 голосов
/ 30 октября 2018

Чтобы добавить 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
...