2017-02-15 17 views
1

Я конвертирую количество изображений Jpeg или Png в PDF, используя dll iTextSharp. Я могу конвертировать, но размер PDF вызывает много беспокойства. Если я конвертирую 9 jpeg-изображений (общий размер 4,5 МБ) в один PDF-файл, он создает размер PDF-файла размером 12,3 МБ. Ниже представлена ​​часть преобразования.Уменьшить размер PDF с помощью iTetstSharp в .Net

private bool CreatePdf(string stFilePath_in, List<ImageData> lstImageData_in, string doctype, string stproCompid) 
    { 
     bool flag = false; 
     StringBuilder builder = new StringBuilder(); 
     try 
     { 
      this.UtilityProgress(lstImageData_in.Count); 
      builder.Append(stFilePath_in); 
      builder.Append(@"\"); 
      builder.Append(lstImageData_in[0].Barcode); 
      builder.Append(".pdf"); 
      Document document = new Document(PageSize.LETTER, 10f, 10f, 42f, 35f); 
      PdfWriter.GetInstance(document, new FileStream(builder.ToString(), FileMode.OpenOrCreate)); 
      document.Open(); 
      IOrderedEnumerable<ImageData> enumerable = from files in lstImageData_in 
                 orderby files.PageNo 
                 select files; 
      if (enumerable != null) 
      { 
       DbFileData data2; 
       foreach (ImageData data in enumerable) 
       { 
        Bitmap bitmap = new Bitmap(data.FilePath); 
        iTextSharp.text.Image instance = iTextSharp.text.Image.GetInstance(bitmap, ImageFormat.Png); 
        if (instance.Height > instance.Width) 
        { 
         float num = 0f; 
         num = 700f/instance.Height; 
         instance.ScalePercent(num * 100f); 
        } 
        else 
        { 
         float num2 = 0f; 
         num2 = 540f/instance.Width; 
         instance.ScalePercent(num2 * 100f); 
        } 
        instance.Border = 15; 
        instance.BorderColor = BaseColor.BLACK; 
        instance.BorderWidth = 3f; 
        document.Add(instance); 
        document.NewPage(); 
        bitmap.Dispose(); 
       } 
       document.Close(); 
       if (doctype == "AR") 
       { 
        //data2.m_stInvoiceNo = lstImageData_in[0].Barcode.Substring(2); 
        data2.m_stInvoiceNo = lstImageData_in[0].Barcode.ToString(); 
        data2.m_doctype = "AR"; 
       } 
       else 
       { 
        data2.m_stInvoiceNo = lstImageData_in[0].Barcode.ToString(); 
        data2.m_doctype = "PO"; 
       } 
       data2.m_stImgLocation = builder.ToString(); 
       string str = DateTime.Now.ToString("MM/dd/yy,hh:mm:ss"); 
       data2.m_dtDate = DateTime.Now.Date; 
       data2.m_stTime = str.Substring(str.IndexOf(",") + 1); 
       data2.m_stcompid = stproCompid; 
       this.OnPdfFileCreationCompleted(data2); 
       return true; 
      } 
      flag = false; 
     } 
     catch (Exception exception) 
     { 
      flag = false; 
      StringBuilder builder2 = new StringBuilder(); 
      builder2.Append(builder.ToString()); 
      builder2.Append(": \t"); 
      builder2.Append(exception.Message); 
      this.m_excepLogger.LogException(builder2.ToString()); 
     } 
     return flag; 
    } 
+1

Is 'data.FilePath' фактически строка, содержащая путь к файлу в локальной файловой системе? Если это так, есть причина, почему вы просто не используете 'iTextSharp.text.Image.GetInstance (data.FilePath)'? Поскольку ваш 'iTextSharp.text.Image.GetInstance (bitmap, ImageFormat.Png)' эффективно преобразует каждое изображение в PNG, что в случае Jpegs обычно означает взрыв в размере. – mkl

+0

Thats great! работая в пути, которую я ищу. И с курса да data.Filepath содержит локальный системный файл. Большое спасибо @mkl –

+0

Хорошо, я сделаю это реальным ответом вместо простого комментария. – mkl

ответ

2

ОП создает iTextSharp Image объект вроде этого:

Bitmap bitmap = new Bitmap(data.FilePath); 
iTextSharp.text.Image instance = iTextSharp.text.Image.GetInstance(bitmap, ImageFormat.Png); 

Что это на самом деле означает, что исходный файл изображения декодируется в растровое изображение, а затем iTextSharp просят использовать растровое изображение как если это был PNG-образ.

В случае изображений в формате JPG это обычно означает, что объем данных, необходимых для хранения изображения, взрывается.

Для предотвращения подобных взрывов размер один должен позволить iTextSharp работать непосредственно с исходными данными файла изображения, в контексте под рукой:

iTextSharp.text.Image instance = iTextSharp.text.Image.GetInstance(data.FilePath);