Java를 사용하여 PDF에서 바코드 서명 생성 방법

이 튜토리얼에서는 Java와 GroupDocs.Signature를 사용하여 PDF 파일에 바코드 서명을 만드는 방법을 배웁니다. 바코드 서명은 변조 방지와 스캔이 쉬운 기계 판독 식별자를 삽입하여 계약서, 증명서, 청구서 및 신뢰할 수 있는 검증이 필요한 모든 문서에 적합합니다.

빠른 답변

  • 바코드 서명이란? 스캐너 또는 소프트웨어가 읽을 수 있는 구조화된 데이터를 저장하는 PDF에 삽입된 바코드입니다.
  • 추천하는 바코드 유형은? Code128, 알파벳과 숫자 데이터를 컴팩트하게 처리하기 때문입니다.
  • 라이선스가 필요합니까? 테스트용으로는 무료 체험판이 작동하며, 실제 운영을 위해서는 정식 라이선스가 필요합니다.
  • 바코드를 모든 페이지 크기에 배치할 수 있나요? 예—자동 스케일링을 위해 퍼센트 기반 위치 지정 사용.
  • 바코드가 벡터 기반인가요? 예, PDF에 몇 킬로바이트만 추가되며 어떤 해상도에서도 선명합니다.

바코드 서명이란?

바코드 서명은 PDF 페이지에 직접 삽입되는 벡터 기반 바코드로, 시각 요소와 나중에 검증 가능한 암호화 서명 역할을 동시에 수행합니다. ID나 타임스탬프와 같은 구조화된 데이터를 저장하고 문서 무결성을 보장하면서 기계 판독 가능한 참조를 제공합니다.

바코드 서명이 PDF에 중요한 이유

바코드 서명은 PDF에 컴팩트하고 기계 판독 가능한 식별자를 제공하여 즉시 스캔할 수 있게 하며, 수동 데이터 입력을 없애고 오류를 줄입니다. 벡터 그래픽으로 삽입되기 때문에 어떤 해상도에서도 선명하게 유지되며 파일에 몇 킬로바이트만 추가됩니다. 가독성, 변조 방지, 최소 크기의 조합은 계약서, 청구서, 증명서 및 신뢰할 수 있는 검증이 필요한 모든 문서에 이상적입니다.

아마도 겪어봤을 문제는 다음과 같습니다: 기계 판독 가능하고 변조 방지된 고유 식별자를 PDF에 추가해야 합니다. 문서 관리 시스템을 구축하거나, 증명서를 처리하거나, 나중에 검증이 필요한 계약서를 다루고 있을 수 있습니다.

바코드 서명이 바로 이런 경우에 유용합니다. 단순 텍스트 스탬프와 달리 바코드는 스캐너(및 소프트웨어)가 즉시 읽을 수 있는 구조화된 데이터를 삽입할 수 있습니다. 또한 GroupDocs.Signature for Java를 통한 PDF 서명과 결합하면 복잡한 데이터베이스 조회 없이 문서를 추적하고 검증하는 강력한 방법을 얻을 수 있습니다.

이 가이드에서는 Java PDF에 바코드 서명을 구현하는 방법을 정확히 배웁니다 — 기본 설정부터 유연한 위치 지정이 가능한 프로덕션 수준 코드까지. 청구서 시스템, 증명서 생성기, 계약 관리 플랫폼을 구축하든, 마지막까지 필요한 모든 것을 갖추게 됩니다.

배우게 될 내용:

  • 몇 분 안에 GroupDocs.Signature for Java 설정하기
  • Code128 바코드 서명 생성 (그리고 이것이 종종 최선의 선택인 이유)
  • 모든 PDF 크기에 적용되는 퍼센트 기반 레이아웃을 사용한 바코드 위치 지정
  • 개발자를 흔들리는 일반적인 함정 피하기
  • 구현을 올바르게 테스트하기

Java에서 바코드 서명 생성 방법

Java에서 바코드 서명을 생성하려면 대상 PDF를 로드하고, 데이터, 유형, 크기 및 위치와 같은 바코드 옵션을 구성한 뒤 서명을 적용하여 새 문서를 생성합니다. GroupDocs.Signature가 렌더링과 암호화 결합을 처리하므로 원하는 매개변수를 제공하고 파일 경로를 관리하기만 하면 됩니다.

전제 조건 및 환경 체크리스트

