2013-07-16 3 views
1

я имею небольшой вопрос о преобразовании различных типов тьфу/изображений в формате TIFF. Мы используем Atalasoft, стороннее программное обеспечение, которое обрабатывает наши документы и изображения в отношении сканирования и просмотра.Преобразование PDF/JPEG в формате TIFF с использованием Atalasoft & C#

Проблемы я столкнулся в том, что я получаю исключение довода в методе TiffDocument(). Он проходит в поток в этот метод. В аргументе Argument Exception указано, что файл не находится в формате TIFF. Это понятно, когда я передаю PDF или JPEG.

Я попробовал многочисленные попытки пытается преобразовать их, но безуспешно. В любое время, когда я пытаюсь преобразовать jpeg в tiff, возникает проблема, потому что изображение является AtalaImage, а не System.Drawing.Image.

Для преобразования JPEG я угнал этот код из раздела комментариев here.

 public static Image ConvertToJpeg(string fileName) 
     { 
      Image retVal = null; 
      using (FileStream fs = File.OpenRead(fileName)) 
      { 
       retVal = ConvertToJpeg(fs); 
       fs.Close(); 
      } 

      return retVal; 
     } 

     /// <summary> 
     /// Converts the specified image into a JPEG format 
     /// </summary> 
     /// <param name="imgStream">The stream of the image to convert</param> 
     /// <returns>An Image with JPEG data if successful; otherwise null</returns> 
     public static Image ConvertToJpeg(Stream imgStream) 
     { 
      Image retVal = null; 
      Stream retStream = new MemoryStream(); 

      using (Image img = Image.FromStream(imgStream, true, true)) 
      { 
       img.Save(retStream, ImageFormat.Jpeg); 
       retStream.Flush(); 
      } 
      retVal = Image.FromStream(retStream, true, true); 

      return retVal; 
     } 
    } 
} 

Кроме того, Atalasoft имеет небольшую инструкцию в отношении конвертации PDF в TIFF, но ArgumentException выбрасывается в методе Save (Сообщение об ошибке: ошибка в ошибке кодека TIFF записи в формате TIFF потока). Приведенный ниже код такой же, как код в ссылке:

TiffEncoder noAppend = new TiffEncoder(TiffCompression.Default, true); 
    PdfDecoder pdf = new PdfDecoder(); 

    for(int i=0; i< numPages; i++) 
    { 
     AtalaImage img = pdf.Read(inStream, i, null); 
     noAppend.Save(outStream, img, null); 
     img.Dispose(); 
     outStream.Seek(0, SeekOrigin.Begin); 
    } 

EDIT: Приведенный выше код работает и успешно преобразует PDF в TIFF.

Кроме того, мне нужно знать, в каком формате находится этот файл, чтобы он мог быть отправлен на соответствующий метод для преобразования. Я пробовал использовать код от this question, но безрезультатно.

Ниже приведен фрагмент того, где происходит волшебство. Существует функция, которая вызывает это, но эта функция устанавливает изображение в WebImageViewer.Image переменной и вызывает метод ниже:

private void Foo(AtalaImage image) 
    { 
     /*I have tried converting here, before the file stream, and after the 
      filestream. */ 
     var url = wiv.ImageUrl; 
     var path = Page.MapPath(url); 
     var frame = wiv.CurrentPage - 1; 

     Stream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read); 

     var doc = new TiffDocument(fs); //This is where the error occurs. 
     var page = new TiffPage(image); 

     doc.Pages[frame] = page; 

     doc.Save(path + "_tmp"); 

     fs.Close(); 

     File.Delete(path); 
     File.Move(path + "_tmp", path); 

     wtv.OpenUrl(url); 
     wtv.SelectedIndex = frame; 

     wiv.OpenUrl(url, frame); 
    } 

Любая помощь или мыслительные процессы будут весьма благодарны.

ответ

1

Я обнаружил, что в программном обеспечении Atalasoft есть JPegDecoder. Чтобы преобразовать изображения, вам нужна аналогичная функция, как PDF-конвертер. TiffDocument() принимает поток как параметр, поэтому он является потоковыми функциями.

private Stream ConvertPDFtoTiff(Stream filestream) 
    { 
     var ms = new MemoryStream(); 

     var noAppend = new TiffEncoder(TiffCompression.Default, true); 
     var pdf = new PdfDecoder(); 

     for (int i = 0; i < 100; i++) 
     { 
      var img = pdf.Read(filestream, i, null); 
      //When the image is null it will break the loop and return the stream. 
      if(img == null) 
      { 
       break; 
      } 
      noAppend.Save(ms, img, null); 
      img.Dispose(); 
      ms.Seek(0, SeekOrigin.Begin); 
     } 

     return ms; 
    } 

    private Stream ConvertJPEGtoTIFF(Stream filestream) 
    { 
     var ms = new MemoryStream(); 
     var jpg = new JpegDecoder(); 
     var saveJpg = new TiffEncoder(); 

     var img = jpg.Read(filestream, null); 
     saveJpg.Save(ms, img, null); 
     img.Dispose(); 
     ms.Seek(0, SeekOrigin.Begin); 

     return ms; 
    }