C# ghostscript.net能否将PDF文件划分为多个部分?

C# ghostscript.net能否将PDF文件划分为多个部分?,c#,ghostscript,ghostscript.net,C#,Ghostscript,Ghostscript.net,我有一个很长的PDF文件(58x500英寸)。目标是将一个大的矢量pdf文件分成一定的百分比。例如,当宽度保持不变时,高度%25=125英寸。因此,一个大型pdf将分为4页 ImageMagick能够做到这一点,但如果我将dpi更改为300,它就会崩溃。是否可以使用Ghostscript执行此操作?我现在正在使用Ghostscit.net和C# 有人能给我指出正确的方向吗?我在一篇评论中提到过——它将进行渐进式PDF渲染(它使用poppler而不是ghostscript),因此你可以以300 D

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

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

有人能给我指出正确的方向吗?

我在一篇评论中提到过——它将进行渐进式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置于顺序模式——像素将仅根据最终写入操作的需要进行计算。您应该能够使用少量内存渲染200000像素高的图像

当然,您不需要使用tif,jpg可能更明智,如果这是用于打印,很少有人会注意到


正如大家所说,最好尽可能长时间地保持矢量格式。

我度假回来,可以查找我以前的答案。这个:

演示如何将原始输入文件的一部分渲染为位图。我建议您使用完全相同的技术,但是使用pdfwrite设备而不是png16m设备,这样您就可以得到一个PDF文件作为输出,从而保持输入的向量性质

因此,用answeer的话来说:

gs -sDEVICEWIDTHPOINTS=72 -dDEVICEHEIGHTPOINTS=144 -dFIXEDMEDIA -r300 -sDEVICE=pdfwrite -o out.pdf -c "<</PageOffset [-180 -108]>> setpagedevice" -f input.pdf
gs-sDEVICEWIDTHPOINTS=72-dDEVICEHEIGHTPOINTS=144-dFIXEDMEDIA-r300-sDEVICE=pdfwrite-o out.pdf-c“setpagedevice”-f input.pdf
将创建一个1英寸宽2英寸高的“窗口”,从原始窗口左侧2.5英寸开始,从底部向上1.5英寸开始。然后它运行输入,窗口内的每个位置都被保留,窗口外的所有位置都被删除

您需要多次这样做,每个部分一次

我应该提到,Ghostscript本身完全能够将整个PDF文件呈现为文档。它对非常大的输出文件使用相同的显示列表方法,在其中创建原始输入的(简化)表示,并多次运行该选项。每次渲染最终输出的一个水平波段,然后向下移动到下一个波段,依此类推


在我看来,在您最初的体验中,300 dpi的限制因素可能是ImageMagick而不是Ghostscript,我知道Ghostscript能够以1200 dpi或更高的速度渲染每个维度数米的输入,当然,生成千兆字节的数据需要很长时间。

ImageMagick使用Ghostscript,它总是光栅化你的PDF。这就是为什么使用如此大的PDF时,内存会以300 dpi的速度耗尽。如果RAM不足,可以调整ImageMagick资源以使用磁盘空间。但我怀疑您是否想要光栅化PDF输出。因此,ImageMagick和Ghostscript都不会保留矢量数据。netvips将进行渐进式PDF渲染(它使用poppler而不是Ghostscript),因此您可以以300 DPI的速度渲染整个页面,并将其写入四个巨大的光栅文件。如果四个大光栅是可以的。正如fmw42所说,您可能更喜欢矢量图像。这样做是可能的,并将内容保留为矢量,但您需要运行PDF 4次才能实现。基本上,每次需要设置固定的媒体大小时,都要将输入的PDF内容翻译到固定的媒体上,然后运行PDF文件。每段重复一次。我不能发布一个答案,因为我正在度假,但如果你在Ghostscript标签中搜索,我以前发布的程序可以提取PDF的一部分。谢谢大家@jcupitt我一定会看看这个。这听起来正是我需要它做的。@KenS这听起来也很有希望。我想知道是否可以读取大PDF文件的一部分,然后写入光栅化文件?这样的话,它只需要阅读PDF一次。这就像一个魅力。非常感谢你。很高兴知道除了鬼脚本还有其他选择。