将非连续范围的页面转换为图像Ghostscript

本文关键字:转换 图像 Ghostscript 连续 范围 | 更新日期: 2023-09-27 17:59:41

我目前正在使用Ghostscript 9.09在C#中生成图像,我的问题是,如何将非序列范围内的页面转换为仅图像?例如,我的输入是一个30页的.pdf文档,我需要得到第1、4、10和21页。

到目前为止,我所做的是使用-dFirstPage-dLastPage参数,我可以获得范围,例如从第1页到第21页,但这不是最佳的,因为我得到了许多根本不需要的页面,这是我当前的功能:

private void GetPagesAsJpg(string inputFile, string outputFolder, List<int> pagesToConvert)
{
    string ghostScriptPath = @"C:'Program Files (x86)'gs'gs9.09'bin'gswin32.exe";
    String ars = "-dNOPAUSE -dFirstPage=" + pagesToConvert[0] + " -dLastPage=" + pagesToConvert[pagesToConvert.Count - 1] + " -sDEVICE=jpeg -r102.4 -o" + outputFolder + "%d.jpg -sPAPERSIZE=a4 " + inputFile;
    Process proc = new Process();
    proc.StartInfo.FileName = ghostScriptPath;
    proc.StartInfo.Arguments = ars;
    proc.StartInfo.CreateNoWindow = true;
    proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    proc.Start();
    proc.WaitForExit();
}

我怎么能只得到所需的页面?

非常感谢。

将非连续范围的页面转换为图像Ghostscript

您最好升级到当前的出血边缘Ghostscript代码,或者一直升级到下一个版本。此功能现在已存在于源代码中,请参阅此提交

对于Ghostscript的早期版本,您可以编写一个自定义的EndPage处理程序,并在开始处理输入之前通过setpagedevice安装它。EndPage必须提供您想要处理的页码,并且会拒绝那些不匹配的页码。除非你是一个有能力的PostScript程序员,否则你很可能会觉得这很有挑战性。此外,这不会提高任何性能,因为所有渲染操作仍在进行,唯一的区别是渲染的位图没有写入文件。

除此之外,仅对于PDF输入,您可以从上面引用的提交中的PDF_main.ps中提取代码,并将其应用于早期版本的源代码。源版本越旧,在没有进一步修改的情况下工作的可能性就越小,当然,您使用的版本基本上已经有三年的历史了。在那段时间里发生了很多变化,我认为您必须从提交中修改补丁。同样,除非您对PostScript非常了解,否则您可能会发现这是一个挑战。

唯一不涉及从源代码重建Ghostscript的解决方案是使用自定义的EndPage过程,所以如果是我,我会从我们的Git存储库中提取最新的代码并使用它。

我用这种方式解决了我的问题,我有一个包含我需要的页码的列表,所以我为每个页码调用Ghostscript一次,在每种情况下为我想要的页面分配第一个和最后一个页面值,我的函数如下:

private void GetPagesAsJpg(string inputFile, string outputFolder, List<int> pagesToConvert)
{
    foreach (int pag in pagesToConvert)
    {
        string ghostScriptPath = @"C:'Program Files (x86)'gs'gs9.09'bin'gswin32.exe";
        String ars = "-dNOPAUSE -dFirstPage=" + pag + " -dLastPage=" + pag + " -sDEVICE=jpeg -r110 -o" + outputFolder + "%d" + pag + ".jpg -sPAPERSIZE=a4 " + inputFile;
        Process proc = new Process();
        proc.StartInfo.FileName = ghostScriptPath;
        proc.StartInfo.Arguments = ars;
        proc.StartInfo.CreateNoWindow = true;
        proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
        proc.Start();
        proc.WaitForExit();
    }
}

在我的情况下,我有每个30-60页的pdf目录作为输入,每个目录只需要1-5页,所以就性能而言,这也是我找到的最好的方法,只能得到我想要的页面,希望这对未来的人有所帮助。