C#を使用してPDFに画像を追加

既存のPDFファイルに画像を追加する

PDFページは、リソースと内容のプロパティを含んでいます。例えば、リソースには画像やフォームが含まれ、内容はPDFオペレータのセットによって表されます。各オペレータには名前と引数があります。この例では、PDFファイルに画像を追加するためにオペレータを使用します。

次のコードスニペットは、Aspose.PDF.Drawing ライブラリでも機能します。

既存のPDFファイルに画像を追加するには:

  • Documentオブジェクトを作成し、入力PDFドキュメントを開きます。
  • 画像を追加したいページを取得します。
  • 画像をページのリソースコレクションに追加します。
  • オペレータを使用してページ上に画像を配置します:
    • 現在のグラフィカル状態を保存するためにGSaveオペレータを使用します。
    • 画像を配置する場所を指定するためにConcatenateMatrixオペレータを使用します。
    • Doオペレータを使用してページ上に画像を描画します。
    • 最後に、更新されたグラフィカル状態を保存するためにGRestoreオペレータを使用します。
  • ファイルを保存します。 次のコードスニペットは、PDFドキュメントに画像を追加する方法を示しています。
// 完全な例とデータファイルについては、https://github.com/aspose-pdf/Aspose.PDF-for-.NET をご覧ください
// ドキュメントディレクトリへのパス。
string dataDir = RunExamples.GetDataDir_AsposePdf_Images();

// ドキュメントを開く
Document pdfDocument = new Document(dataDir+ "AddImage.pdf");

// 座標を設定
int lowerLeftX = 100;
int lowerLeftY = 100;
int upperRightX = 200;
int upperRightY = 200;

// 画像を追加するページを取得
Page page = pdfDocument.Pages[1];
// 画像をストリームにロード
FileStream imageStream = new FileStream(dataDir + "aspose-logo.jpg", FileMode.Open);
// ページリソースの画像コレクションに画像を追加
page.Resources.Images.Add(imageStream);
// GSaveオペレータを使用:このオペレータは現在のグラフィックス状態を保存します
page.Contents.Add(new Aspose.Pdf.Operators.GSave());
// RectangleとMatrixオブジェクトを作成
Aspose.Pdf.Rectangle rectangle = new Aspose.Pdf.Rectangle(lowerLeftX, lowerLeftY, upperRightX, upperRightY);
Matrix matrix = new Matrix(new double[] { rectangle.URX - rectangle.LLX, 0, 0, rectangle.URY - rectangle.LLY, rectangle.LLX, rectangle.LLY });
// ConcatenateMatrix(行列を結合)オペレータを使用:画像が配置される方法を定義
page.Contents.Add(new Aspose.Pdf.Operators.ConcatenateMatrix(matrix));
XImage ximage = page.Resources.Images[page.Resources.Images.Count];
// Doオペレータを使用:このオペレータは画像を描画します
page.Contents.Add(new Aspose.Pdf.Operators.Do(ximage.Name));
// GRestoreオペレータを使用:このオペレータはグラフィクス状態を復元します
page.Contents.Add(new Aspose.Pdf.Operators.GRestore());
dataDir = dataDir + "AddImage_out.pdf";
// 更新されたドキュメントを保存
pdfDocument.Save(dataDir);
  • XImageCollection クラスに追加された Replace メソッドのオーバーロード:public void Replace(int index, Stream stream, int quality)
  • XImageCollection クラスに追加された Add メソッドのオーバーロード:public void Add(Stream stream, int quality)

既存のPDFファイルに画像を追加する (Facades)

PDFファイルに画像を追加する別の簡単な方法もあります。 PDFファイルに画像を追加するもう一つの簡単な方法があります。

string imageFileName = Path.Combine(_dataDir, "Images", "Sample-01.jpg");
string outputPdfFileName = Path.Combine(_dataDir, "Example-add-image-mender.pdf");
Document document = new Document();
Page page = document.Pages.Add();
page.SetPageSize(PageSize.A3.Height, PageSize.A3.Width);
page = document.Pages.Add();
Aspose.Pdf.Facades.PdfFileMend mender = new Aspose.Pdf.Facades.PdfFileMend(document);
mender.AddImage(imageFileName, 1, 0, 0, (float)page.CropBox.Width, (float)page.CropBox.Height);
document.Save(outputPdfFileName);

