소개

청구 통합은 GroupDocs.Merger for Python을 사용하여 여러 재무 문서를 하나의 PDF로 결합하는 워크플로우입니다. 재무 팀은 종종 청구서와 함께 납품서, 서비스 보고서, 보증 조건을 보내야 하지만 파일을 수동으로 연결하면 오류가 발생하고 시간이 낭비됩니다. GroupDocs.Merger는 이 과정을 자동화하여 모든 첨부 파일이 올바른 순서대로 정렬되고, 선택적으로 보안이 적용되며, 하나의 깔끔한 PDF로 전달되도록 합니다.

이 튜토리얼에서는 다음을 확인할 수 있습니다.

  • 일반 PDF 청구서를 지원 파일과 병합하기
  • JPG 이미지와 DOCX 계약서와 같은 혼합 형식 처리하기
  • 암호로 보호된 청구서를 열고, 첨부 파일을 추가한 뒤, 다시 암호를 적용하기
  • 큰 첨부 파일에서 선택된 페이지만 포함하여 최종 번들을 작게 유지하기

지난 분기에 회계 시스템이 암호로 보호된 청구서를 생성하고 법무 팀이 다중 페이지 보증 DOCX를 추가했을 때 바로 이 시나리오에 직면했습니다. 아래 코드는 5분 이내에 문제를 해결했습니다.

암호로 보호된 청구서를 다른 문서와 병합하는 것이 언제 의미가 있나요?

많은 기업이 규정 준수를 위해 청구서를 저장 시 암호화합니다. 청구서를 고객에게 비보호 첨부 파일(영수증, 약관, 이미지)과 함께 보내야 할 경우, 병합을 위해 원본 암호를 제거한 뒤 최종 번들에 다시 적용해야 합니다. GroupDocs.Merger는 LoadOptions를 통해 해제 암호를 제공하고, 추가 파일을 결합한 뒤 AddPasswordOptions로 병합된 PDF에 다시 암호를 적용할 수 있게 해줍니다. 이렇게 하면 기밀성을 유지하면서 하나의 쉽게 열 수 있는 문서를 제공할 수 있습니다.

사전 요구 사항

  • Python 3.8+ (via .NET bridge)
  • GroupDocs.Merger for Python – 설치:
pip install groupdocs-merger
  • 청구서 PDF(invoice.pdf)와 첨부 파일 경로 목록
  • (선택) 원본 청구서와 출력 PDF의 암호

1단계: PDF 첨부 파일 기본 통합

가장 간단한 경우는 PDF 청구서를 다른 PDF, 이미지 또는 Word 파일과 병합하는 것입니다. API는 비 PDF 입력을 자동으로 PDF로 변환한 뒤 결합합니다.

import groupdocs_merger as gm

# 소스 파일 경로
invoice = "invoice.pdf"
attachments = ["delivery_note.pdf", "service_report.pdf"]
output = "billing_package.pdf"

with gm.Merger(invoice) as merger:
    for path in attachments:
        merger.join(path)  # 각 파일을 PDF로 정규화하고 추가
    merger.save(output)

핵심 포인트:

  • gm.Merger는 호스트 문서(청구서)와 함께 인스턴스화됩니다.
  • join()은 지원되는 모든 형식을 받아들이며, 라이브러리가 변환을 처리합니다.
  • save()는 병합된 PDF를 지정된 경로에 기록합니다.

2단계: 혼합 형식 첨부 파일 통합

실제 청구 패키지는 종종 스캔 이미지(JPG)와 법적 계약서(DOCX)를 포함합니다. 같은 코드가 작동하는 이유는 GroupDocs.Merger가 모든 첨부 파일을 실시간으로 PDF로 정규화하기 때문입니다.

attachments = ["receipt.jpg", "warranty_terms.docx", "extra_clause.pdf"]
output = "billing_mixed.pdf"

with gm.Merger(invoice) as merger:
    for path in attachments:
        merger.join(path)  # JPG와 DOCX가 자동으로 PDF로 변환됨
    merger.save(output)

왜 중요한가: 모든 것을 PDF로 변환하면 수신자가 여러 뷰어를 번갈아 사용할 필요가 없어 원활한 경험을 제공합니다.

3단계: 암호로 보호된 청구서 처리

청구서가 암호화된 경우 LoadOptions를 통해 암호를 제공합니다. 병합 후에는 AddPasswordOptions를 사용해 최종 PDF에 다시 암호를 적용할 수 있습니다.

import io

invoice_password = "Inv$2026"
output_password = "Bill$2026"

load_options = gm.domain.options.LoadOptions(invoice_password)
buffer = io.BytesIO()

# 보호된 청구서를 열고, 첨부 파일을 결합한 뒤 메모리 버퍼에 기록
with gm.Merger(invoice, load_options) as merger:
    for path in attachments:
        merger.join(path)
    merger.save(buffer)

# 병합된 문서에 다시 보안 적용
add_pwd = gm.domain.options.AddPasswordOptions(output_password)
buffer.seek(0)
with gm.Merger(buffer) as merger:
    merger.add_password(add_pwd)
    merger.save(output)

핵심 포인트:

  • LoadOptions는 원본 PDF의 잠금을 해제합니다.
  • 병합 결과는 먼저 메모리 스트림(BytesIO)에 기록됩니다.
  • AddPasswordOptions는 최종 파일에 새 암호를 적용합니다.

4단계: 첨부 파일에서 특정 페이지 선택

때때로 첨부 파일 중 일부 페이지만 필요할 수 있습니다(예: 긴 서비스 보고서의 첫 두 페이지). PageJoinOptions를 사용해 포함할 1 기반 범위를 지정합니다.

page_picks = [
    ("service_report.pdf", 1, 2),   # 페이지 1‑2만 포함
    ("terms_and_conditions.pdf", 3, 3)  # 페이지 3만 포함
]
output = "billing_selected_pages.pdf"

with gm.Merger(invoice) as merger:
    for path, first, last in page_picks:
        options = gm.domain.options.PageJoinOptions(first, last)
        merger.join(path, options)
    merger.save(output)

결과: 최종 PDF는 청구서와 선택된 페이지만 포함하여 번들을 가볍게 유지합니다.

전체 예제

전체 작업 예제와 모든 소스 파일 및 샘플 문서는 GitHub에서 확인할 수 있습니다: billing-consolidator-demo-using-groupdocs-merger-python.

모범 사례 및 팁

  • 성능: 대용량 배치에서는 필요한 옵션만 활성화하세요(예: 불필요한 형식 변환 방지).
  • 메모리 관리: with 문을 항상 사용해 Merger가 리소스를 즉시 해제하도록 합니다.
  • 보안: 병합 후 반드시 암호를 다시 적용해 원본 청구서의 기밀성을 유지하세요.
  • 파일 제한: GroupDocs.Merger는 최대 2 GB까지 지원합니다; 더 큰 파일은 병합 전에 분할이 필요할 수 있습니다.

결론

GroupDocs.Merger for Python은 흩어진 청구 문서 세트를 하나의 전문 PDF 패키지로 전환하는 간단한 API를 제공합니다. 일반 PDF, 혼합 미디어, 암호로 보호된 청구서 처리 또는 첨부 파일을 필수 페이지만