Java에서 PDF 텍스트 교체하는 방법

이 포괄적인 가이드에서는 Java용 GroupDocs.Annotation을 사용하여 PDF 텍스트 교체 방법을 배우게 되며, 메모리 사용량을 낮게 유지하고 협업 댓글 스레드를 추가하는 방법을 다룹니다. 레거시 문서 워크플로를 현대화하거나 새로운 검토 플랫폼을 구축하든, 아래 단계는 프로덕션 수준의 코드와 확장 가능한 모범 사례 팁을 제공합니다.

빠른 답변

  • Java에서 PDF 텍스트 교체에 가장 적합한 라이브러리는 무엇인가요? GroupDocs.Annotation.
  • 스캔된 PDF 텍스트를 교체할 수 있나요? OCR 후에만 가능합니다; 이 라이브러리는 검색 가능한 PDF에서 작동합니다.
  • 메모리 누수를 방지하려면 어떻게 해야 하나요? Annotator 인스턴스를 해제하고 절대 경로를 사용하세요.
  • 프로덕션에 라이선스가 필요합니까? 예—상업용 라이선스를 사용하면 워터마크가 제거됩니다.
  • 교체 제안에 답글을 추가할 수 있나요? 물론이며, Reply 모델을 통해 가능합니다.

Java 애플리케이션에서 PDF 텍스트 교체가 필요한 이유

대상 PDF를 로드하고 교체 제안을 오버레이한 뒤 검토자가 이를 수락하거나 거부하도록 합니다—이 전체 흐름은 일반적인 10페이지 계약서의 경우 1초 미만에 처리됩니다. GroupDocs.Annotation은 50개 이상의 입력 및 출력 포맷을 처리하며 수백 페이지 PDF도 전체 파일을 메모리에 로드하지 않고 처리할 수 있어 엔터프라이즈 규모 문서 파이프라인에 이상적입니다.

PDF 텍스트 교체란 무엇인가요?

PDF text replacement는 제안이 수락될 때까지 기본 PDF 콘텐츠를 변경하지 않고 시각적으로 변경을 제안하는 주석입니다. 워드 프로세서의 “변경 내용 추적”과 유사하게, 누가 언제 무엇을 제안했는지에 대한 감사 추적을 보존하므로 컴플라이언스 검토 및 협업 편집에 필수적입니다.

사전 요구 사항

  • JDK 8 이상 (JDK 21과 호환)
  • Maven 또는 Gradle을 사용한 의존성 관리
  • GroupDocs.Annotation 25.2 (또는 이후 버전)
  • Java 예외 처리 및 파일 I/O에 대한 기본 지식

선택 사항이지만 도움이 되는: IntelliJ IDEA와 같은 IDE 및 테스트용 샘플 PDF.

프로젝트에 GroupDocs.Annotation 추가하기

Maven 설정 (가장 일반적인 접근 방식)

pom.xml에 저장소와 의존성을 추가합니다. 저장소 블록을 빼먹으면 “artifact not found” 오류가 자주 발생하므로, 아래 코드 조각을 정확히 복사하세요.

<repositories>
   <repository>
      <id>repository.groupdocs.com</id>
      <name>GroupDocs Repository</name>
      <url>https://releases.groupdocs.com/annotation/java/</url>
   </repository>
</repositories>
<dependencies>
   <dependency>
      <groupId>com.groupdocs</groupId>
      <artifactId>groupdocs-annotation</artifactId>
      <version>25.2</version>
   </dependency>
</dependencies>

라이선스 상황 처리

GroupDocs는 세 가지 라이선스 등급을 제공합니다:

  1. Free trial – GroupDocs releases 페이지에서 다운로드합니다. 모든 출력 파일에 워터마크가 표시됩니다.
  2. Temporary license – 장기 평가에 유용합니다; GroupDocs Purchase 포털에서 획득하세요.
  3. Full commercial license – 워터마크를 제거하고 무제한 배포를 가능하게 합니다. GroupDocs website에서 구매하세요.

팁: 애플리케이션 시작 시 라이선스 파일을 한 번만 로드하여 반복적인 I/O 오버헤드를 방지하세요.

첫 번째 텍스트 교체 기능 만들기

텍스트 교체 주석 이해하기

TextReplacementAnnotation은 편집 제안을 위한 GroupDocs.Annotation의 핵심 클래스입니다. 원본 텍스트 위치, 교체 문자열 및 선택적 스타일 정보를 저장합니다. 원본 PDF가 변경되지 않기 때문에 언제든지 변경을 되돌리거나 감시할 수 있습니다.

단계별 구현

각 단계별로 진행 과정을 살펴보고, 중요한 이유를 강조하며 java pdf memory management 모범 사례를 포함합니다.

단계 1: 기본 설정

