PDF ファイルを圧縮する方法

## 導入
PDFを圧縮することで、ファイルサイズを小さくし、アップロードや送信、保存をより速く行うことができます。また、ハードディスクの容量も節約できます。大量のPDF文書を頻繁に処理する必要がある場合、例えばファイルアーカイブ、電子メール転送、およびネットワーク共有などの場合、PDFを圧縮する機能を使用することで、作業効率と使いやすさを大幅に向上させることができます。したがって、この記事では、.NETプログラムを使用してPDF文書を圧縮する方法について説明します。サンプルコードには、C#およびVB.NETが含まれます。

## 準備
* [Free Spire.PDF for .NET](https://www.e-iceblue.com/Introduce/free-pdf-component.html#.ZH_ihWdByUk)
* Visual Studio 2022
Free Spire.PDF for .NETをインストールします。
**方法1**：[NuGet](https://www.nuget.org/packages/FreeSpire.PDF)でFree Spire.PDF for .NETをインストールする
Visual Studioを開いて新しいプロジェクトを作成します。次に、「Solution Explorer」で「References」を右クリックし、「Nuget Manage Packages」を選択します。Free Spire.PDF for .NETを検索してインストールします。
**方法2**：手動でSpire.PDF.dllを追加する
[Free Spire.PDF for .NET](https://www.e-iceblue.com/Download/download-pdf-for-net-free.html)をローカルにダウンロードしインストールします。次に、Visual Studioて新しいプロジェクトを作成し、右側の「Solution Explorer」で「References」を右クリックし、「Add Reference」>「Browse」を選択して、インストールパス下のBINフォルダのdllファイルを見つけ、「OK」をクリックして、プログラムに参照を追加します。

## サンプルコード
まず、PdfDocumentオブジェクトを作成し、sample.pdfという名前のPDFファイルをロードします。次に、インクリメンタル更新を無効にし、最適な圧縮レベルを設定します。その後、すべてのページを順番にループ処理し、各ページ内の画像情報を取得し、圧縮された新しい画像で置き換えます。最後に、新しいPDFファイルをoutput.pdfという名前で保存します。
C#：
```c#
using Spire.Pdf;
using Spire.Pdf.Graphics;
using System.Drawing;
using Spire.Pdf.Utilities;

namespace CompressPdf
{
    class Program
    {
        static void Main(string[] args)
        {
            // PdfDocumentクラスのオブジェクトを作成する
            PdfDocument doc = new PdfDocument();

            // PDFファイルのロードする
            doc.LoadFromFile(@"sample.pdf");

            // incremental updateを無効にする
            doc.FileInfo.IncrementalUpdate = false;

            //圧縮レベルを最適に設定する
            doc.CompressionLevel = PdfCompressionLevel.Best;

            //ドキュメント内のページをループブラウズする
            foreach (PdfPageBase page in doc.Pages)
            {
                //PdfImageHelperのオブジェクトを作成する
                PdfImageHelper helper = new PdfImageHelper();

                //特定のページの画像情報セットを取得する
                PdfImageInfo[] imagesInfo = helper.GetImagesInfo(page);

                //コレクション内のすべてのアイテムをループブラウズする
                foreach (PdfImageInfo imageInfo in imagesInfo)
                {
                    //特定の画像を圧縮画像と一緒に配置する           
                    helper.ReplaceImage(imageInfo, CompressImage(imageInfo.Image));
                }

            }

            //ドキュメントを別のPDFファイルに保存する
            doc.SaveToFile("output.pdf");
            doc.Close();
        }

        //画質を低下させることで画像を圧縮する
        private static PdfBitmap CompressImage(Image img)
        {
            PdfBitmap newImage = new PdfBitmap(img);
            newImage.Quality = 10;
            return newImage;
        }
    }
}
```
VB.NET
```vb
Imports Spire.Pdf
Imports Spire.Pdf.Graphics
Imports System.Drawing
Imports Spire.Pdf.Utilities
 
Namespace CompressPdf
    Class Program
        Shared  Sub Main(ByVal args() As String)
            ' PdfDocumentクラスのオブジェクトを作成する
            Dim doc As PdfDocument =  New PdfDocument() 
 
            ' PDFファイルのロードする
            doc.LoadFromFile("sample.pdf")
 
            ' incremental updateを無効にする
            doc.FileInfo.IncrementalUpdate = False
 
            '圧縮レベルを最適に設定する
            doc.CompressionLevel = PdfCompressionLevel.Best
 
            'ドキュメント内のページをループブラウズする
            Dim page As PdfPageBase
            For Each page In doc.Pages
                ' PdfImageHelperのオブジェクトを作成する
                Dim helper As PdfImageHelper =  New PdfImageHelper() 
 
                '特定のページの画像情報セットを取得する
                Dim imagesInfo() As PdfImageInfo =  helper.GetImagesInfo(page) 
 
                'コレクション内のすべてのアイテムをループブラウズする
                Dim imageInfo As PdfImageInfo
                For Each imageInfo In imagesInfo
                    '特定の画像を圧縮画像と一緒に配置する   
                    helper.ReplaceImage(imageInfo, CompressImage(imageInfo.Image))
                Next
 
            Next
 
            'ドキュメントを別のPDFファイルに保存する
            doc.SaveToFile("output.pdf")
            doc.Close()
            System.Diagnostics.Process.Start("output.pdf")
 
        End Sub
 
        '画質を低下させることで画像を圧縮する
        Private Shared Function CompressImage(ByVal img As Image) As PdfBitmap
            Dim NewImage As PdfBitmap =  New PdfBitmap(img) 
            NewImage.Quality = 10
            Return NewImage
        End Function
    End Class
End Namespace
```
![2023-06-06_145344.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/0f402e1a-1fc4-02ae-cf99-c9e5311e00e1.png)