Member 14766911 Ответов: 1

Как создать zip-файл для изображений, преобразованных из PDF в PNG


Я хочу сохранить файлы, преобразованные из PDF в PNG, в zip-файле. До сих пор я могу конвертировать один PDF-документ в формат PNG, но если PDF имеет несколько страниц, мое приложение только скрывает и сохраняет их по отдельности (по одному за раз), в котором мне приходится неоднократно нажимать кнопку Сохранить, прежде чем будет сохранена следующая страница из PDF и т. д.

Что я уже пробовал:

Я использую Syncfusion для преобразования документов и DotNetZip для архивирования файлов. Вот мой код:

//Loaded PDF file
  PdfLoadedDocument loadedDocument = new PdfLoadedDocument(TxtBox_FileName.Text);

 //ExportAsImage method returns specified page in the PDF document as Bitmap image 
 Bitmap[] images = loadedDocument.ExportAsImage(0, loadedDocument.Pages.Count - 1);

Image imageToConvert = null;
for (int i = 0; i < images.Length; i++)
{
  if(i == 0)
  {
    //Save converted image if PDF is single page
    imageToConvert = images[i];

    SaveFileDialog _saveFile = new SaveFileDialog();
    _saveFile.Title = "Save file";
    _saveFile.Filter = "PNG|*.png";
    _saveFile.FileName = Lbl_FileName.Text;

    if (_saveFile.ShowDialog() == DialogResult.OK)
    {
      imageToConvert.Save(_saveFile.FileName, ImageFormat.Png);

       loadedDocument.Close(true);

       imageToConvert.Dispose();
     }
  }
  else
  {
     //Save converted images if PDF is multi-page
     Image imageToConvert2 = images[i];

     SaveFileDialog _saveFile = new SaveFileDialog();
     _saveFile.Title = "Save file";
     _saveFile.Filter = "PNG|*.png";
     _saveFile.FileName = Lbl_FileName.Text;
     if (_saveFile.ShowDialog() == DialogResult.OK)
     {
        imageToConvert2.Save(_saveFile.FileName, ImageFormat.Png);

         //Create a zip file for all the images 
         string fileName = TxtBox_FileName.Text;
         Thread thread = new Thread(t =>
         {
           using (ZipFile zip = new ZipFile())
           {
              FileInfo fileInfo = new FileInfo(fileName);
              zip.AddFile(fileName);
              DirectoryInfo di = new DirectoryInfo(fileName);
              zip.Save(string.Format("{0}/{1}.zip", di.Parent.FullName, fileInfo.Name));
           }
           })
           { IsBackground = true };
           thread.Start();
          }
          loadedDocument.Close(true);

          imageToConvert2.Dispose();               
     }
 }


Большое вам спасибо за вашу помощь!

Richard MacCutchan

Вы создаете новый zip-файл для каждого изображения. Вы должны создать zip-файл до начала цикла и добавить в него все изображения по мере их преобразования.

Maciej Los

Звучит как ответ.

Richard MacCutchan

На самом деле это всего лишь предположение. :)

Member 14766911

Привет, спасибо за ваше предложение. Я переместил цикл и коды saveFileDialog и поместил их внутрь - там, где я создаю zip-файл, но у меня все еще есть тот же результат.
Он по-прежнему преобразует все страницы в формате PDF в изображения, но мне приходится постоянно нажимать на кнопку Ok, когда появляется следующее окно SaveFileDialog, чтобы сохранить следующее изображение, которое было преобразовано.

Richard MacCutchan

Это происходит потому, что вы пытаетесь сохранить его каждый раз, когда добавляете изображение в zip; вы не должны делать этого, пока цикл не закончится.

1 Ответов

Рейтинг:
1

Maciej Los

Цитата:
..если PDF имеет несколько страниц, мое приложение только кроет и сохраняет их по отдельности (по одной за раз), в которых я должен несколько раз нажать кнопку Сохранить, прежде чем будет сохранена следующая страница из PDF и т. д.


А знаете что WYWIWYG аббревиатура означает?
- Вшляпа Yоу Вобряд Яс Вшляпа Yоу Ги.

Измените свой код соответствующим образом, чтобы вызвать метод save только один раз.

Совет:
Я бы предложил это сделать:
1. Создайте временную папку для документа ech pdf;
2. сохраните все изображения (используя соглашение об именовании: $"page{i}") в этот каталог;
3. zip весь каталог в один архивный файл;
4. Удалите временную папку.


Удачи вам!