sgcPDF 기능 표
sgcPDF가 수행하는 모든 기능을 작업별로 모았습니다. 모든 기능은 sgcPDF_*.pas 유닛에 Object Pascal로 구현되어 있으며 전체 소스 코드와 함께 제공됩니다. 이 페이지의 코드 샘플은 sgcPDF 소스로 컴파일하여 실행한 것입니다.
sgcPDF가 수행하는 모든 기능을 작업별로 모았습니다. 모든 기능은 sgcPDF_*.pas 유닛에 Object Pascal로 구현되어 있으며 전체 소스 코드와 함께 제공됩니다. 이 페이지의 코드 샘플은 sgcPDF 소스로 컴파일하여 실행한 것입니다.
| 기능 | 세부 정보 |
|---|---|
| 페이지 | A4, Letter 또는 사용자 지정 크기와 방향을 자유롭게 설정하고 페이지를 회전할 수 있습니다. |
| 텍스트 | 14개 표준 PDF 폰트와 색상 텍스트, 캔버스와 HTML 렌더러를 통한 단락 줄바꿈 지원. |
| 임베디드 폰트 | TrueType, OpenType(TrueType/CFF 아용라인), TrueType 컴렉션을 자동으로 임베딩하고 서브셋화하며, 유니코드 ToUnicode 맵으로 텍스트 복사와 검색이 가능합니다. |
| 복잡한 문자 체계 | 커닝과 리가처, GSUB을 통한 아랍어 연결형, 우에서좌 텍스트를 위한 유니코드 양방향 알고리즘. |
| CJK 텍스트 | 임베디드 TrueType 폰트 및 TrueType 컴렉션을 통한 중국어·일본어·한국어 텍스트. |
| 이미지 | JPEG, 알파 채널 PNG, BMP, TIFF(CCITT 팩스 이미지 포함), 소프트 마스크 지원. |
| 벡터 그래픽 | 선, 사각형, 원, 타원, 베지어 곱선, 다각형, 점선 패턴, 선 끝단과 연결부, 투명도, 그라데이션. |
| 표 | 페이지를 걸쳐 이어지는 머리글, 테두리, 셀 여백, 색상을 갖춘 표. |
| 바코드 | Code 128, Code 39, EAN-13, EAN-8, UPC-A, ITF, Codabar, GS1-128, QR 코드, DataMatrix(ECC200), PDF417을 벡터로 그립니다. |
| 주석 및 링크 | 텍스트 노트, 하이라이트, URL 및 페이지 링크, 스탬프, 자유 텍스트 주석. |
| 북마크 및 레이어 | 중첩 북마크(개요)와 독자가 표시/숨김을 전환할 수 있는 선택적 콘텐츠 그룹(레이어). |
| HTML → PDF | TsgcPDFHTMLRenderer: 제목, 단락, 인라인 CSS 스타일, 목록, 표, 이미지, 링크, 페이지 내림, 머리글/바닥글, 페이지 번호. |
| 캔버스 및 EMF → PDF | TsgcPDFCanvas는 그리기 호출을 PDF 콘텐츠로 기록하며, EMF 메타파일은 PDF 벡터로 재생되어 기존 보고서·차트 코드가 PDF 출력을 생성합니다. |
procedure HTMLToPDF(const APDFFile: string);
var
oHTML: TsgcPDFHTMLRenderer;
begin
oHTML := TsgcPDFHTMLRenderer.Create(nil);
try
oHTML.PageWidth := 595;
oHTML.PageHeight := 842;
oHTML.FooterText := 'Page {page} of {pages}';
oHTML.HTMLToPDFFile(
'<html><head><style>h1 { color: #003366 }</style></head><body>' +
'<h1>Invoice 2026-001</h1>' +
'<table><tr><th>Item</th><th>Amount</th></tr>' +
'<tr><td>Consulting</td><td>299.00</td></tr></table>' +
'</body></html>', APDFFile);
finally
oHTML.Free;
end;
end;
| 기능 | 세부 정보 |
|---|---|
| 워터마크 및 스탬프 | 폰트, 크기, 회전, 색상, 투명도를 지정하는 텍스트 워터마크를 한 페이지 또는 모든 페이지에 적용합니다. |
| 머리글, 바닥글, 페이지 번호 | Page %d of %d와 같은 형식의 머리글/바닥글 텍스트와 페이지 번호. |
| 페이지 작업 | 문서 병합, 분할, 페이지 범위 추출, 삽입, 삭제, 회전, 재배치. |
| 증분 저장 | 변경 사항은 원본 파일에 새 리비전으로 추가되므로 이전 디지털 서명이 그대로 유효합니다. |
| 컴팩트 출력 | 파일 크기를 줄이는 객체 스트림과 참조 스트림, 중복/미사용 객체 제거와 이미지 다운샘플링을 수행하는 TsgcPDFOptimizer. |
| 대용량 파일 | 오프셋은 모두 64비트이며 객체는 스트림에서 필요시 로드되므로 2GB를 넘는 파일도 열고 저장할 수 있습니다. |
| 기능 | 세부 정보 |
|---|---|
| VCL 뷰어 | TsgcPDFViewerControl: 스크롤, 확대/축소, 페이지 탐색, 텍스트 선택·복사, 강조 검색, 양식 필드 입력, 링크 탐색, 인쇄, 그리고 TsgcPDFThumbnailView와 TsgcPDFOutlineView. |
| FireMonkey 뷰어 | TsgcPDFViewerFMX는 Windows, macOS, iOS, Android에서 FMX 캔버스를 통해 그립니다. |
| 서버용 래스터 렌더러 | TsgcPDFRendererRaster는 Windows와 Linux에서 GDI 없이 페이지를 픽셀 또는 PNG로 렌더링하는 순수 Pascal 래스터라이저입니다. |
| GDI 렌더러 및 내보내기 | Windows에서 비트맵 또는 디바이스 컨텍스트로 렌더링하고, TsgcPDFExporter로 페이지와 축소판을 BMP, PNG, JPEG로 내보냅니다. |
| 그래픽 모델 | DeviceGray, DeviceRGB, DeviceCMYK, 인덱스, ICCBased, Lab 색상 공간, 축방향/방사형 그라데이션, 타일 패턴, 소프트 마스크, 블렌딩 투명도, 양식 XObject. |
| 폰트 | 임베디드된 TrueType, CFF, OpenType, Type 1 폰트 프로그램은 아용라인에서 렌더링되며, 표준 인코딩과 Identity-H CID 폰트를 지원합니다. |
| 이미지 디코더 | Flate, LZW, ASCII85, ASCIIHex, RunLength, JPEG(기본/프로그레시브, CMYK), JPEG 2000, CCITT 그룹 3·4, JBIG2. |
| 기능 | 세부 정보 |
|---|---|
| 텍스트 | 페이지 또는 문서 전체 텍스트, 임베디드 및 CID 폰트의 유니코드 매핑 포함. |
| 텍스트 위치 | TsgcPDFTextExtractor는 각 텍스트 조각의 X, Y, 폰트 이름, 크기를 반환합니다. |
| 검색 | 페이지 또는 문서 내에서 텍스트를 찾습니다. |
| 이미지 | TsgcPDFImageExtractor는 인라인 이미지와 양식 XObject 내 이미지를 포함하여 페이지의 이미지를 열거하고 PNG, JPEG, BMP로 디코딩합니다. |
| 메타데이터 및 첨부 파일 | 문서 정보, XMP 메타데이터, 북마크, 레이어, 첨부 파일. |
| 기능 | 세부 정보 |
|---|---|
| 양식 생성 | 외관 스트림을 갖춘 텍스트 필드, 찴박자, 라디오 버튼, 콤보 박스, 목록 상자, 푸쉬 버튼. |
| 입력 및 평면화 | 코드나 뷰어에서 필드 값을 설정한 다음 양식을 정적 페이지 콘텐츠로 평면화합니다. |
| FDF/XFDF | 양식 데이터를 FDF 및 XFDF로 가져오거나 내보냅니다. |
| 기능 | 세부 정보 |
|---|---|
| 암호 암호화 | RC4 40비트/128비트, AES-128, AES-256(리비전 5, 6), 사용자/소유자 암호와 권한 플래그 지원. 암호화된 파일은 로드 시 복호화됩니다. |
| 인증서 암호화 | 하나 이상의 수신자 인증서(adbe.pkcs7.s4, adbe.pkcs7.s5)를 위한 공개키 암호화. |
| 디지털 서명 | PFX 인증서로 서명, 표시/비표시 서명 필드, SHA-256/384/512, RFC 3161 타임스탬프 및 문서 타임스탬프. |
| sgcSign을 통한 PAdES | TsgcPDFPAdESSigner는 sgcSign(PEM, PFX, PKCS#11, Windows 인증서 저장소, 클라우드 HSM)의 키 공급자를 사용하여 DSS 검증 데이터가 포함된 B-B, B-T, B-LT, B-LTA 레벨의 ETSI.CAdES.detached 서명을 생성합니다. sgcSign은 별도로 라이선스됩니다. |
| 검증 | TsgcPDFSignatureVerifier는 각 서명의 무결성, 바이트 범위 커버리지, 서명자 인증서, 인증서 체인을 확인합니다. |
| 편집삭제 | TsgcPDFRedactor는 글리프 수준에서 텍스트, 이미지 픽셀, 벡터 경로, 주석을 영역 또는 텍스트 일치에 따라 제거하고 덮어쓰기를 추가하며 메타데이터를 제거할 수 있습니다. 제거된 텍스트는 결과물에서 추출될 수 없습니다. |
procedure CreateEncryptedPDF(const AFileName: string);
var
oPDF: TsgcPDFDocument;
begin
oPDF := TsgcPDFDocument.Create;
try
oPDF.AddPage(595, 842).DrawText('Secret', 50, 780, sfHelveticaBold, 24);
// user password opens the file, owner password grants full rights
oPDF.SetEncryption(emAES_256, 'user123', 'owner456');
oPDF.SaveToFile(AFileName);
finally
oPDF.Free;
end;
end;
procedure SignPDF(const AInput, AOutput: string);
var
oSigner: TsgcPDFSignatureHandler;
begin
oSigner := TsgcPDFSignatureHandler.Create;
try
oSigner.LoadCertificateFromPFX('signer.pfx', 'test123');
oSigner.Reason := 'Document approval';
oSigner.Location := 'Barcelona';
oSigner.HashAlgorithm := shaSHA256;
// visible signature field on page 1: Left, Bottom, Right, Top
oSigner.SetField('Signature1', 0, 50, 50, 250, 100);
oSigner.SignDocument(AInput, AOutput);
finally
oSigner.Free;
end;
end;
procedure SignPAdES(const AInput, AOutput: string);
var
oKey: TsgcPEMKeyProvider;
oSigner: TsgcPDFPAdESSigner;
begin
oKey := TsgcPEMKeyProvider.Create(nil);
oSigner := TsgcPDFPAdESSigner.Create(nil);
try
// any sgcSign key provider: PEM, PFX, PKCS#11, Windows store, cloud HSM
oKey.LoadFromFile('signer.pem', 'signer.key');
oSigner.KeyProvider := oKey;
// paBB, paBT (timestamp), paBLT and paBLTA (long term validation)
oSigner.Level := paBB;
// signature field and appearance through the sgcPDF handler
oSigner.Handler.SetField('Signature1', 0, 350, 50, 550, 110);
oSigner.Handler.SignerName := 'John Smith';
oSigner.Handler.Reason := 'Approved';
oSigner.SignPDFFile(AInput, AOutput);
oSigner.KeyProvider := nil;
finally
oSigner.Free;
oKey.Free;
end;
end;
procedure RedactFile(const AInput, AOutput: string);
var
oRedactor: TsgcPDFRedactor;
vOptions: TsgcPDFRedactionOptions;
begin
oRedactor := TsgcPDFRedactor.Create;
try
// every occurrence of a text, on all pages
oRedactor.AddText('John Smith');
// an area of page 0: left, bottom, right, top in points
oRedactor.AddArea(0, 50, 500, 250, 650);
vOptions := oRedactor.Options;
vOptions.OverlayText := 'REDACTED';
vOptions.RemoveMetadata := True;
oRedactor.Options := vOptions;
oRedactor.Apply(AInput, AOutput);
finally
oRedactor.Free;
end;
end;
| 기능 | 세부 정보 |
|---|---|
| PDF/A | 레벨 a/b의 PDF/A-1, PDF/A-2, PDF/A-3 출력, XMP 메타데이터, 출력 의도, 임베디드 폰트 포함. |
| 검증기 | TsgcPDFAValidator는 선택된 PDF/A 레벨에 따라 파일을 검사하고 오류와 경고를 보고합니다. |
| 태그 PDF | Document, Part, Sect, H1~H6, P, L, LI, Table, TR, TH, TD, Figure를 포함한 구조 트리와 대체 텍스트, 마크 콘텐츠, 역할 맵, 언어, MarkInfo. |
| PDF/UA-1 | PDF/A-2a 또는 PDF/A-3a와 함께 접근 가능한 출력을 제공하며, 검증기에서 PDF/UA-1 검사를 수행합니다. |
| 첨부 파일 | MIME 유형, 날짜, PDF/A-3 연관 파일 관계를 갖춘 첵부 파일. |
| Factur-X 및 ZUGFeRD | Minimum, Basic WL, Basic, EN 16931, Extended, XRechnung 프로파일을 위한 Factur-X XMP 확장 스키마로 인보이스 XML을 첨부하고 PDF/A-3b로 저장합니다. |
procedure CreateFacturX(const AInvoiceXML, AFileName: string);
var
oPDF: TsgcPDFDocument;
oXML: TMemoryStream;
vXML: TBytes;
vFont: Integer;
begin
oPDF := TsgcPDFDocument.Create;
oXML := TMemoryStream.Create;
try
// the invoice XML (CII) is created by your application
oXML.LoadFromFile(AInvoiceXML);
SetLength(vXML, oXML.Size);
Move(oXML.Memory^, vXML[0], oXML.Size);
oPDF.Info.Title := 'Invoice 2026-001';
// PDF/A requires embedded fonts
vFont := oPDF.AddTrueTypeFont('Arial', False, False);
oPDF.AddPage(595, 842).DrawTextTT('Invoice 2026-001', 50, 780, vFont, 18);
// embeds factur-x.xml, adds the Factur-X XMP schema, saves as PDF/A-3b
oPDF.Attachments.AddFacturX(vXML, fxpEN16931);
oPDF.SaveToFile(AFileName);
finally
oXML.Free;
oPDF.Free;
end;
end;
procedure ValidatePDFA(const AFileName: string);
var
oParser: TsgcPDFParser;
oValidator: TsgcPDFAValidator;
i: Integer;
begin
oParser := TsgcPDFParser.Create;
oValidator := TsgcPDFAValidator.Create(paA3b);
try
oParser.LoadFromFile(AFileName);
oParser.Parse;
if oValidator.Validate(oParser) then
WriteLn('PDF/A-3b: no errors')
else
for i := 0 to oValidator.Errors.Count - 1 do
WriteLn('Error: ', oValidator.Errors[i]);
finally
oValidator.Free;
oParser.Free;
end;
end;