2017-02-15 11 views
1

iTextSharp dllを使用して、JpegまたはPngイメージの数をPDFに変換しています。私は変換することができますが、PDFのサイズは非常に心配します。 9枚のJPEG画像(合計サイズ4.5MB)を1枚のpdfに変換すると、12.3MBのPDFサイズが作成されます。以下は変換部分です。.NetでiTetstSharpを使用してPDFサイズを縮小する

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

が実際に 'ファイルへのパスを含む文字列data.FilePath'ありローカルファイルシステムでは?そうであれば、単にiTextSharp.text.Image.GetInstance(data.FilePath)を使用しない理由がありますか?あなたの 'iTextSharp.text.Image.GetInstance(ビットマップ、ImageFormat.Png)'はすべての画像を効果的にPNGに変換するので、通常Jpegの場合はサイズの爆発を意味します。 – mkl

+0

すごいよ!方法で働いて探しています。オフコースはいはいdata.Filepathにはローカルシステムファイルが含まれています。大変ありがとう@mkl –

+0

さて、単なるコメントではなく、実際の答えにしていきます。 – mkl

答えて

2

OPは、このようなiTextSharp Imageオブジェクト作成します。これは、実際に意味することは、元の画像ファイルはビットマップにデコードされ、その後、iTextSharpは次のようにビットマップを使用するように要求されていることである

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

をそれがPNG画像であれば。

JPGイメージの場合、これは通常、イメージを格納するために必要なデータ量が爆発することを意味します。一つはiTextSharp直接手元文脈において、原画像ファイルデータを操作できるようにする必要があり、このようなサイズの爆発を防ぐため

iTextSharp.text.Image instance = iTextSharp.text.Image.GetInstance(data.FilePath); 
関連する問題