시작하기 전에 다음 항목이 준비되어 있는지 확인하십시오:

  • Java Development Kit (JDK) 8 이상 – 모든 GroupDocs Java 라이브러리에 필요합니다.
  • Maven 또는 Gradle – GroupDocs.Signature 의존성을 관리합니다.
  • IDE (IntelliJ IDEA, Eclipse, VS Code 등 Java 확장 포함).
  • GroupDocs.Signature for Java (버전 23.12 이상 권장).
  • 기본 Java 지식 – 클래스 생성, 예외 처리 및 파일 I/O 작업에 익숙해야 합니다.

프로젝트에 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'

수동 설정을 선호하나요? GroupDocs.Signature for Java releases에서 JAR를 직접 다운로드하고 클래스패스에 추가하십시오.

라이선스 설정하기

전체 프로덕션에 들어가기 전에 라이선스를 처리해야 합니다:

  • 무료 체험: 테스트에 적합 — GroupDocs 웹사이트에서 핵심 기능을 탐색하십시오.
  • 임시 라이선스: 평가에 더 많은 시간이 필요합니까? 30일 임시 라이선스를 신청하십시오.
  • 정식 라이선스: 프로덕션 준비가 되었나요? 무제한 사용을 위한 라이선스를 구매하십시오.

모든 것이 정상 작동하는지 확인하기 위한 간단한 체크가 있습니다:

Signature signature = new Signature("sample.pdf");
System.out.println("Signature object created successfully.");

오류 없이 실행되면 준비가 완료된 것입니다!

Java에서 바코드 서명 생성 방법

이제 재미있는 부분입니다 — 바코드로 PDF에 서명해 보겠습니다. 각 단계에서 정확히 무슨 일이 일어나는지 이해할 수 있도록 작은 단계로 나눕니다.

단계 1: Signature 객체 초기화

정의 앵커: Signature 클래스는 PDF 문서를 로드, 수정 및 저장하기 위한 GroupDocs.Signature의 진입점입니다.

먼저, 작업 중인 PDF를 GroupDocs에 알려야 합니다:

Signature signature = new Signature("input.pdf");

여기서 일어나는 일: Signature 객체가 PDF를 메모리로 로드하고 수정 준비를 합니다. 파일 경로가 올바른지 확인하십시오 — Windows에서 백슬래시를 이스케이프 없이 사용하는 흔한 실수입니다(\\ 사용하거나 전방 슬래시를 사용하면 크로스 플랫폼에서 작동합니다).

단계 2: 바코드 옵션 구성 (바코드 추가 방법)

정의 앵커: BarcodeSignOptions는 PDF 내부에 바코드를 렌더링하는 데 필요한 모든 설정을 캡슐화합니다.

이제 데이터를 사용하여 바코드 서명을 생성해 보겠습니다:

BarcodeSignOptions options = new BarcodeSignOptions("12345678");
options.setEncodeType(BarcodeEncodeType.Code128);
  • "12345678"은 바코드 데이터이며 — 주문 ID, 증명서 번호 또는 필요한 모든 식별자가 될 수 있습니다.
  • Code128은 인코딩 유형입니다 (올바른 유형 선택에 대한 자세한 내용은 아래 참고).

팁: Code128은 숫자와 문자를 모두 처리할 수 있어 대부분의 사용 사례에 다재다능합니다. 숫자만 필요하면 Code39가 더 간단할 수 있지만, Code128이 더 큰 유연성을 제공합니다.

단계 3: 바코드 위치 지정 (PDF에 바코드 서명 방법)

정의 앵커: SignatureOptions는 페이지 번호, 크기 및 정렬과 같은 레이아웃 속성을 제공합니다.

여기서 GroupDocs가 진가를 발휘합니다 — 퍼센트 기반 위치 지정으로 바코드가 어떤 PDF 크기에서도 잘 보입니다:

options.setLeft(10);   // 10% from the left edge
options.setTop(90);    // 90% from the bottom edge (near the footer)
options.setWidth(30);  // 30% of page width
options.setHeight(10); // 10% of page height
options.setPageNumber(1);

퍼센트가 중요한 이유: A4 문서와 법률용 문서 모두에 서명한다고 가정해 보십시오. 퍼센트 위치 지정으로 바코드가 자동으로 스케일되어 두 경우 모두 일관된 모습을 유지합니다. 고정 픽셀 값을 사용하면 큰 문서에서는 바코드가 너무 작아지고 작은 문서에서는 너무 커집니다.

실제 예시: A4 페이지(595 × 842 포인트)에서 30% 너비 바코드는 약 180 포인트가 됩니다. 법률용 페이지(612 × 1008 포인트)에서는 약 184 포인트가 되며 — 자동으로 비례합니다.

단계 4: 문서 서명 및 저장 (바코드 PDF 추가 방법)

이제 실제로 서명을 적용하고 작업을 저장할 차례입니다:

