2012-04-30 5 views
2

Я мог преобразовать страницы PDF в изображения. если он составляет менее 50 страниц, он работает быстро ... если есть PDF более 1000 страниц ... он приобретает много времени для завершения. любой может рассмотреть этот код и заставить его работать на большой размер файла ... я использовал PdfLibNet DLL (не будет работать в 4.0) в .NET3.5 здесь мой пример кода:Конвертировать PDF-страницы в изображения более 1000

public void ConverIMG(string filename) 
    {   
     PDFWrapper wrapper = new PDFWrapper(); 
     wrapper.RenderDPI = Dpi; 
     wrapper.LoadPDF(filename); 
     int count = wrapper.PageCount; 
     for (int i = 1; i <= wrapper.PageCount; i++) 
     { 
      string fileName = AppDomain.CurrentDomain.BaseDirectory + @"IMG\" + i.ToString() + ".png"; 
      wrapper.ExportJpg(fileName, i, i, (double)100, 100); 
      while (wrapper.IsJpgBusy) 
      { 
       Thread.Sleep(50); 
      } 
     } 
     wrapper.Dispose();    
    } 

PS: нам нужно разделить страницы и конвертировать в изображения параллельно, и нам нужно получить статус завершен. number of pages and time consumption

+2

Ну, да. Для одного: Thread.Sleep (50) ;? Что с этим. Если вы введете этот блок один раз для каждой из 1000 страниц, то это будет 50 секунд. Почему вы должны это делать? PDFWrapper работает в отдельном потоке? – aquinas

+0

Действительно ли вам нужен Thread.Sleep (50)? Не могли бы вы снизить это до меньшего периода сна? На данный момент вы тратите 5% своего времени. – KingCronus

+0

, если ExportJpg занят при преобразовании PDF в изображения, которые я объявил, чтобы подождать до 50 миллисекунд ... –

ответ

1

Если PDFWrapper ухудшает качество документов, более 50 страниц, это говорит о том, что он не очень хорошо написан. Чтобы преодолеть это, вы можете выполнить преобразование в 50 страницах и обновить PDFWrapper после каждой партии. Существует предположение, что ExportJpg() становится медленнее с количеством вызовов, и его начальная скорость не зависит от размера PDF.

Это только обходное решение для очевидных проблем в PDFWrapper, и правильным решением было бы использовать фиксированную библиотеку. Также я бы предложил Thread.Sleep(1), если вам действительно нужно подождать с уступкой.

public void ConverIMG(string filename) 
{ 
    PDFWrapper wrapper = new PDFWrapper(); 
    wrapper.RenderDPI = Dpi; 
    wrapper.LoadPDF(filename); 
    int count = wrapper.PageCount; 
    for (int i = 1; i <= count; i++) 
    { 
     string fileName = AppDomain.CurrentDomain.BaseDirectory + @"IMG\" + i.ToString() + ".png"; 
     wrapper.ExportJpg(fileName, i, i, (double) 100, 100); 
     while (wrapper.IsJpgBusy) 
     { 
      Thread.Sleep(1); 
     } 

     if (i % 50 == 0) 
     { 
      wrapper.Dispose(); 
      wrapper = new PDFWrapper(); 
      wrapper.RenderDPI = Dpi; 
      wrapper.LoadPDF(filename); 
     } 
    } 
    wrapper.Dispose(); 
} 
+0

@maciej .. я не понял ваш код if (count% 50 == 0) { wrapper.Dispose(); wrapper = new PDFWrapper(); } если мы инициализируем новый объект wrapper = new PDFWrapper(); снова нам нужно загрузить pdf-файл вправо? см., я ищу параллельную обработку .... –

+0

Исправить. Обновлен код. Параллельная обработка также является хорошей идеей, но не так быстро реализована. –

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