2016-08-01 49 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之間,在性能方面,這也是我發現的最好方式並只能得到我想要的網頁,希望這可以幫助未來的人。