먼저, 소스 PDF를 가리키고 출력 위치를 정의하는 Annotator 인스턴스를 생성합니다. 절대 경로를 사용하면 서버에서 코드가 실행될 때 “file not found” 오류를 방지할 수 있습니다.

import com.groupdocs.annotation.Annotator;
import java.util.Calendar;

public class AddTextReplacementAnnotationFeature {
    public static void main(String[] args) {
        String outputPath = "YOUR_OUTPUT_DIRECTORY/AddTextReplacementAnnotation.pdf";
        final Annotator annotator = new Annotator("YOUR_DOCUMENT_DIRECTORY/input.pdf");

정의 앵커: Annotator 클래스는 GroupDocs.Annotation에서 모든 주석 작업의 진입점으로, PDF 로드, 수정 및 저장을 관리합니다.

단계 2: 답글을 통한 협업 기능 만들기

답글을 통해 검토자는 PDF에서 직접 제안에 대해 토론할 수 있습니다. 각 답글은 작성자, 타임스탬프 및 댓글 텍스트를 기록하여 완전한 토론 스레드를 형성합니다.

import com.groupdocs.annotation.models.Reply;
import java.util.ArrayList;
import java.util.List;

// Create replies for collaborative feedback
Reply reply1 = new Reply();
reply1.setComment("First comment");
reply1.setRepliedOn(Calendar.getInstance().getTime());

Reply reply2 = new Reply();
reply2.setComment("Second comment");
reply2.setRepliedOn(Calendar.getInstance().getTime());

List<Reply> replies = new ArrayList<>();
replies.add(reply1);
replies.add(reply2);

정의 앵커: Reply 모델은 주석에 첨부된 단일 댓글을 나타내며, 스레드형 토론 및 감사 추적을 가능하게 합니다.

단계 3: 대상 영역 정의하기

주석을 정확히 배치하려면 페이지 번호와 사각형 좌표를 지정해야 합니다. PDF 좌표는 왼쪽 하단을 원점으로 한다는 점을 기억하세요.

import com.groupdocs.annotation.models.Point;
import java.util.List;

// Define the bounding box for your annotation
Point point1 = new Point(80, 730);   // Top-left
Point point2 = new Point(240, 730);  // Top-right  
Point point3 = new Point(80, 650);   // Bottom-left
Point point4 = new Point(240, 650);  // Bottom-right

List<Point> points = new ArrayList<>();
points.add(point1);
points.add(point2);
points.add(point3);
points.add(point4);

정의 앵커: 사각형(Rectangle)은 PDF 좌표계를 사용하여 페이지에서 주석의 시각적 경계를 정의합니다.

단계 4: 마법 만들기 – 교체 주석

이제 TextReplacementAnnotation을 인스턴스화하고, 교체 텍스트를 설정하고 스타일을 지정한 뒤, 앞서 만든 답글을 첨부합니다.

import com.groupdocs.annotation.models.annotationmodels.ReplacementAnnotation;

// Configure your replacement annotation
ReplacementAnnotation replacement = new ReplacementAnnotation();
replacement.setCreatedOn(Calendar.getInstance().getTime());
replacement.setFontColor(65535); // Yellow highlight - easy to spot
replacement.setFontSize(8.0);
replacement.setMessage("This is a replacement annotation");
replacement.setOpacity(0.7); // Semi-transparent so original text shows through
replacement.setPageNumber(0); // First page (zero-indexed)
replacement.setPoints(points);
replacement.setReplies(replies);
replacement.setTextToReplace("replaced text");

// Add the annotation and save
annotator.add(replacement);
annotator.save(outputPath);
annotator.dispose(); // Critical for memory management!

정의 앵커: TextReplacementAnnotation은 수락할 때까지 기본 콘텐츠를 변경하지 않고 PDF에 제안된 텍스트 변경을 오버레이합니다.

성능 팁: 각 문서 처리가 끝난 후 annotator.dispose()를 호출하세요. 이를 수행하지 않으면 PDF 파일이 메모리에 잠겨 장기 실행 서비스에서 OutOfMemoryError가 발생할 수 있습니다.

일반적인 문제와 해결 방법

파일 경로 문제

문제: 파일이 존재함에도 “File not found” 오류가 발생합니다.
해결책: Path.toAbsolutePath()로 경로를 해결하고 Windows에서 슬래시(앞/뒤)를 혼용하지 마세요.

대용량 PDF 메모리 문제

문제: 200페이지 계약서를 처리할 때 OutOfMemoryError가 발생합니다.
해결책: 문서를 배치로 처리하고 JVM 힙(-Xmx4g)을 늘리며 항상 Annotator 객체를 해제하세요.

주석 위치 문제

문제: 주석이 이동되거나 페이지 밖에 표시됩니다.
해결책: 좌표를 표시하는 PDF 뷰어를 사용하거나 페이지 크기와 사각형 값을 출력하는 작은 유틸리티를 작성해 확인하세요.

라이선스 문제

문제: 예상치 못한 워터마크 또는 LicenseException이 발생합니다.
해결책: 라이선스 파일이 클래스패스에 있고 Annotator 생성 전에 로드되었는지 확인하세요. 체험판은 문서당 5페이지로 제한된다는 점을 기억하세요.

실제로 중요한 실제 적용 사례

문서 검토 파이프라인

법무팀은 조항 변경을 제안할 수 있으며, 시스템은 누가 언제 제안을 했는지 기록하여 컴플라이언스 감사를 충족합니다.

콘텐츠 관리 통합

제품 사양이 변경될 때, 카탈로그 전반의 가격표 PDF를 자동으로 업데이트하는 작업을 실행하고, 이후 하위 시스템에 알립니다.

협업 편집 플랫폼

여러 사용자가 동시에 편집을 제안할 수 있는 PDF용 Google Docs 스타일 인터페이스를 구축하세요; 답글 기능이 대화 스레드가 됩니다.

컴플라이언스 및 규제 업데이트

레포지토리를 스캔하여 오래된 규제 문구를 찾아 교체 제안을 생성하고, 컴플라이언스 담당자가 일괄 승인하도록 합니다.

성능 최적화 전략

메모리 관리 모범 사례

  • 각 파일 처리 후 Annotator를 해제합니다.
  • 대용량 PDF를 읽고 쓸 때 스트리밍 API를 사용합니다.
  • JMX 또는 VisualVM으로 힙 사용량을 모니터링합니다.

대량 처리 확장

  • 제한된 스레드 풀을 가진 executor 서비스를 사용해 파일을 병렬 처리합니다.
  • PDF를 분산 파일 시스템(예: AWS S3)에 저장하고 Annotator에 직접 스트리밍합니다.
  • 자주 접근하는 문서를 읽기 전용 메모리 매핑 파일에 캐시하여 I/O 지연을 줄입니다.

모니터링 및 디버깅

  • 각 단계(load, annotate, save)에 소요된 시간을 로그에 기록합니다.
  • 예외를 스택 트레이스와 함께 캡처하고 PDF 이름을 포함해 문제 해결을 용이하게 합니다.
  • 할당된 힙의 80 %를 초과하는 메모리 급증에 대한 알림을 설정합니다.

자주 묻는 질문

Q: 스캔된 PDF에서 텍스트를 교체할 수 있나요?
A: 직접적으로는 불가능합니다—스캔된 PDF는 이미지이며 검색 가능한 텍스트가 없습니다. 먼저 OCR을 수행한 뒤 OCR 생성 레이어에 텍스트 교체를 적용하세요.

Q: 특수 문자나 유니코드 텍스트를 어떻게 처리하나요?
A: GroupDocs.Annotation은 유니코드를 완벽히 지원합니다. 소스 파일이 UTF‑8 인코딩인지 확인하고 교체 문자열을 Java String 객체로 전달하세요.

Q: 한 번에 교체할 수 있는 텍스트 양에 제한이 있나요?
A: 명확한 제한은 없지만, 매우 큰 교체는 성능이 저하됩니다. 대규모 업데이트는 작은 배치로 나누어 원활히 처리하세요.

Q: 교체 제안을 프로그래밍 방식으로 수락하거나 거부할 수 있나요?
A: 예—주석을 반복하면서 accept()를 호출해 변경을 영구 적용하거나 remove()로 삭제할 수 있습니다.

Q: 존재하지 않는 텍스트를 교체하려고 하면 어떻게 되나요?
A: 주석은 생성되지만 일치하는 텍스트가 없어 보이지 않습니다. 조용한 실패를 방지하려면 주석을 만들기 전에 대상 문자열을 검증하세요.

Q: 동일한 PDF에 대한 동시 접근을 어떻게 처리하나요?
A: Annotator는 단일 문서에 대해 스레드 안전하지 않습니다. 파일 잠금이나 큐 메커니즘을 사용해 접근을 순차화하세요.

Q: 교체 주석의 외관을 맞춤 설정할 수 있나요?
A: 물론 가능합니다. 주석의 스타일 속성을 통해 글꼴 크기, 색상, 불투명도 및 테두리 스타일을 설정할 수 있습니다.

Q: 비밀번호로 보호된 PDF에서도 작동하나요?
A: 예—Annotator 초기화 시 비밀번호를 제공하면 API가 메모리에서 문서를 복호화한 뒤 주석을 적용합니다.


마지막 업데이트: 2026-09-30
테스트 환경: GroupDocs.Annotation 25.2
작성자: GroupDocs

관련 튜토리얼