ghostscript.net可以将PDF文件划分为多个部分吗?

问题描述 投票:0回答:2

我有一个非常长的PDF文件(58x500英寸)。目标是将一个大型矢量pdf文件划分为一定百分比。例如,%25 =高125英寸,而宽度保持不变。因此,一个大pdf将分为4页。

ImageMagick能够做到这一点,但如果将dpi更改为300,它就会崩溃。是否可以使用Ghostscript做到这一点?我目前正在使用Ghostscipt.net和C#。

有人可以指出我正确的方向吗?

c# ghostscript ghostscript.net
2个回答
0
投票

[我在评论中提到了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可能会更明智,如果用于打印,很少有人会注意到。

正如大家所说,最好保持向量格式尽可能长。


0
投票

我从假期回来,能够查询以前的答案。这个:

Ghostscript : Crop Certain Area?

演示如何将原始输入文件的一部分呈现为位图。我建议您使用完全相同的技术,但是使用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 dpi的限制因素可能是ImageMagick而不是Ghostscript,我知道Ghostscript能够以1200 dpi或更高的分辨率渲染每个维度几米的输入,尽管它确实可以,需要很长时间才能产生千兆字节的数据。

© www.soinside.com 2019 - 2024. All rights reserved.