2016-08-01 3 views
0

В настоящее время я генерирую изображения на C# с использованием Ghostscript 9.09, и мой вопрос в том, как я могу преобразовать в изображение только страницы в неселективном диапазоне? Например, мой вклад является 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(); 
    } 
} 

в моем случае я имею в качестве входных данных в формате .pdf каталогов 30 - 60 страниц каждый и принимать только между 1 и 5 страниц в каждой из них, чтобы с точки зрения производительности это также лучший способ я нашел и только получить страницы, которые я хочу, надеюсь, что это поможет кому-то в будущем.

Смежные вопросы