2016-05-16 20 views
0

私は2つのPDFを一緒に結合しました。両方とも100kbですが、それらをまとめると500kbを超えました。 PDFのサイズを圧縮するにはどうすればよいですか?CでPDFを圧縮する

public static string PDFFromLabelData(LabelData label) 
{ 
    string base64String = ""; 
    try 
    { 
     using (var ms = new MemoryStream()) 
     { 
      iTextSharp.text.Document document = new iTextSharp.text.Document(); 
      iTextSharp.text.pdf.PdfWriter writer = iTextSharp.text.pdf.PdfWriter.GetInstance(document, ms); 

      if (label.base64PDFString.Length > 0) 
      { 
       document.Open(); 
       iTextSharp.text.pdf.PdfContentByte cb = writer.DirectContent; 
       iTextSharp.text.pdf.PdfImportedPage page; 

       iTextSharp.text.pdf.PdfReader reader; 
       byte[] byteArray = Convert.FromBase64String(label.base64PDFString); 

       try 
       { 
        reader = new iTextSharp.text.pdf.PdfReader(byteArray); 
       } 
       catch (Exception ex) 
       { 
        throw ex; 
       } 

       int pages = reader.NumberOfPages; 

       // loop over document pages 
       document.SetPageSize(iTextSharp.text.PageSize.A4); 
       document.NewPage(); 

       page = writer.GetImportedPage(reader, 1); 
       cb.AddTemplate(page, 0, 0); 
      } 

      foreach (Bitmap bmp in label.LabelImages) 
      { 
       iTextSharp.text.Rectangle pageSize = null; 
       pageSize = new iTextSharp.text.Rectangle(0, 0, (bmp.Width/bmp.VerticalResolution) * 71, (bmp.Height/bmp.VerticalResolution) * 71); 
       document.SetPageSize(pageSize); 
       document.SetMargins(2, 2, 4, 4); 
       document.NewPage(); 

       if (!document.IsOpen()) 
       { 
        document.Open(); 
       } 

       using (var mm = new MemoryStream()) 
       { 
        bmp.Save(mm, System.Drawing.Imaging.ImageFormat.Jpeg); 

        iTextSharp.text.Jpeg jpg = new iTextSharp.text.Jpeg(mm.ToArray()); 

        jpg.ScaleToFit(pageSize); 
        document.Add(jpg); 
       } 
      } 

      document.Close(); 
      base64String = Convert.ToBase64String(ms.ToArray()); 
     } 
    } 
    catch (Exception e) 
    { 
     throw e; 
    } 

    return base64String; 
} 
+0

Idはクラス内の圧縮特性があると仮定します。あなたはそれを見て見なければなりません。 – CathalMF

+2

あなたが投稿したコードは、まったく新しい空のドキュメントを作成し、別のPDFから最初のページをインポートした後、たくさんのイメージをインポートするためのものです。しかし、これはあなたの問題の記述と実際には一致しません。 –

+0

@CathalMFによれば、 'writer.SetFullCompression()'と 'writer.CompressionLevel = PdfStream.BEST_COMPRESSION'を使って圧縮を試み、改善することができます。そして、@Chrisが言っているように、あなたのコードはあなたの質問とは無関係のようです。 – mkl

答えて

1

Syncfusion Essential PDFを使用して既存のPDFドキュメントを圧縮することができます。ここでは、参考のためにコードスニペットとサンプルを添付しました。これを試してみて、結果をお知らせください。

//Load a existing PDF document 
PdfLoadedDocument ldoc = new PdfLoadedDocument(inputFile); 

//Create a new PDF compression options 
PdfCompressionOptions options = new PdfCompressionOptions(); 

//Compress image. 
options.CompressImages = true; 

//Set the image quality. 
options.ImageQuality = 50; 

//Compress the font data 
options.OptimizeFont = true; 

//Compress the page contents 
options.OptimizePageContents = true; 

//Remove the metadata information. 
options.RemoveMetadata = true; 

//Set the options to loaded PDF document 
ldoc.CompressionOptions = options; 

//Save the document 
ldoc.Save("Output.pdf"); 

//Close the document 
ldoc.Close(true); 

サンプルリンク:Compress Existing PDF document

詳細については、以下のUGのマニュアルを参照してください:

Compress existing PDF documentation

+0

質問は、Syncfusionではなく、iTextSharpについてです。 – mkl

関連する問題