2016-08-01 66 views
0

我目前使用Ghostscript 9.09在C#中生成图像,我的问题是,如何才能将图像转换为非连续范围内的页面? 例如,我输入的是一个30页的文件.PDF,我需要拿到1,4,10和21将非连续范围的页面转换为图像Ghostscript

我迄今所做的是与-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(); 
} 

如何我可以只获取所需的页面吗?

非常感谢提前。

回答

1

最好的办法是升级到目前流血的Ghostscript代码,或者直到下一个版本。此功能现在出现在源代码中,请参阅this commit

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

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

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

+0

感谢您的回答,它帮助我理解了一个更好的Ghostscript和我目前的可能性,我已经解决了我的问题。 – JCO9

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(); 
    } 
} 

在我来说,我已经是30个输入.PDF目录 - 60个每页面只需要每次他们每个人的页面1和5之间,在性能方面,这也是我发现的最好方式并只能得到我想要的网页,希望这可以帮助未来的人。