반응형

0. 사용기 및 왜 사용하게 되었는가?

책을 작두질해서 스캔하여 PDF로 보자니 영 맘에 드는 프로그램이 없다.

책을 이미지로 떠놨는데 PDF로 변환하기 위해서는 유료 프로그램을 사거나

일일이 한땀한땀 만들어야하는데 이걸 노가다한다고?

역시나 찾아보니 아파치 재단에 등록 된 Java PDFBOX 라는 라이브러리가 있다.

사용법도 간단하고 만들기도 편하고 쉽다.

속도도 유료프로그램을 쓰는 것보다 빠르니 아주 유용하였다.

1. Jar 다운로드 or MAVEN 추가

굳이 메이븐을 안쓰더라도 기본 JAR 를 다운로드 받아서 사용해도 될 만큼 가볍다.

2. Image 2 PDF 예제

package ezk.mybooks.modules.pdf.service;

import java.awt.Image;
import java.io.File;
import java.io.FileFilter;

import javax.imageio.ImageIO;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.springframework.stereotype.Component;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Component
public class PdfBoxService {

    public static File createPdf(String dirPath, String fileName) throws Exception {

        // Directory Check
        File dir = new File(dirPath);
        if(!dir.exists()) {
            dir.mkdir();
        }

        if(!dir.isDirectory()) {
            throw new Exception("dirPath is not dir");
        }

        // File Check
        File pdfFile = new File(dirPath + File.separator + fileName + ".pdf");
        if(pdfFile.exists()) {
            pdfFile.delete();
        }

        PDDocument document = new PDDocument();
        document.save(pdfFile);
        document.close();

        System.out.println("PDF created");

        return pdfFile;
    }

    public static void images2Pdf(String sourceDir, String saveTargetDir, String savePdfFileName) throws Exception {

        log.debug(" -- Loading All Image Files --");
        File dir = new File(sourceDir);

        log.debug("\n\n -- Filtering Image Files --");
        File[] sourceFiles = dir.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return pathname.getName().contains("jpg"); 
            }
        });

        log.debug("\n\n -- Create New PDF --");
        // Loading an existing document
        File pdfFile = createPdf(saveTargetDir, savePdfFileName);
        PDDocument doc = PDDocument.load(pdfFile);

        int totalCnt = 1;
        for(File curImgFile : sourceFiles) {

            // Read a Image Object
            Image curImg = ImageIO.read(curImgFile);

            float imgWidth = curImg.getWidth(null);
            float imgHeigth = curImg.getHeight(null);

            // Fit a PDF Page by Image Height Length
            PDImageXObject pdImage = PDImageXObject.createFromFileByContent(curImgFile, doc);
            PDRectangle newRect = new PDRectangle(0, 0, imgWidth, imgHeigth);
            PDPage newPage = new PDPage(newRect);
            doc.addPage(newPage);

            // Write a PDImageXObject to PDF
            PDPageContentStream contents = new PDPageContentStream(doc, newPage);
            contents.drawImage(pdImage, 0, 0, imgWidth, imgHeigth);
            contents.close();

            log.debug("Page " + (totalCnt++) + " was Drawed at PDF File.");
        }

        // Saving the document
        doc.save(pdfFile);

        // Closing the document
        doc.close();

    }

    public static void main(String[] args) throws Exception {

        String sourceDir, saveTargetDir, savePdfFileName;
        sourceDir = "이미지가 저장 된 폴더경로";
        saveTargetDir = "이미지를 저장 할 폴더경로";
        savePdfFileName = "PDF 파일명";

        images2Pdf(sourceDir, saveTargetDir, savePdfFileName);
    }
}

3. 중요 예제 사이트

반응형

WRITTEN BY
데르벨준

,