세 개의 라이브러리. 세 개의 뚜렷한 작업. 잘못된 선택은 해결 방법을 찾는 데 몇 주가 소요되고, 하나만 필요한 경우에 세 개를 모두 선택하면 예상치 못한 유지 보수 비용이 발생합니다. 각 losLab PDF 라이브러리가 실제로 어떤 기능을 하는지, 어디에 적합한지, 그리고 어디에서 형제 라이브러리에게 작업을 넘기는지에 대한 직접적인 설명이 여기에 있습니다
HotPDF: Delphi에서 백지상태로 PDF 작성하기
HotPDF는 PDF 문서를 생성하기 위한 네이티브 VCL 컴포넌트입니다. 그 모델은 명령형(imperative)이며 페이지 중심(page-centric)입니다: THotPDF 인스턴스를 구성하고, 문서 속성을 설정하고, BeginDoc을 호출하고, CurrentPage에 그리고, 필요에 따라 페이지를 추가한 다음 EndDoc으로 닫습니다. BeginDoc이 실행되는 순간 암호화 딕셔너리와 압축 설정이 커밋되므로 순서가 중요합니다; 해당 시점 이후에 할당된 내용은 소급 적용되지 않고 묵시적으로 무시됩니다
드로잉 표면은 Delphi 수준에서 완전한 PDF 연산자 집합을 포괄합니다: 위치가 지정된 유니코드 텍스트를 위한 TextOut, TrueType 임베딩을 통한 SetFont, 벡터 원시 도형(선, 베지어 곡선, 타원, 사각형), 파일 또는 메모리로부터의 이미지 배치, 그리고 바코드 생성. 좌표는 Y가 위로 증가하는 왼쪽 하단 모서리부터 시작하는 포인트 단위이며, 이는 모든 사람들이 한 번씩 겪는 혼란입니다. 폰트 상태는 AddPage 이후에 유지되지 않으므로, 모든 페이지 나누기 후에 SetFont 호출이 필요합니다
AcroForm 필드는 주요(first-class) 기능입니다. 텍스트 필드, 확인란, 라디오 버튼, 콤보 상자, 목록 상자, 누름 버튼을 각각 단일 호출로 페이지 객체에 직접 추가할 수 있습니다. HotPDF는 또한 LoadFromFile을 통해 기존 PDF를 로드하고 필드 값을 채우거나 읽을 수 있으므로 양식 구축과 입력 자동화라는 두 가지 별도 워크플로에서 유용합니다
암호화 역시 문서 수준에서 처리됩니다. CryptKeyLength는 체계를 선택하고(40비트 RC4에서 AES-256까지), ActivateProtection은 이를 작동시키며, ProtectOptions는 ISO 권한 플래그를 설정합니다. 두 가지 AES-256 개정 모드(UseAES256R6에 의해 제어되는 R5와 R6)가 존재하는 이유는 리비전 6이 리비전 5의 알려진 약점을 수정하지만 PDF 2.0 지원 뷰어가 필요하기 때문입니다; 이들 사이의 선택은 호환성 결정이지 편의성 결정이 아닙니다
HotPDF의 디지털 서명 지원은 PAdES 기준 프로필을 다루므로 서명이 ETSI EN 319 142 요구 사항을 충족해야 하는 워크플로에 적합합니다. 출력 생성만이 필요한 경우 HotPDF가 가장 먼저 찾아야 할 라이브러리입니다
PDFium Component: 기존 PDF 렌더링, 보기, 읽기
PDFium Component는 구글의 PDFium 엔진을 VCL 컴포넌트로 래핑하므로 HotPDF와 근본적으로 다른 역할을 부여합니다. HotPDF가 쓰는 곳에서 PDFium Component는 읽고 렌더링합니다. 핵심 객체는 FileName을 설정한 다음 Active := True로 파일을 여는 문서 관리자인 TPdf입니다. 로드 실패는 예외로 발생하지 않습니다; Active가 단순히 False로 유지되므로 할당 후 이를 확인하는 것은 필수 사항입니다
렌더링은 폼 위에 올려놓고 PdfView.Pdf := Pdf를 통해 TPdf 인스턴스에 연결하는 시각적 컴포넌트인 TPdfView를 통해 실행됩니다. 확대/축소 및 맞춤 모드는 문서가 아니라 뷰에 존재합니다. 사람들을 걸려 넘어지게 하는 한 가지 미묘한 점은 Pdf.PageNumber와 PdfView.PageNumber가 독립적인 속성이라는 것입니다. 하나를 설정한다고 해서 다른 것이 업데이트되지 않으며, 뷰 기반 추출 API(단어 상자, 읽기 단위)는 문서가 아닌 뷰의 현재 페이지를 사용합니다
텍스트 추출은 PDFium Component가 losLab 라인업에서 직접적인 경쟁자가 없는 분야입니다. ReadablePageContent는 읽기 순서를 인식하여 구조화된 텍스트를 반환하고, PageWordBoxes는 단어 수준의 경계 사각형을 제공하며, DocumentReadingUnits는 문서 전체를 탐색합니다. 접근성 작업을 위해 IsTagged는 구조 트리가 존재하는지 여부를 알려주고 ValidatePdfUa는 UA 적합성 검사를 실행합니다. 이러한 API들은 PDFium Component를 새로운 PDF를 생성하는 것이 아니라 기존 PDF 내부에 무엇이 있는지 이해해야 하는 모든 워크플로의 자연스러운 선택으로 만듭니다
양식 채우기도 기본 엔진이 노출하는 동일한 AcroForm 레이어를 통해 PDFium 측면에서 작동합니다. 이는 소스 문서가 이미 존재하고 양식 필드를 직접 구성하는 것이 아니라 그 완성을 자동화할 때 적절합니다
PDFlibPas: 조작, 규정 준수 서명 및 직접 파일 액세스
PDFlibPas (버전 3.73.0)는 복잡성 스펙트럼의 반대편에 위치합니다. 이 라이브러리는 동일한 문서 모델 위에 세 가지 API 계층을 노출합니다: Quick-PDF 호출 규칙과 호환되는 플랫 핸들 기반 파사드(TPDFlib), 전체 객체 트리 계층(TPDFDocument), 그리고 완전한 객체 그래프를 로드하지 않고 파일 바이트에서 직접 작동하는 스트리밍 파서(TSmartPDFReader / TSmartPDFWriter)
스트리밍 계층은 PDFlibPas를 대용량 문서에 적합한 선택으로 만듭니다. TSmartPDFWriter는 전체 상호 참조 테이블을 재구성하지 않고도 디스크에 있는 파일에 증분 업데이트를 추가할 수 있으며, 이는 효율적인 재저장과 PAdES 장기 유효성 확인 스탬프 모두의 기반이 되는 메커니즘입니다. 서명된 해시가 특정 바이트 범위를 덮어야 하고 문서를 다시 쓰지 않고 서명이 적용되는 규정 준수 등급의 서명 워크플로의 경우 이 계층이 유일하게 실행 가능한 경로입니다
TPDFDocument 수준의 문서 조작에는 Merge를 통한 병합, 범위 문자열이 포함된 CopyPagesFromDoc을 통한 선택적 페이지 복사, 그리고 SetMinimumVersion 및 LockSaveVersion을 통한 버전 관리가 포함됩니다. 버전 잠금은 출력을 잠긴 버전 이상으로 밀어 올릴 수 있는 기능을 저장하려고 시도할 때 오류 602를 발생시키며, 이는 아카이브 규정 준수를 위해 출력이 특정 PDF 개정판 내에 유지되도록 보장해야 할 때 유용합니다
PDF/A 지원(ISO 19005)은 PDFlibPas의 적합성 작업대에 위치합니다. 암호화와 PDF/A는 사양상 상호 배타적이라는 점에 유의하십시오: 한 파일에 둘 다 가질 수 없습니다. 암호화된 배포 사본과 PDF/A 아카이브 사본이 필요한 워크플로는 두 개의 별도 아티팩트를 생성해야 합니다
선택하기
일반적인 의사 결정 트리는 짧습니다. 데이터에서 새 문서를 생성하는 경우 HotPDF를 사용하십시오. Delphi VCL 애플리케이션에서 기존 문서를 렌더링하거나 텍스트를 추출하는 경우 PDFium Component를 사용하십시오. 기존 PDF를 대규모로 또는 증분 저장 시맨틱을 사용하여 조작, 병합 또는 규정 준수 서명하는 경우 PDFlibPas를 사용하십시오. 많은 프로덕션 시스템이 세 가지 중 두 가지를 사용합니다: 예를 들어 HotPDF를 사용하여 출력을 생성하고 PDFlibPas를 사용하여 보관 전에 장기 유효성 확인 스탬프를 적용하거나, HotPDF가 생성한 것을 다운스트림으로 보내기 전에 미리 보기 위해 PDFium Component를 사용하는 식입니다
세 라이브러리 모두 VCL 이외의 런타임 종속성 없이 Delphi 및 C++Builder용 네이티브 파스칼 소스로 제공됩니다. PDFium Component는 엔진의 렌더링 및 구문 분석 작업을 다루는 PDFium DLL을 추가로 번들합니다. 각 라이브러리의 제품 페이지에는 전체 API 참조 및 현재 버전 기록이 포함되어 있습니다
개별 라이브러리에 대한 세부 정보: HotPDF Component, PDFium Component, 그리고 PDFlibPas