개발/Etc

PDFBOX를 활용하여 간단하게 워터마크 붙여보기

희묭 2023. 11. 3. 15:14

PDF 를 생산, 가공하는 자바 라이브러리로 많이 추천되는 것은 ITEXT 지만

GNU 라이센스정책을 적용받기때문에 상용으로 사용하는 것 아니면 추천되지 않는다 (생각보다 비싸다)

가장 좋은 대안은 아파치라이센스를 적용받는 PDF BOX로서 사용방법을 살펴보려고한다.

 

우선 3가지 파일이 필요하다

1. 테스트용 PDF 파일

2. 워터마크 이미지파일

3. 폰트파일

 

우선 라이브러리 추가가 필요하다

implementation 'org.apache.pdfbox:pdfbox:2.0.29'

 

그 후에 준비물들을 불러온다

// 초안파일
File inputPdfFile = new File("C:\\dev\\testfile\\test.pdf");

// 워터파크 이미지파일
File watermarkImageFile = new File("C:\\dev\\testfile\\watermark.jpg");

// 기입할 문자열
String watermarkText = "테스트문구";

// 수정파일
File outputPdfFile = new File("C:\\dev\\testfile\\test_result.pdf");

//적용할 폰트
InputStream fontStream = new FileInputStream("C:\\dev\\testfile\\NanumGothic.ttf");

 

초안파일에 이미지와 문자열을 넣어서 수정파일로 저장

// PDF 문서 객채화
PDDocument document = PDDocument.load(inputPdfFile);

// 폰트 객체화
PDType0Font fontNanum = PDType0Font.load(document, fontStream);

// 워터마크 객체화
PDImageXObject watermarkImage = LosslessFactory.createFromImage(document, ImageIO.read(watermarkImageFile));

for (PDPage page : document.getPages()) {

    //페이지 객체화
    PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, true);

    //폰트 적용
    contentStream.setFont(fontNanum, 12);

    //워터마크 넣을 위치 선정
    PDRectangle pageSize = page.getMediaBox();
    float x = (pageSize.getLowerLeftX() + pageSize.getUpperRightX()) / 2;
    float y = (pageSize.getLowerLeftY() + pageSize.getUpperRightY()) / 2;

    //텍스트 넣기
    contentStream.setNonStrokingColor(0, 0, 0);
    contentStream.beginText();
    contentStream.newLineAtOffset(x, y);
    contentStream.showText(watermarkText);
    contentStream.endText();

    // 투명도 조절
    PDExtendedGraphicsState extendedGraphicsState = new PDExtendedGraphicsState();
    extendedGraphicsState.setNonStrokingAlphaConstant(0.35f);
    contentStream.setGraphicsStateParameters(extendedGraphicsState);

    //이미지 넣기
    contentStream.drawImage(watermarkImage, x/2, y/2, 50, 50); // x, y, width, height 조절

    contentStream.close();
}

// 문서 정보 설정 (옵션)
PDDocumentInformation info = document.getDocumentInformation();
info.setAuthor("Your Name");
info.setTitle("Watermarked PDF");

// 출력 PDF 파일 저장
document.save(outputPdfFile);

// 문서 닫기
document.close();

 

아래와 같은 결과물을 얻는다

투명도 조절된 이미지와 텍스트가 첨부된 PDF 결과물