ページに画像を配置してアスペクト比を保持(制御)する

画像の寸法がわからない場合、ページ上の画像が歪む可能性があります。以下の例は、これを避ける方法の一つを示しています。

public static void AddingImageAndPreserveAspectRatioIntoPDF()
{
    var bitmap = System.Drawing.Image.FromFile(_dataDir + "3410492.jpg");

    int width;
    int height;

    width = bitmap.Width;
    height = bitmap.Height;

    var document = new Aspose.Pdf.Document();

    var page = document.Pages.Add();

    int scaledWidth = 400;
    int scaledHeight = scaledWidth * height / width;

    page.AddImage(_dataDir + "3410492.jpg", new Aspose.Pdf.Rectangle(10, 10, scaledWidth, scaledHeight));
    document.Save(_dataDir + "sample_image.pdf");
}

PDF内の画像がカラーか白黒かを識別する

画像のサイズを削減するために、異なるタイプの圧縮を画像に適用できます。画像に適用される圧縮のタイプは、ソース画像のカラースペースに依存します。つまり、画像がカラー(RGB)の場合はJPEG2000圧縮を適用し、白黒の場合はJBIG2/JBIG2000圧縮を適用すべきです。したがって、各画像タイプを識別し、適切なタイプの圧縮を使用することで、最適化された出力を作成できます。

PDFファイルにはテキスト、画像、グラフ、添付ファイル、注釈などの要素が含まれており、ソースPDFファイルに画像が含まれている場合、画像のカラースペースを決定し、PDFファイルのサイズを削減するために適切な圧縮を適用できます。以下のコードスニペットは、PDF内の画像がカラーか白黒かを識別する手順を示しています。

// 完全な例とデータファイルについては、https://github.com/aspose-pdf/Aspose.PDF-for-.NET をご覧ください。
// 文書ディレクトリへのパス。
string dataDir = RunExamples.GetDataDir_AsposePdf_Images();

// グレースケール画像のカウンター
int grayscaled = 0;
// RGB画像のカウンター
int rgd = 0;

using (Document document = new Document(dataDir + "ExtractImages.pdf"))
{
    foreach (Page page in document.Pages)
    {
        Console.WriteLine("--------------------------------");
        ImagePlacementAbsorber abs = new ImagePlacementAbsorber();
        page.Accept(abs);
        // 特定のページ上の画像の数を取得
        Console.WriteLine("Total Images = {0} over page number {1}", abs.ImagePlacements.Count, page.Number);
        // Document.Pages[29].Accept(abs);
        int image_counter = 1;
        foreach (ImagePlacement ia in abs.ImagePlacements)
        {
            ColorType colorType = ia.Image.GetColorType();
            switch (colorType)
            {
                case ColorType.Grayscale:
                    ++grayscaled;
                    Console.WriteLine("Image {0} is GrayScale...", image_counter);
                    break;
                case ColorType.Rgb:
                    ++rgd;
                    Console.WriteLine("Image {0} is RGB...", image_counter);
                    break;
            }
            image_counter += 1;
        }
    }
}

画質の制御

PDFファイルに追加される画像の品質を制御することができます。XImageCollection クラスの Replace メソッドを使用します。

次のコードスニペットは、すべてのドキュメント画像を80%の品質で圧縮を使用するJPEGに変換する方法を示しています。

Aspose.PDF.Document pdfDocument = new Aspose.PDF.Document(inFile);
foreach (Aspose.PDF.Page page in pdfDocument.Pages)
{
    int idx = 1;
    foreach (Aspose.PDF.XImage image in page.Resources.Images)
    {
        using (MemoryStream imageStream = new MemoryStream())
        {
            image.Save(imageStream, System.Drawing.Imaging.ImageFormat.Jpeg);
            page.Resources.Images.Replace(idx, imageStream, 80);
            idx = idx + 1;
        }
    }
}

// pdfDocument.OptimizeResources();

pdfDocument.Save(outFile);