signature.sign(outputPath, options);

중요 참고: 이 코드를 실행하기 전에 출력 디렉터리가 존재해야 합니다. GroupDocs는 중첩 디렉터리를 자동으로 생성하지 않으므로 먼저 생성하거나 코드에서 처리하십시오:

new File("output").mkdirs();

문제가 발생하면? 이를 try‑catch 블록으로 감싸십시오:

try {
    signature.sign("signed.pdf", options);
} catch (Exception e) {
    e.printStackTrace();
}

필요에 맞는 바코드 유형 선택 (code128 바코드 생성)

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.setLeft(5);
options.setTop(95);
options.setWidth(40);
options.setHeight(12);

문제 2: 바코드 텍스트가 읽히지 않음

증상: 인코딩된 텍스트는 표시되지만 스캐너가 읽을 수 없습니다.
원인:

  • 데이터 양에 비해 바코드가 너무 작음
  • 데이터에 맞지 않는 인코딩 유형
  • 바와 배경 사이의 대비가 낮음

해결책: 바코드 크기를 데이터 길이에 맞추십시오. Code128의 경우 10‑15자이면 페이지 너비의 최소 8‑10%를 목표로 합니다.

문제 3: 파일 경로 예외

증상: FileNotFoundException 등 오류 발생.
원인:

  • 단일 백슬래시가 있는 하드코딩된 Windows 경로
  • 출력 디렉터리가 존재하지 않음
  • 파일 권한 문제

해결책: 전방 슬래시를 사용하고(모든 환경에서 작동) 먼저 디렉터리를 생성하십시오:

Path output = Paths.get("output/signed.pdf");
Files.createDirectories(output.getParent());

문제 4: 대용량 PDF 메모리 문제

증상: 큰 문서를 처리할 때 메모리 부족 오류 발생.
해결책: 작업이 끝난 후 Signature 객체를 닫아 리소스를 해제하십시오:

signature.close();

바코드 구현 테스트

배포 전에 바코드가 실제로 작동하는지 확인하십시오. 실용적인 테스트 체크리스트는 다음과 같습니다:

1. 시각 검사 테스트

  • 바코드가 보이고 올바르게 배치되었나요?
  • 선명하게 보이나요(흐리거나 픽셀화되지 않음)?
  • 주변에 충분한 여백이 있나요?

2. 스캔 테스트

휴대폰의 바코드 스캔 앱(예: “Barcode Scanner” 또는 “QR & Barcode Reader”)을 사용하여 확인하십시오:

  • 스캐너가 바코드를 읽을 수 있음
  • 디코딩된 데이터가 인코딩한 내용과 일치함
  • 다양한 각도와 거리에서도 작동함

3. 크로스 플랫폼 테스트

다양한 장치에서 PDF를 열어보십시오:

  • Windows (Adobe Reader, Chrome)
  • Mac (Preview, Chrome)
  • 모바일 장치(iOS, Android)

바코드가 모든 환경에서 올바르게 렌더링되는지 확인하십시오.

4. 자동화 테스트 코드

실행할 수 있는 간단한 테스트가 있습니다:

Signature testSignature = new Signature("signed.pdf");
List<BarcodeSignature> signatures = testSignature.search(BarcodeSignature.class);
if (signatures.size() > 0) {
    System.out.println("Barcode found: " + signatures.get(0).getText());
}

바코드 서명의 실제 활용 사례

이 기술이 실제 시스템에서 빛을 발하는 사례를 살펴보겠습니다:

1. 증명서 생성 및 검증

시나리오: 수료증을 발급하는 교육 플랫폼을 구축하고 있습니다.
구현: 고유한 증명서 ID(예: “CERT‑2024‑00123”)를 생성하고 오른쪽 하단에 Code128 바코드로 삽입합니다. 바코드를 스캔하면 API가 즉시 증명서 세부 정보를 조회하여 수동 데이터 입력을 없앱니다.

2. 청구서 추적 시스템

시나리오: 회사에서 매월 수천 건의 청구서를 처리합니다.
구현: 청구서 번호와 만료일을 스캔 장비가 쉽게 읽을 수 있는 위치에 QR 코드로 추가합니다. 자동 분류 시스템이 인간 개입 없이 청구서를 라우팅하여 처리 시간을 몇 시간에서 몇 분으로 단축합니다.

3. 법률 계약 관리

시나리오: 로펌에서 계약 버전 및 수정 사항을 추적해야 합니다.
구현: 각 계약 버전에 계약 ID, 버전 번호, 서명 날짜를 포함한 고유 바코드 식별자를 부여합니다. 감사 중 스캔하면 전체 버전 이력이 자동으로 표시됩니다.

