Java PDF 파일 비교 – 마스터 GroupDocs.Comparison API
이 가이드에서는 GroupDocs.Comparison for Java를 사용하여 java compare pdf files 를 효율적으로 수행하는 방법을 배웁니다. 계약 검토 포털, 버전 관리 시스템, 학술 논문 검사기 등을 구축하든, PDF 문서에서 가장 작은 변경까지 감지하는 능력은 필수적입니다. 설정, 핵심 비교 로직, 미리보기 생성, 비밀번호 처리, 클라우드 통합 및 성능 최적화 모범 사례를 단계별로 안내하므로 몇 분 만에 신뢰할 수 있는 솔루션을 배포할 수 있습니다.
빠른 답변
- GroupDocs Comparison Java는 무엇을 하나요? 두 개 이상의 문서를 비교하고 모든 변경 사항을 강조 표시하며 빠른 검토를 위한 시각적 미리보기를 생성할 수 있습니다.
- 지원되는 파일 형식은 무엇인가요? Word, PDF, Excel, PowerPoint, 이미지, HTML 등 다수.
- 프로덕션에 라이선스가 필요합니까? 예 – 유효한 GroupDocs 라이선스를 사용하면 워터마크가 제거되고 전체 기능을 사용할 수 있습니다.
- 대용량 문서를 처리할 수 있나요? 예 – 적절한 메모리 관리와 미리보기 페이지네이션을 사용하면 수백 페이지 PDF를 처리할 수 있습니다.
- 최신 Maven 의존성은 어디서 찾을 수 있나요? GroupDocs 저장소에서 확인할 수 있으며, 추가하기 전에 최신 버전을 확인하십시오.
java compare pdf files란?
java compare pdf files는 두 PDF 버전을 로드하고 텍스트, 서식 및 그래픽 차이를 감지하며, 선택적으로 변경 사항을 시각적으로 표시한 결과 문서를 생성하는 프로그래밍 방식의 프로세스를 의미합니다. GroupDocs.Comparison은 이를 단일 API 호출로 구현하여 수동 diff 로직이 필요 없게 합니다.
Java 프로젝트에서 GroupDocs.Comparison을 사용하는 이유는?
GroupDocs.Comparison은 50개 이상의 지원 형식에서 정확한 변경 감지를 제공하고, 표준 8 GB JVM에서 200페이지 PDF를 5초 이하로 처리하며, 내장된 미리보기 생성 기능을 포함합니다. Maven‑ready 아티팩트 덕분에 통합이 간편하고, 권장 메모리 관리 패턴을 따르면 라이브러리가 수평 확장을 지원합니다.
시작하기 위한 전제 조건: 필요 사항
- Java Development Kit: JDK 8 이상; 더 나은 가비지 컬렉션 성능을 위해 JDK 11 이상 권장.
- 빌드 도구: 의존성 해결을 위한 Maven 또는 Gradle.
- IDE: IntelliJ IDEA, Eclipse, VS Code 등 – 최신 Java IDE라면 모두 사용 가능.
- 기본 Java 지식: 클래스, 메서드 및 파일 I/O에 익숙해야 합니다.
- 네트워크 접근: GroupDocs Maven 아티팩트를 다운로드하고, 클라우드 스토리지를 사용하는 경우 스토리지 엔드포인트에 접근할 수 있어야 합니다.
프로젝트에 GroupDocs.Comparison 추가하기
pom.xml에 다음 의존성을 추가합니다 (X.Y.Z를 GroupDocs 사이트에서 찾은 최신 버전으로 교체하십시오):
<dependency>
<groupId>com.groupdocs</groupId>
<artifactId>groupdocs-comparison</artifactId>
<version>X.Y.Z</version>
</dependency>
팁: 업그레이드하기 전에 버전별 버그 수정 및 새로운 형식 지원에 대한 GroupDocs 릴리스 노트를 확인하십시오.
라이선스 (이 부분을 건너뛰지 마세요!)
체험 라이선스로 API를 평가할 수 있지만, 프로덕션 배포에는 워터마크를 제거하고 전체 기능을 사용하기 위해 영구 라이선스가 필요합니다.
- 무료 체험: GroupDocs에서 다운로드
- 임시 라이선스: 장기 테스트를 위해 임시 라이선스를 받으세요
- 정식 라이선스: GroupDocs Store에서 구매
초기 설정: GroupDocs.Comparison 준비하기
기본 초기화
Comparer 클래스는 모든 비교 작업의 진입점입니다. 문서 로드, 차이 계산 및 결과 생성을 조정합니다.
<repositories>
<repository>
<id>repository.groupdocs.com</id>
<name>GroupDocs Repository</name>
<url>https://releases.groupdocs.com/comparison/java/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.groupdocs</groupId>
<artifactId>groupdocs-comparison</artifactId>
<version>25.2</version>
</dependency>
</dependencies>
코드 스니펫 설명: Comparer 인스턴스를 생성하고, 라이선스를 적용(있는 경우)하며, 이후 비교 호출을 위한 엔진을 준비합니다.
단계별 구현 가이드
파트 1: 문서 비교 설정
단계 1: comparer 초기화
Comparer 객체는 diff 알고리즘을 실행하는 핵심 구성 요소이며, 비교 옵션 및 라이선스 정보와 같은 설정을 보유합니다.
import com.groupdocs.comparison.Comparer;
import com.groupdocs.comparison.examples.SampleFiles;
// Initialize the comparer with a source document
Comparer comparer = new Comparer(SampleFiles.SOURCE_WORD);
중요 이유: 제공한 원본 문서가 기준이 되며, 모든 변경 사항이 이에 대해 측정됩니다.
단계 2: 대상 문서 추가
원본을 하나 이상의 대상 파일과 비교할 수 있습니다. 계약 관리 시나리오에서는 원본이 원본 계약서이고, 대상은 법무팀이 수정한 버전입니다.
// Initialize comparer with the source document
Comparer comparer = new Comparer(SampleFiles.SOURCE_WORD);
파트 2: 페이지 미리보기 생성
단계 1: 출력 스트림 생성 설정
프리뷰 delegate 패턴을 사용하면 미리보기 이미지 저장 위치(로컬 디스크, 클라우드 버킷, 데이터베이스)를 완전히 제어할 수 있습니다.
// Add a target document for comparison
comparer.add(SampleFiles.TARGET1_WORD);
단계 2: 미리보기 옵션 구성
실제로 필요한 페이지에 대해서만 미리보기를 생성하면 대용량 PDF에서 CPU 사용량을 최대 60 %까지 줄일 수 있습니다.
import com.groupdocs.comparison.common.delegates.Delegates;
import java.io.FileOutputStream;
import java.io.OutputStream;
Delegates.CreatePageStream createPageStream = new Delegates.CreatePageStream() {
@Override
public OutputStream invoke(int pageNumber) {
String pagePath = "YOUR_OUTPUT_DIRECTORY" + "/result-GetPagePreviewsForTargetDocument_" + pageNumber + ".png";
try {
return new FileOutputStream(pagePath);
} catch (FileNotFoundException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
};
단계 3: 미리보기 생성
API는 요청된 각 페이지를 PNG(무손실) 또는 JPEG(작은 크기) 형식으로 렌더링합니다. 픽셀 단위 정확도가 중요한 법률 문서에는 PNG가 권장됩니다.
import com.groupdocs.comparison.options.PreviewOptions;
import com.groupdocs.comparison.options.enums.PreviewFormats;
// Set preview options
PreviewOptions previewOptions = new PreviewOptions.Builder(createPageStream)
.setPreviewFormat(PreviewFormats.PNG) // High-quality images
.setPageNumbers(new int[]{1, 2}) // Only generate what you need
.build();
지원 파일 형식
GroupDocs.Comparison은 50개 이상의 입력 및 출력 형식을 지원하며, 다음을 포함합니다:
- Microsoft Office: DOCX, DOC, XLSX, XLS, PPTX, PPT
- PDF: 모든 PDF‑1.x 버전, 암호화된 PDF 및 임베디드 폰트가 포함된 PDF
- 텍스트 및 마크업: TXT, RTF, HTML, MHTML
- 이미지: JPEG, PNG, BMP, GIF
- OpenDocument: ODT, ODS, ODP
이러한 폭넓은 기능을 통해 Word 파일로 저장된 계약서를 스캔된 PDF 버전과 동일한 API 호출로 비교할 수 있습니다.
일반적인 문제와 해결책
문제 1: 미리보기 생성 중 FileNotFoundException
출력 디렉터리가 없거나 애플리케이션에 쓰기 권한이 없으면 프리뷰 delegate가 이 예외를 발생시킵니다.
// Generate page previews
comparer.getTargets().get(0).generatePreview(previewOptions);
해결책: 경로를 확인하고, 누락된 폴더를 프로그래밍 방식으로 생성하며, Java 프로세스에 적절한 파일 시스템 권한을 부여합니다.
문제 2: 대용량 문서 메모리 문제
300페이지 PDF를 처리하면 기본 512 MB 힙을 초과하여 OutOfMemoryError가 발생할 수 있습니다.
Delegates.CreatePageStream createPageStream = new Delegates.CreatePageStream() {
@Override
public OutputStream invoke(int pageNumber) {
String outputDir = "previews";
File directory = new File(outputDir);
if (!directory.exists()) {
directory.mkdirs(); // Create directory if it doesn't exist
}
String pagePath = outputDir + "/preview_page_" + pageNumber + ".png";
try {
return new FileOutputStream(pagePath);
} catch (FileNotFoundException e) {
System.err.println("Failed to create output file: " + pagePath);
throw new RuntimeException("Cannot create preview file", e);
}
}
};
해결책: JVM 힙을 (-Xmx2g 이상) 늘리고 PreviewOptions 페이지네이션 기능을 사용해 문서를 작은 페이지 범위로 처리합니다.
문제 3: 라이선스 문제
라이선스 파일이 없거나 형식이 잘못되면 API가 모든 출력에 워터마크를 추가하고 일부 고급 옵션을 비활성화합니다.
// Process fewer pages at a time
PreviewOptions previewOptions = new PreviewOptions.Builder(createPageStream)
.setPreviewFormat(PreviewFormats.PNG)
.setPageNumbers(new int[]{1, 2, 3}) // Limit page range
.build();
// Always dispose of the comparer when done
try (Comparer comparer = new Comparer(sourceDocument)) {
comparer.add(targetDocument);
comparer.getTargets().get(0).generatePreview(previewOptions);
} // Automatic cleanup
해결책: 알려진 위치에 라이선스 파일을 두고, 비교 호출 전에 License.setLicense("path/to/license.lic") 로 로드합니다.
성능 팁 및 모범 사례 (java comparison best practices)
- 미리보기 생성 제한 – 필요한 페이지만 요청하고,
pageNumbers를 사용해 관련 없는 섹션을 건너뛰세요. - 적절한 이미지 형식 선택 – 무손실 법률 문서에는 PNG, 크기가 중요한 썸네일에는 JPEG를 사용하세요.
- 캐시 구현 – 비교 결과(예: source + target 해시)를 저장해 변경되지 않은 파일을 재처리하지 않도록 합니다.
- 메모리 관리 –
Comparer사용을 try‑with‑resources 블록으로 감싸고 완료 시close()를 호출합니다. - Comparer 객체 해제 – 항상 네이티브 리소스를 해제해 JVM 메모리 사용량을 최소화합니다.
프로덕션 준비 코드 패턴
아래는 마이크로서비스에서 비교 작업을 수행하기 위한 권장 라이프사이클입니다.
// Apply license at the start of your application
License license = new License();
license.setLicense("path/to/your/license.lic");
실제 구현 예시
예시 1: 계약 관리 시스템
법무 부서는 원본 계약서(소스)와 수정 버전(대상)을 업로드합니다. 서비스는 강조 표시된 PDF와 빠른 시각 검토를 위한 페이지‑프리뷰 PNG 세트를 반환합니다.
public class DocumentComparisonService {
private static final String OUTPUT_DIR = "document-previews/";
public ComparisonResult compareDocuments(String sourcePath, String targetPath) {
try (Comparer comparer = new Comparer(sourcePath)) {
comparer.add(targetPath);
// Perform comparison
String resultPath = OUTPUT_DIR + "comparison-result.docx";
comparer.compare(resultPath);
// Generate previews if needed
generatePreviews(comparer, 3); // First 3 pages only
return new ComparisonResult(resultPath, true);
} catch (Exception e) {
log.error("Document comparison failed", e);
return new ComparisonResult(null, false);
}
}
private void generatePreviews(Comparer comparer, int maxPages) {
// Implementation details...
}
}
예시 2: 학술 논문 리뷰
연구자들은 수정된 원고를 제출합니다. 시스템은 새 PDF를 이전 버전과 비교하고, 변경된 인용을 표시하며, 리뷰어 대시보드를 위한 미리보기 이미지를 생성합니다.
public class ContractVersionManager {
public void reviewContractChanges(String originalContract, String revisedContract) {
try (Comparer comparer = new Comparer(originalContract)) {
comparer.add(revisedContract);
// Generate comparison document
String comparisonResult = "contracts/comparison-" + System.currentTimeMillis() + ".docx";
comparer.compare(comparisonResult);
// Create preview for stakeholder review
generatePreviewsForReview(comparer);
}
}
}
비밀번호 보호된 PDF를 java compare pdf files 하는 방법
LoadOptions 클래스는 암호화된 문서의 비밀번호와 같은 로드 매개변수를 지정할 수 있게 해줍니다. 보호된 PDF를 비교하려면 비밀번호를 포함한 LoadOptions 인스턴스를 생성하고, 문서를 로드할 때 Comparer에 전달한 뒤 일반적으로 비교를 수행합니다. 라이브러리는 파일을 메모리에서 복호화하여 평문이 디스크에 기록되지 않도록 하며, 이후의 모든 작업(프리뷰 생성 및 diff 계산 포함)도 투명하게 작동합니다.
public class AcademicDocumentReview {
public void compareResearchDrafts(String draft1, String draft2) {
try (Comparer comparer = new Comparer(draft1)) {
comparer.add(draft2);
// Focus on specific sections (first 10 pages typically contain main content)
PreviewOptions options = new PreviewOptions.Builder(createPageStream)
.setPageNumbers(IntStream.rangeClosed(1, 10).toArray())
.setPreviewFormat(PreviewFormats.PNG)
.build();
comparer.getTargets().get(0).generatePreview(options);
}
}
}
클라우드에 저장된 문서 비교
소스와 대상이 Amazon S3, Azure Blob, Google Cloud Storage에 저장되어 있는 경우, 로컬 파일 경로 대신 클라우드 SDK에서 얻은 InputStream을 제공하면 됩니다.
LoadOptions loadOptions = new LoadOptions();
loadOptions.setPassword("your-password");
Comparer comparer = new Comparer("protected-document.docx", loadOptions);
자주 묻는 질문
Q: 비밀번호 보호된 문서는 어떻게 처리하나요?
A: 위와 같이 Comparer 인스턴스를 생성할 때 LoadOptions를 사용해 비밀번호를 제공하십시오.
Q: 클라우드 스토리지에 저장된 문서를 비교할 수 있나요?
A: 예—클라우드 제공자의 입력 스트림을 Comparer에 제공하면 됩니다.
Q: GroupDocs.Comparison이 처리할 수 있는 최대 파일 크기는 얼마인가요?
A: 명확한 제한은 없지만, 100 MB를 초과하는 파일은 JVM 힙 크기를 늘리거나 문서를 작은 청크로 나누어 처리해 OutOfMemoryError를 방지해야 합니다.
Q: 비교 알고리즘의 정확도는 어느 정도인가요?
A: 라이브러리는 텍스트, 서식, 이미지, 표, 임베디드 객체의 변화를 감지하는 고급 diff 알고리즘을 사용해 거의 픽셀 단위에 가까운 시각적 diff 결과를 제공합니다.
Q: 감지할 변경 유형을 맞춤 설정할 수 있나요?
A: 물론입니다. CompareOptions를 설정해 텍스트, 서식, 이미지, 표 등 감지를 켜거나 끌 수 있습니다.
Q: API가 선택된 페이지에 대해서만 프리뷰를 생성하도록 지원하나요?
A: 예—특정 pageNumbers 배열을 사용해 PreviewOptions를 구성하면 필요한 페이지만 출력하도록 제한할 수 있습니다.
결론
이제 GroupDocs.Comparison을 사용한 java compare pdf files에 대한 완전하고 프로덕션‑준비된 가이드를 보유하게 되었습니다. 설정 단계와 성능 권장 사항을 따르고, 비밀번호 처리 및 클라우드 통합 스니펫을 활용하면 계약 검토 포털, 학술 논문 워크플로우, 대규모 문서 아카이브 시스템 등 모든 Java 애플리케이션에 강력한 문서 비교 기능을 삽입할 수 있습니다.
마지막 업데이트: 2026-11-01
테스트 환경: GroupDocs.Comparison 25.2
작성자: GroupDocs
InputStream sourceStream = getDocumentFromCloud("source-doc-id");
InputStream targetStream = getDocumentFromCloud("target-doc-id");
Comparer comparer = new Comparer(sourceStream);
comparer.add(targetStream);