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

すべてのPDFページには、リソースとコンテンツのプロパティがあります。リソースには、画像やフォームなどが含まれる場合があり、コンテンツは一連のPDFオペレーターによって表されます。各オペレーターには名前と引数があります。この例では、オペレーターを使用してPDFファイルに画像を追加します。

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

  • Document オブジェクトを作成し、入力PDFドキュメントを開きます。

  • 画像を追加したいページを取得します。

  • ページの getResources コレクションに画像を追加します。

  • オペレーターを使用してページ上に画像を配置します:

  • GSaveオペレーターを使用して、現在のグラフィカル状態を保存します。

  • ConcatenateMatrix オペレーターを使用して、画像の配置場所を指定します。

  • ページに画像を描画するために Do オペレーターを使用します。

  • 最後に、更新されたグラフィカル状態を保存するために GRestore オペレーターを使用します。

  • ファイルを保存します。

次のコードスニペットは、PDFドキュメントに画像を追加する方法を示しています。

package com.aspose.pdf.examples;

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

import javax.imageio.ImageIO;

import com.aspose.pdf.*;
import com.aspose.pdf.facades.PdfFileMend;
import com.aspose.pdf.operators.*;

public class ExampleAddImages {

    private static String _dataDir = "/home/admin1/pdf-examples/Samples/";

    public static void AddImageToExistingPDF() throws IOException {
        // ドキュメントを開く
        Document pdfDocument1 = new Document(_dataDir + "sample.pdf");

        // 座標を設定
        int lowerLeftX = 50;
        int lowerLeftY = 750;
        int upperRightX = 100;
        int upperRightY = 800;

        // 画像を追加したいページを取得
        Page page = pdfDocument1.getPages().get_Item(1);

        // ストリームに画像を読み込む
        java.io.FileInputStream imageStream = new java.io.FileInputStream(new java.io.File(_dataDir + "logo.png"));

        // ページリソースのImagesコレクションに画像を追加
        page.getResources().getImages().add(imageStream);

        // GSaveオペレーターを使用: このオペレーターは現在のグラフィックス状態を保存
        page.getContents().add(new GSave());

        // RectangleとMatrixオブジェクトを作成
        Rectangle rectangle = new Rectangle(lowerLeftX, lowerLeftY, upperRightX, upperRightY);
        Matrix matrix = new Matrix(new double[] { rectangle.getURX() - rectangle.getLLX(), 0, 0,
                rectangle.getURY() - rectangle.getLLY(), rectangle.getLLX(), rectangle.getLLY() });

        // ConcatenateMatrix (行列を連結) オペレーターを使用: 画像の配置方法を定義
        page.getContents().add(new ConcatenateMatrix(matrix));
        XImage ximage = page.getResources().getImages().get_Item(page.getResources().getImages().size());

        // Doオペレーターを使用: このオペレーターは画像を描画
        page.getContents().add(new Do(ximage.getName()));

        // GRestoreオペレーターを使用: このオペレーターはグラフィックス状態を復元
        page.getContents().add(new GRestore());

        // 新しいPDFを保存
        pdfDocument1.save(_dataDir + "updated_document.pdf");

        // 画像ストリームを閉じる
        imageStream.close();
    }

BufferedImageからPDFへの画像追加

Aspose.PDF for Java 9.5.0のリリースから、BufferedImageインスタンスからPDFドキュメントに画像を追加するサポートが導入されました。この要件をサポートするために、次のメソッドが実装されています:XImageCollection.add(BufferedImage image);

    public static void AddingImageFromBufferedImageIntoPDF() throws IOException {
        BufferedImage originalImage = ImageIO.read(new File("anyImage.jpg"));
        Document pdfDocument = new Document();
        Page page = pdfDocument.getPages().add();
        page.getResources().getImages().add(originalImage);
    }

画像を追加するために、FileInputStreamオブジェクトだけでなく、任意のInputStreamを使用できます。したがって、java.io.ByteArrayInputStreamオブジェクトを使用する場合、システム上にファイルを保存する必要はありません:

