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

时间:2016-08-01 08:03:35

标签: c# pdf pdf-generation ghostscript

我目前正在使用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();
}

我怎样才能获得所需的页面?

非常感谢提前。

2 个答案:

答案 0 :(得分:1)

您最好的选择是升级到当前最前沿的Ghostscript代码,或直到下一个版本。此功能现在显示在源代码中,请参阅this commit

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

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

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

答案 1 :(得分:0)

我用这种方式解决了我的问题,我有一个列表,其中包含我需要的页码,因此每个页码都调用一次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();
    }
}

在我的情况下,我输入.pdf目录,每个30到60页,每个只需要1到5页,所以在性能方面,这也是我找到的最好的方式,只有我得到的页面希望,希望这可以帮助将来的某个人。