Может ли ghostscript. net разделить PDF-файл на несколько разделов? - PullRequest
0 голосов
/ 13 января 2020

У меня очень длинный PDF-файл (58x500 дюймов). Цель состоит в том, чтобы разделить один большой векторный PDF-файл на определенный процент. Например,% 25 = 125 дюймов в высоту, в то время как ширина остается неизменной. Таким образом, один большой PDF-файл будет разделен на 4 страницы.

ImageMagick смог это сделать, но он зависает, если я изменил dpi на 300. Возможно ли это сделать с помощью Ghostscript? Я использую Ghostscipt. net и C#.

Может ли кто-нибудь указать мне правильное направление?

Ответы [ 2 ]

0 голосов
/ 20 января 2020

Я вернулся из отпуска и могу посмотреть мои предыдущие ответы. Этот:

Ghostscript: Обрезать определенную область?

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

Перефразируя ответ здесь:

gs -sDEVICEWIDTHPOINTS=72 -dDEVICEHEIGHTPOINTS=144 -dFIXEDMEDIA -r300 -sDEVICE=pdfwrite -o out.pdf -c "<</PageOffset [-180 -108]>> setpagedevice" -f input.pdf

Создаст «окно» шириной 1 дюйм и высотой 2 дюйма, начиная с 2,5 дюйма слева от оригинала и 1,5 дюйма снизу вверх. Затем он запускает ввод, и все его положения, которые находятся в этом окне, сохраняются, все, что находится за его пределами, отбрасывается.

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

Я должен отметить, что сам Ghostscript прекрасно способен отрисовывать весь PDF-файл в документе. Он использует тот же самый подход списка отображения для очень больших выходных файлов, где он создает (упрощенное) представление исходного ввода и запускает это описание несколько раз. Каждый раз, когда он отображает одну горизонтальную полосу конечного результата, затем перемещается вниз к следующей полосе и т. Д.

IMO, вероятно, что ограничивающий фактор 300 точек на дюйм в вашем исходном опыте - это ImageMagick, а не Ghostscript, я Знайте, что Ghostscript способен отображать входные данные размером в несколько метров в каждом измерении при разрешении 1200 т / д и более, хотя для создания гигабайта данных, конечно же, требуется много времени.

0 голосов
/ 14 января 2020

Я упомянул netvips в комментарии - он будет выполнять прогрессивный рендеринг PDF (он использует poppler, а не ghostscript), поэтому вы можете загрузить всю страницу с разрешением 300 DPI и записать ее в виде четырех огромных растров. файлы.

На самом деле у меня нет C# на этом ноутбуке, но вот что вы бы сделали в Python. Код C# будет почти таким же.

import sys
import pyvips

image = pyvips.Image.image_new_from_file(sys.argv[1], dpi=300, access="sequential")
n_pages = 4

for n in range(n_pages):
    filename = f"page-{n}.tif"
    print(f"rendering {filename} ...")

    y = int(n * image.height / n_pages)
    page_height = int(min(image.height / n_pages, image.height - y))
    page = image.crop(0, y, image.width, page_height)
    page.write_to_file(filename)

access="sequential" переводит libvips в последовательный режим - пиксели будут вычисляться только по требованию из конечной операции записи. Вы должны иметь возможность визуализировать ваше изображение высотой 200 000 пикселей, используя только скромный объем памяти.

Конечно, вам не нужно использовать tif, jpg может быть более разумным, и если это для печати, мало люди заметят.

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

...