    public static void AddingImageFromBufferedImageIntoPDF2() throws IOException {
        BufferedImage originalImage = ImageIO.read(new File("anyImage.jpg"));
        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        Document pdfDocument = new Document();
        ImageIO.write(originalImage, "jpg", baos);
        baos.flush();
        Page page = pdfDocument.getPages().get_Item(1);
        page.getResources().getImages().add(new ByteArrayInputStream(baos.toByteArray()));
    }

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

PDFファイルに画像を追加する別の簡単な方法もあります。PdfFileMendクラスのAddImageメソッドを使用できます。AddImageメソッドには、追加する画像、画像を追加するページ番号、および座標情報が必要です。その後、Closeメソッドを使用して更新されたPDFファイルを保存します。

次のコードスニペットは、既存のPDFファイルに画像を追加する方法を示しています。

    public static void AddImageInAnExistingPDFFile_Facades() {
        // ドキュメントを開く
        PdfFileMend mender = new PdfFileMend();

        // テキストを追加するためのPdfFileMendオブジェクトを作成
        mender.bindPdf(_dataDir + "AddImage.pdf");

        // PDFファイルに画像を追加
        mender.addImage(_dataDir + "aspose-logo.jpg", 1, 100, 600, 200, 700);

        // 変更を保存
        mender.save(_dataDir + "AddImage_out.pdf");

        // PdfFileMendオブジェクトを閉じる
        mender.close();
    }

PDFドキュメントに同じ画像を複数回参照として追加

時々、PDFドキュメント内で同じ画像を複数回使用する必要があります。新しいインスタンスを追加すると、生成されるPDFドキュメントが増加します。私たちは、XImageオブジェクトをImages Collectionに追加することをサポートする新しいメソッドXImageCollection.add(XImage)を追加しました。このメソッドは、PDFドキュメントのサイズを最適化するために、元の画像と同じPDFオブジェクトへの参照を追加することを可能にします。

    public static void AddReferenceOfaSingleImageMultipleTimes() throws FileNotFoundException {
        Rectangle imageRectangle = new Rectangle(0, 0, 30, 15);
        Document document = new Document(_dataDir + "sample.pdf");
        document.getPages().add();
        document.getPages().add();
        java.io.FileInputStream imageStream = new java.io.FileInputStream(
                new java.io.File(_dataDir + "aspose-logo.png"));

        XImage image = null;

        for (Page page : document.getPages()) {
            WatermarkAnnotation annotation = new WatermarkAnnotation(page, page.getRect());
            XForm form = annotation.getAppearance().get_Item("N");
            form.setBBox(page.getRect());
            String name;
            if (image == null) {
                name = form.getResources().getImages().add(imageStream);
                image = form.getResources().getImages().get_Item(name);
            } else {
                name = form.getResources().getImages().add(image);
            }
            form.getContents().add(new GSave());
            form.getContents().add(new ConcatenateMatrix(
                    new Matrix(imageRectangle.getWidth(), 0, 0, imageRectangle.getHeight(), 0, 0)));
            form.getContents().add(new Do(name));
            form.getContents().add(new GRestore());
            page.getAnnotations().add(annotation, false);
            imageRectangle = new Rectangle(0, 0, imageRectangle.getWidth() * 1.01, imageRectangle.getHeight() * 1.01);
        }
        document.save(_dataDir + "output.pdf");
    }

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

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

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

    public static void CheckColors() {

        Document document = new Document(_dataDir + "test4.pdf");
        try {
            // PDFファイルのすべてのページを繰り返し処理します
            for (Page page : (Iterable<Page>) document.getPages()) {
                // イメージ配置アブソーバーのインスタンスを作成します
                ImagePlacementAbsorber abs = new ImagePlacementAbsorber();
                page.accept(abs);
                for (ImagePlacement ia : (Iterable<ImagePlacement>) abs.getImagePlacements()) {
                    /* ColorType */
                    int colorType = ia.getImage().getColorType();
                    switch (colorType) {
                    case ColorType.Grayscale:
                        System.out.println("グレースケール画像");
                        break;
                    case ColorType.Rgb:
                        System.out.println("カラー画像");
                        break;
                    }
                }
            }
        } catch (Exception ex) {
            System.out.println("ファイルの読み取りエラー = " + document.getFileName());
        }
    }
}