[java] PDF 파일에서 이미지 해상도 변경하기(Java Apache PDFBox 사용)

PDF 파일에서 이미지를 추출하고 해당 이미지의 해상도를 변경해야 하는 경우가 있습니다. Java에서는 Apache PDFBox를 사용하여 이 작업을 수행할 수 있습니다.

1. Apache PDFBox 설치

Apache PDFBox는 Apache Software Foundation에서 개발된 Java 기반의 오픈 소스 라이브러리입니다. 이를 사용하여 PDF 파일을 다룰 수 있습니다.

Maven을 사용하고 있다면, pom.xml 파일에 다음 의존성을 추가합니다:

<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.24</version>
</dependency>

Maven을 사용하지 않는다면, Apache PDFBox 다운로드 페이지에서 jar 파일을 직접 다운로드 받아서 사용할 수 있습니다.

2. 이미지 해상도 변경하기

다음은 PDF 파일에서 이미지를 추출하고 해당 이미지의 해상도를 변경하는 Java 코드입니다:

import org.apache.pdfbox.contentstream.PDFGraphicsStreamEngine;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.graphics.PDXObject;
import org.apache.pdfbox.pdmodel.graphics.image.PDImage;
import org.apache.pdfbox.util.Matrix;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class ImageResolutionChanger {

    public static void main(String[] args) {
        try {
            // PDF 파일 로드
            PDDocument document = PDDocument.load(new File("input.pdf"));

            // 각 페이지에서 이미지 추출 및 해상도 변경
            for (PDPage page : document.getPages()) {
                PDResources resources = page.getResources();
                for (COSName xObjectName : resources.getXObjectNames()) {
                    PDXObject xObject = resources.getXObject(xObjectName);
                    if (xObject instanceof PDImage) {
                        PDImage image = (PDImage) xObject;
                        BufferedImage bufferedImage = image.getImage();
                        // 이미지 해상도 변경
                        BufferedImage resizedImage = resizeImage(bufferedImage, 300, 300);
                        // 변경된 이미지를 파일로 저장
                        ImageIO.write(resizedImage, "png", new File("output.png"));
                    }
                }
            }

            // PDF 파일 저장
            document.save("output.pdf");
            document.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static BufferedImage resizeImage(BufferedImage originalImage, int targetWidth, int targetHeight) {
        BufferedImage resizedImage = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB);
        resizedImage.getGraphics().drawImage(originalImage.getScaledInstance(targetWidth, targetHeight, BufferedImage.SCALE_SMOOTH), 0, 0, null);
        return resizedImage;
    }
}

위 코드에서 input.pdf 파일에서 이미지를 추출하고, 추출한 이미지의 해상도를 300x300으로 변경하여 output.png 파일로 저장하고, 변경된 PDF 파일을 output.pdf로 저장합니다. 이 코드는 각 페이지에서 모든 이미지를 추출하고 해상도를 변경하지만, 필요에 따라 원하는 조건에 맞게 수정할 수 있습니다.

3. 실행하기

위 코드를 실행하기 전에, input.pdf 파일의 경로를 정확히 지정해야 합니다. 또한, 이미지의 대상 해상도를 원하는 값으로 변경할 수 있습니다.

해당 코드를 실행하면, 지정한 PDF 파일에서 이미지를 추출하고, 추출한 이미지의 해상도를 변경하여 파일로 저장합니다. 변경된 PDF 파일은 output.pdf로, 변경된 이미지는 output.png로 저장됩니다.

4. 참고 자료

주의: 위 코드는 Apache PDFBox 라이브러리를 사용하는 예제입니다. 라이브러리 버전을 확인하고 필요에 따라 코드를 수정하여 사용하시기 바랍니다.