4. 의료 기록 보안

시나리오: 병원에서 무단 기록 접근을 방지하고자 합니다.
구현: 환자 ID와 기록 생성 타임스탬프를 바코드에 삽입합니다. 인증된 장치만이 디코딩하여 전체 기록에 접근할 수 있으며, 모든 스캔은 규정 준수를 위한 감사 로그를 생성합니다.

성능 최적화 팁 (java 문서 보안)

많은 PDF에 서명할 때 성능이 중요합니다. 원활한 실행을 위한 팁은 다음과 같습니다:

배치 처리 전략

문서를 하나씩 서명하는 대신 배치 처리하십시오:

for (String filePath : pdfList) {
    Signature batchSignature = new Signature(filePath);
    batchSignature.sign(outputPath, options);
    batchSignature.close();
}

이점: 옵션 객체를 재사용하고 리소스를 적절히 닫아 메모리 누수를 방지합니다.

대용량 PDF 메모리 관리

  • 50 MB 이상 PDF의 경우:
    • 한 번에 여러 개를 로드하지 말고 순차적으로 처리합니다.
    • try‑with‑resources를 사용해 정리 보장.
    • 필요 시 힙 크기를 모니터링하고 JVM 파라미터를 조정하십시오: -Xmx2g.

자주 사용하는 바코드 캐시

많은 문서에 동일한 바코드를 서명한다면 BarcodeSignOptions 인스턴스를 캐시하십시오:

BarcodeSignOptions cachedOptions = new BarcodeSignOptions("STATIC_ID");
cachedOptions.setEncodeType(BarcodeEncodeType.Code128);

바코드 서명을 사용해야 할 때 (및 사용하면 안 되는 경우)

완벽한 시나리오:

  • 기계 판독 가능한 문서 식별자가 필요합니다.
  • 문서가 자동으로 스캔·처리됩니다.
  • 디지털 인증서 없이 변조 방지 추적을 원합니다.
  • 기존 바코드 인프라와 통합이 필요합니다.

비추천 상황:

  • 법적 구속력이 있는 디지털 서명이 필요할 때(대신 디지털 인증서를 사용).
  • 문서를 인간만 볼 경우(간단한 텍스트 워터마크로 충분).
  • 매우 작은 문서에 바코드가 페이지를 차지할 경우.
  • 보안 요구사항이 암호화를 요구할 때—바코드는 누구나 볼 수 있고 스캔 가능.

접근 방식을 결합할 수 있나요? 물론 가능합니다! 많은 시스템이 추적을 위해 바코드 서명과 법적 유효성을 위해 디지털 서명을 함께 사용합니다.

자주 묻는 질문

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-07-20
테스트 환경: GroupDocs.Signature 23.12 (Java)
작성자: GroupDocs

<dependency>
    <groupId>com.groupdocs</groupId>
    <artifactId>groupdocs-signature</artifactId>
    <version>23.12</version>
</dependency>
implementation 'com.groupdocs:groupdocs-signature:23.12'
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());
        }
    }
}
String filePath = "YOUR_DOCUMENT_DIRECTORY/sample.pdf";
Signature signature = new Signature(filePath);
import com.groupdocs.signature.options.sign.BarcodeSignOptions;
import com.groupdocs.signature.domain.barcodes.BarcodeTypes;

BarcodeSignOptions options = new BarcodeSignOptions("12345678");
options.setEncodeType(BarcodeTypes.Code128);
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);
String outputFilePath = "YOUR_OUTPUT_DIRECTORY/SignWithPercents/sample_signed.pdf";
signature.sign(outputFilePath, options);
Path outputPath = Paths.get(outputFilePath);
Files.createDirectories(outputPath.getParent());
signature.sign(outputFilePath, options);
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();
}
options.setLocationMeasureType(MeasureType.Percents);
options.setLeft(5);  // 5% from left works on any page width
options.setWidth(10);  // Give it room to breathe
options.setHeight(5);  // Maintain proper aspect ratio
String filePath = "documents/sample.pdf";  // Works on Windows, Mac, Linux
Files.createDirectories(Paths.get("output/signed"));
try (Signature signature = new Signature(filePath)) {
    signature.sign(outputFilePath, options);
} // Automatically closes and releases memory
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());
        }
    }
}
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);
    }
}
// Create options once, reuse many times
BarcodeSignOptions templateOptions = createStandardBarcodeOptions();

// For each document, clone and customize
BarcodeSignOptions documentOptions = templateOptions.clone();
documentOptions.setText(uniqueDocumentId);

관련 튜토리얼