Java를 사용하여 PDF에 바코드 서명 생성하기
이 튜토리얼에서는 Java와 GroupDocs.Signature를 사용하여 PDF 파일에 바코드 서명 생성을 배우게 됩니다. 바코드 서명은 기계가 읽을 수 있는 식별자를 삽입하여 변조 방지와 스캔이 용이하도록 하며—계약서, 증명서, 청구서 및 신뢰할 수 있는 검증이 필요한 모든 문서에 적합합니다.
빠른 답변
- 바코드 서명이란? PDF에 삽입된 바코드로, 구조화된 데이터를 저장하며 스캐너나 소프트웨어가 읽을 수 있습니다.
- 추천하는 바코드 유형은? Code128, 알파벳과 숫자 데이터를 압축해서 처리하기 때문입니다.
- 라이선스가 필요합니까? 테스트용으로는 무료 체험판으로 충분하며, 프로덕션에서는 정식 라이선스가 필요합니다.
- 바코드를 어떤 페이지 크기에도 배치할 수 있나요? 예—자동 스케일링을 위해 백분율 기반 위치 지정 사용.
- 바코드가 벡터 기반인가요? 예, PDF에 몇 킬로바이트만 추가되며 어떤 해상도에서도 선명합니다.
바코드 서명이 PDF에 중요한 이유
아마도 겪어봤을 문제입니다: 기계가 읽을 수 있고 변조 방지 기능이 있는 고유 식별자를 PDF에 추가해야 합니다. 문서 관리 시스템을 구축하거나, 증명서를 처리하거나, 이후 검증이 필요한 계약서를 다루고 있을지도 모릅니다.
바코드 서명이 바로 여기서 유용합니다. 단순 텍스트 스탬프와 달리 바코드는 스캐너(및 여러분의 소프트웨어)가 즉시 읽을 수 있는 구조화된 데이터를 삽입할 수 있게 합니다. 또한 GroupDocs.Signature for Java를 통한 PDF 서명과 결합하면 복잡한 데이터베이스 조회 없이도 문서를 추적하고 검증하는 강력한 방법을 제공합니다.
이 가이드에서는 Java PDF에 바코드 서명을 구현하는 방법을 정확히 배웁니다 — 기본 설정부터 유연한 위치 지정이 가능한 프로덕션 준비 코드까지. 청구서 시스템, 증명서 생성기, 계약 관리 플랫폼을 구축하든, 끝까지 필요한 모든 것을 갖추게 될 것입니다.
배울 내용:
- 몇 분 안에 GroupDocs.Signature for Java 설정하기
- Code128 바코드 서명 생성 (그리고 왜 이것이 종종 최선의 선택인지)
- 모든 PDF 크기에서 작동하는 백분율 기반 레이아웃을 사용한 바코드 위치 지정
- 개발자를 흔들리는 일반적인 함정 피하기
- 구현을 올바르게 테스트하기
시작하기 전에 필요한 것
다음 필수 항목을 준비했는지 확인하세요:
필수 라이브러리:
- GroupDocs.Signature for Java (버전 23.12 이상 권장)
개발 환경:
- JDK 8 이상 설치
- 선호하는 IDE (IntelliJ IDEA, Eclipse, 또는 Java 확장 기능이 있는 VS Code)
- 의존성 관리를 위한 Maven 또는 Gradle
당신의 숙련도: 기본 Java 문법에 익숙하고 파일 작업을 다룰 수 있어야 합니다. 간단한 Java 클래스를 만들고 예외를 처리할 수 있다면 바로 시작할 수 있습니다.
프로젝트에 GroupDocs.Signature 설정하기
라이브러리를 프로젝트에 추가하는 것은 간단합니다. 빌드 도구를 선택하세요:
Maven 사용자를 위해, pom.xml에 다음을 추가하세요:
<dependency>
<groupId>com.groupdocs</groupId>
<artifactId>groupdocs-signature</artifactId>
<version>23.12</version>
</dependency>
Gradle을 사용하시나요? build.gradle에 다음 줄을 추가하세요:
implementation 'com.groupdocs:groupdocs-signature:23.12'
수동 설정을 선호하나요? JAR 파일을 GroupDocs.Signature for Java releases에서 직접 다운로드하고 클래스패스에 추가하세요.
라이선스 설정하기
프로덕션에 적용하기 전에 라이선스를 처리해야 합니다:
- 무료 체험: 테스트에 적합 — GroupDocs 웹사이트에서 받아 핵심 기능을 살펴보세요
- 임시 라이선스: 평가에 더 시간이 필요합니까? 30일 임시 라이선스를 신청하세요
- 정식 라이선스: 프로덕션 준비가 되었나요? 무제한 사용을 위한 라이선스를 구매하세요
다음은 모든 것이 정상 작동하는지 확인하는 간단한 테스트입니다:
import com.groupdocs.signature.Signature;
public class QuickTest {
public static void main(String[] args) {
try {
Signature signature = new Signature("test-document.pdf");
System.out.println("GroupDocs.Signature is ready to go!");
} catch (Exception e) {
System.err.println("Setup issue: " + e.getMessage());
}
}
}
오류 없이 실행되면 준비 완료입니다!
Java에서 바코드 서명 생성하기
이제 재미있는 부분—바코드로 PDF에 서명해 보겠습니다. 각 단계에서 정확히 무슨 일이 일어나는지 이해할 수 있도록 작은 단계로 나눕니다.
단계 1: Signature 객체 초기화
먼저, 작업할 PDF를 GroupDocs에 알려야 합니다:
String filePath = "YOUR_DOCUMENT_DIRECTORY/sample.pdf";
Signature signature = new Signature(filePath);
여기서 일어나는 일: Signature 객체가 PDF를 메모리로 로드하고 수정 준비를 합니다. 파일 경로가 올바른지 확인하세요 — Windows에서 백슬래시를 이스케이프 없이 사용하는 경우가 흔한 실수입니다 (\\ 사용하거나, 크로스 플랫폼에서 동작하는 슬래시(/) 사용).
단계 2: 바코드 옵션 구성 (바코드 추가 방법)
이제 데이터를 사용해 바코드 서명을 생성해 보겠습니다:
import com.groupdocs.signature.options.sign.BarcodeSignOptions;
import com.groupdocs.signature.domain.barcodes.BarcodeTypes;
BarcodeSignOptions options = new BarcodeSignOptions("12345678");
options.setEncodeType(BarcodeTypes.Code128);
구성 요소 설명:
"12345678"는 바코드 데이터이며 — 주문 ID, 증명서 번호 또는 필요한 식별자일 수 있습니다.Code128은 인코딩 유형입니다 (아래에서 올바른 유형 선택에 대해 자세히 설명).
전문가 팁: Code128은 숫자와 문자 모두를 처리할 수 있어 대부분의 사용 사례에 다재다능합니다. 숫자만 필요하면 Code39가 더 간단할 수 있지만, Code128이 더 유연합니다.
단계 3: 바코드 위치 지정 (PDF에 바코드 서명 방법)
여기서 GroupDocs가 진가를 발휘합니다 — 백분율 기반 위치 지정으로 바코드가 어떤 PDF 크기에서도 잘 보입니다:
import com.groupdocs.signature.domain.enums.MeasureType;
import com.groupdocs.signature.domain.Padding;
// Use percentages instead of fixed pixels
options.setLocationMeasureType(MeasureType.Percents);
options.setLeft(5); // 5% from the left edge
options.setTop(5); // 5% from the top
// Size it proportionally too
options.setSizeMeasureType(MeasureType.Percents);
options.setWidth(10); // 10% of page width
options.setHeight(5); // 5% of page height
// Add some breathing room with margins
Padding margins = new Padding();
margins.setLeft(1);
margins.setTop(1);
margins.setRight(1);
options.setMargin(margins);
백분율이 중요한 이유: A4 문서와 법률용 문서 모두에 서명한다고 가정해 보세요. 백분율 위치 지정으로 바코드가 자동으로 스케일되어 두 경우 모두 일관된 모습을 유지합니다. 고정 픽셀 값을 사용하면 큰 문서에서는 바코드가 너무 작아지고, 작은 문서에서는 너무 커집니다.
실제 예시: A4 페이지(595 × 842 포인트)에서 10% 너비 바코드는 약 60 포인트가 됩니다. 법률용 페이지(612 × 1008 포인트)에서는 약 61 포인트가 되며—자동으로 비례합니다.
단계 4: 문서 서명 및 저장 (바코드 PDF 추가 방법)
이제 실제로 서명을 적용하고 작업을 저장할 차례입니다:
String outputFilePath = "YOUR_OUTPUT_DIRECTORY/SignWithPercents/sample_signed.pdf";
signature.sign(outputFilePath, options);
중요 참고: 코드를 실행하기 전에 출력 디렉터리가 존재해야 합니다. GroupDocs는 중첩 디렉터리를 자동으로 생성하지 않으므로, 먼저 디렉터리를 만들거나 코드에서 처리하세요:
Path outputPath = Paths.get(outputFilePath);
Files.createDirectories(outputPath.getParent());
signature.sign(outputFilePath, options);
문제가 발생하면? 이 코드를 try‑catch 블록으로 감싸세요:
try {
signature.sign(outputFilePath, options);
System.out.println("PDF signed successfully at: " + outputFilePath);
} catch (Exception e) {
System.err.println("Signing failed: " + e.getMessage());
e.printStackTrace();
}
필요에 맞는 바코드 유형 선택하기 (code128 pdf barcode)
GroupDocs는 여러 바코드 형식을 지원하며, 올바른 형식을 선택하는 것이 중요합니다. 실용적인 비교를 보세요:
Code128 (기본 선택):
- 최적 용도: 혼합 알파벳·숫자 데이터 (예: “INV2024-001” 같은 ID)
- 용량: 최대 128 ASCII 문자
- 장점: 압축적이며, 널리 지원되고, 문자와 숫자를 모두 처리
- 사용 상황: 유연성이 필요하고 어떤 데이터를 인코딩할지 모를 때
Code39:
- 최적 용도: 간단한 알파벳·숫자 코드
- 용량: 43자 (A‑Z, 0‑9 및 일부 기호)
- 고려 이유: 오래된 스캐너가 더 잘 지원하는 경우가 많음
- 사용 상황: 레거시 시스템을 다루거나 데이터 밀도보다 단순함이 중요한 경우
QR Code:
- 최적 용도: 대량 데이터 (URL, JSON 페이로드 등)
- 용량: 최대 3 KB 데이터
- 강점: 복잡한 데이터 구조와 오류 정정 기능을 내장
- 사용 상황: 구조화된 데이터나 URL을 삽입해야 할 때
EAN/UPC:
- 최적 용도: 제품 식별
- 용량: 고정 길이 숫자 코드 (8‑13자리)
- 사용 상황: 소매 또는 재고 시스템을 다룰 때
빠른 결정 가이드:
- 문자와 숫자가 필요합니까? → Code128
- 숫자만 필요하고 간단히? → Code39
- 많은 데이터나 URL? → QR Code
- 소매/제품 코드? → EAN/UPC
흔히 발생하는 문제와 회피 방법
다음은 개발자들이 가장 자주 겪는 문제이며, 여러분은 피할 수 있습니다:
문제 1: 바코드 위치가 잘못 표시됨
증상: 바코드가 예상치 못한 위치에 나타나거나 잘려 나갑니다.
일반 원인:
- 서로 다른 페이지 크기에 픽셀 값을 사용
- PDF 좌표가 왼쪽 하단에서 시작한다는 점을 잊음 (상단이 아님)
- 여백 때문에 내용이 보이는 영역 밖으로 밀림
해결책:
일관성을 위해 항상 백분율 기반 위치 지정을 사용하세요:
options.setLocationMeasureType(MeasureType.Percents);
options.setLeft(5); // 5% from left works on any page width
문제 2: 바코드 텍스트가 읽히지 않음
증상: 인코딩된 텍스트는 표시되지만 스캐너가 읽지 못합니다.
원인:
- 데이터 양에 비해 바코드가 너무 작음
- 데이터에 맞지 않는 인코딩 유형
- 낮은 해상도 또는 대비 부족
해결책:
바코드 크기를 데이터 길이에 맞추세요. 10‑15자 Code128의 경우 페이지 너비의 최소 8‑10%를 목표로 합니다:
options.setWidth(10); // Give it room to breathe
options.setHeight(5); // Maintain proper aspect ratio
문제 3: 파일 경로 예외
증상: FileNotFoundException 등 오류 발생.
원인:
- 단일 백슬래시가 있는 하드코딩된 Windows 경로
- 출력 디렉터리 미존재
- 파일 권한 문제
해결책:
슬래시(/)를 사용하고(모든 환경에서 동작) 먼저 디렉터리를 생성하세요:
String filePath = "documents/sample.pdf"; // Works on Windows, Mac, Linux
Files.createDirectories(Paths.get("output/signed"));
문제 4: 대용량 PDF 메모리 문제
증상: 큰 문서를 처리할 때 메모리 부족 오류 발생.
해결책:
작업이 끝난 후 Signature 객체를 닫아 리소스를 해제하세요:
try (Signature signature = new Signature(filePath)) {
signature.sign(outputFilePath, options);
} // Automatically closes and releases memory
바코드 구현 테스트하기
배포 전에 바코드가 실제로 작동하는지 확인하세요. 실용적인 테스트 체크리스트는 다음과 같습니다:
1. 시각 검사 테스트
서명된 PDF를 열고 다음을 확인하세요:
- 바코드가 보이고 올바르게 배치되었는가?
- 흐릿하거나 픽셀화되지 않고 선명한가?
- 주변에 충분한 여백이 있는가?
2. 스캔 테스트
휴대폰에 바코드 스캐너 앱(예: “Barcode Scanner” 또는 “QR & Barcode Reader”)을 사용해 확인하세요:
- 스캐너가 바코드를 읽을 수 있는가
- 디코딩된 데이터가 인코딩한 데이터와 일치하는가
- 다양한 각도와 거리에서도 작동하는가
3. 크로스 플랫폼 테스트
다양한 장치에서 PDF를 열어보세요:
- Windows (Adobe Reader, Chrome)
- Mac (Preview, Chrome)
- 모바일 장치 (iOS, Android)
모든 환경에서 바코드가 올바르게 렌더링되는지 확인하세요.
4. 자동화 테스트 코드
다음은 실행할 수 있는 간단한 테스트입니다:
import org.junit.Test;
import static org.junit.Assert.*;
public class BarcodeSignatureTest {
@Test
public void testBarcodeSigning() {
String testPdf = "test-data/sample.pdf";
String output = "test-output/signed.pdf";
try (Signature signature = new Signature(testPdf)) {
BarcodeSignOptions options = new BarcodeSignOptions("TEST123");
options.setEncodeType(BarcodeTypes.Code128);
signature.sign(output, options);
// Verify output file exists
assertTrue(new File(output).exists());
// Verify file size increased (signature was added)
long originalSize = new File(testPdf).length();
long signedSize = new File(output).length();
assertTrue(signedSize > originalSize);
} catch (Exception e) {
fail("Signing should not throw exception: " + e.getMessage());
}
}
}
바코드 서명의 실제 활용 사례
이 기술이 실제 시스템에서 빛을 발하는 사례를 살펴보겠습니다:
1. 증명서 생성 및 검증
시나리오: 수료증을 발급하는 교육 플랫폼을 구축하고 있습니다.
구현: 고유 증명서 ID(예: “CERT‑2024‑00123”)를 생성하고 오른쪽 하단에 Code128 바코드로 삽입합니다. 바코드를 스캔하면 API가 즉시 증명서 세부 정보를 가져와 수동 데이터 입력을 없앨 수 있습니다.
2. 청구서 추적 시스템
시나리오: 회사에서 매월 수천 건의 청구서를 처리합니다.
구현: 청구서 번호와 결제 기한을 QR 코드로 삽입하고 스캐너가 쉽게 읽을 수 있는 위치에 배치합니다. 자동 분류 시스템이 인간 개입 없이 청구서를 라우팅하여 처리 시간을 몇 시간에서 몇 분으로 단축합니다.
3. 법률 계약 관리
시나리오: 로펌에서 계약 버전 및 수정 사항을 추적해야 합니다.
구현: 각 계약 버전에 계약 ID, 버전 번호, 서명 날짜를 포함한 고유 바코드 식별자를 부여합니다. 감사 시 스캔하면 전체 버전 이력이 자동으로 표시됩니다.
4. 의료 기록 보안
시나리오: 병원에서 무단 기록 접근을 방지하고자 합니다.
구현: 환자 ID와 기록 생성 타임스탬프를 바코드에 삽입합니다. 인증된 장치만이 디코딩하여 전체 기록에 접근할 수 있으며, 모든 스캔은 규정 준수를 위한 감사 로그를 생성합니다.
성능 최적화 팁
다수의 PDF에 서명할 때 성능이 중요합니다. 원활히 동작하도록 하는 팁은 다음과 같습니다:
배치 처리 전략
문서를 하나씩 서명하는 대신 배치 처리합니다:
List<String> pdfFiles = Arrays.asList("doc1.pdf", "doc2.pdf", "doc3.pdf");
for (String pdfFile : pdfFiles) {
try (Signature signature = new Signature(pdfFile)) {
BarcodeSignOptions options = createBarcodeOptions(); // Reuse options
signature.sign(getOutputPath(pdfFile), options);
}
}
이점: 옵션 객체를 재사용하고 리소스를 적절히 닫아 메모리 누수를 방지합니다.
메모리 관리
매우 큰 PDF(50 + MB)의 경우:
- 한 번에 여러 개를 로드하지 말고 순차적으로 처리
- try‑with‑resources를 사용해 정리 보장
- 필요 시 힙 크기를 모니터링하고 JVM 파라미터를 조정(
-Xmx2g)
캐시 전략
같은 바코드로 반복 서명한다면:
// Create options once, reuse many times
BarcodeSignOptions templateOptions = createStandardBarcodeOptions();
// For each document, clone and customize
BarcodeSignOptions documentOptions = templateOptions.clone();
documentOptions.setText(uniqueDocumentId);
바코드 서명을 사용해야 할 때 (및 사용하지 말아야 할 때)
이상적인 상황:
- 기계가 읽을 수 있는 문서 식별자가 필요함
- 문서가 자동으로 스캔·처리될 예정
- 디지털 인증서 없이 변조 방지 추적을 원함
- 기존 바코드 인프라와 통합
다음 경우는 적합하지 않음:
- 법적 구속력이 있는 디지털 서명이 필요할 때(대신 디지털 인증서 사용)
- 문서를 인간만 볼 경우(간단한 텍스트 워터마크로 충분)
- 바코드가 페이지를 차지할 정도로 작은 문서 작업
- 보안 요구사항이 암호화를 요구할 때(바코드는 누구나 볼 수 있고 스캔 가능)
접근 방식을 결합할 수 있나요? 물론 가능합니다! 많은 시스템이 추적을 위한 바코드 서명과 법적 효력을 위한 디지털 서명을 함께 사용합니다.
자주 묻는 질문
Q: 동일 PDF에 서로 다른 바코드 유형을 사용할 수 있나요?
A: 예! 각 바코드 유형마다 다른 BarcodeSignOptions를 사용해 signature.sign()을 여러 번 호출하면 됩니다. 단, 겹치지 않도록 주의하세요.
Q: 특수 문자를 포함한 바코드를 어떻게 처리하나요?
A: Code128은 대부분의 ASCII 문자를 잘 처리합니다. 유니코드나 복잡한 데이터는 QR 코드로 전환하면 UTF‑8 인코딩을 지원합니다.
Q: Code128 바코드에 저장할 수 있는 최대 데이터는 얼마인가요?
A: 이론적으로는 128자까지 가능하지만, 30‑40자를 초과하면 가독성이 크게 떨어집니다. 더 큰 데이터는 QR 코드를 사용하세요.
Q: 바코드를 추가하면 PDF 파일 크기가 크게 증가하나요?
A: 눈에 띄게 늘어나지는 않습니다—바코드는 벡터 그래픽이며, 크기와 복잡도에 따라 보통 5‑20 KB 정도만 추가됩니다.
Q: 바코드를 회전하거나 세로로 배치할 수 있나요?
A: 예! options.setRotationAngle(90)을 사용해 바코드를 회전시킬 수 있으며, 여백에 배치할 때 유용합니다.
Q: 다중 페이지 PDF의 모든 페이지에 바코드를 표시하려면 어떻게 해야 하나요?
A: 페이지를 순회하면서 각 페이지에 서명을 적용합니다. 어떤 페이지에 서명할지 제어하려면 GroupDocs 문서의 PagesSetup 클래스를 확인하세요.
Q: 바코드 스캐너가 생성된 바코드를 읽지 못하면 어떻게 하나요?
A: 먼저 스캐너가 선택한 바코드 유형을 지원하는지 확인하세요. 그런 다음 바코드 크기를 늘리세요—대부분의 스캔 문제는 바가 너무 작아서 발생합니다. 신뢰할 수 있는 읽기를 위해 최소 1인치(2.54 cm) 너비를 목표로 하세요.
추가 자료
문서:
다운로드 및 라이선스:
커뮤니티 및 지원:
- Support Forum - GroupDocs 엔지니어가 활발히 참여하는 커뮤니티
마지막 업데이트: 2026-03-06
테스트 환경: GroupDocs.Signature 23.12 (Java)
작성자: GroupDocs