uses 절에 FPdfMerge를 추가해 TPdfNavigationMergeHelper.MergeFilesWithNavigation을 사용하거나 명시적인 대상 문서와 함께 전역 함수 MergePdfFilesWithNavigation을 호출하세요
헬퍼는 네이티브 페이지 가져오기를 준비하고 계층 outline을 재구성하며 명명된 목적지를 합치고 페이지 링크를 다시 연결합니다. 결과를 독립적으로 다시 열어 확인한 뒤 호출자의 문서를 교체합니다
pmnPreserve는 원본 계층을 유지하고 pmnGroupBySource는 각 소스 파일 이름의 제목을 추가합니다
제목, 부모 관계, 스타일, 색상, 펼친 가지, URI action, 해석된 내부 페이지 목적지를 유지합니다. 선택, 반복, 재정렬된 페이지는 처음 가져온 위치로 연결하며 생략된 페이지를 향하는 목적지는 제목으로 바꿉니다
페이지 삽입 시 기존 대상 outline의 위치를 옮깁니다. 탐색 정보와 네이티브 페이지를 캡처하는 동안 소스 파일은 쓰기 공유를 거부한 채 열어 둡니다
오류 시 중단하는 병합만 지원합니다. 서명된 대상, 지원하지 않는 outline action, 암호화 후처리는 오류 보고와 함께 거부하며 실패나 취소 시 호출자의 문서는 유지합니다
이 API는 기존 네이티브 폼 정책을 유지합니다. 고급 AcroForm 필드 충돌 및 리소스 처리가 필요하면 FPdfFormMerge를 사용하세요
PreserveNamedDestinations와 PreservePageLinks의 기본값은 모두 True입니다. 하나를 False로 설정하면 추가 탐색 처리의 해당 부분을 건너뜁니다
명명된 목적지는 기존 catalog의 /Dests 사전과 /Names/Dests 이름 트리에서 모두 읽습니다. 계층 트리, 간접 배열, /D를 가진 목적지 사전도 포함하며 같은 키가 양쪽에 있으면 이름 트리의 값을 우선합니다
결과는 균형 잡힌 /Names/Dests 트리를 사용하고 /EmbeddedFiles처럼 목적지와 관계없는 대상의 이름 트리는 유지합니다. 소스의 다른 이름 트리는 가져오지 않습니다
키는 UTF-16BE를 포함한 원본 PDF 문자열 바이트를 유지합니다. /FitH null, /XYZ null 34 null을 포함한 정확한 보기 모드와 매개변수도 유지합니다
| 정책 | 동작 |
|---|---|
pndReject | 대상에 이미 있는 소스 키가 발견되면 트랜잭션 전체를 거부합니다 |
pndRename | 기본 정책은 충돌하지 않는 이름을 유지하고 충돌한 이름에 DestinationPrefix를 붙입니다. 기본값은 Imported_이며 추가 충돌에는 2_Imported_Shared처럼 결정적인 접두사를 사용합니다 |
pndNamespace | 모든 소스 키 앞에 DestinationPrefix, 1부터 시작하는 소스 번호, 밑줄을 붙입니다. 예는 Imported_1_Shared이며 남은 충돌에는 결정적인 숫자 접두사를 붙입니다 |
DestinationPrefix는 출력 가능한 ASCII 문자 1부터 256개여야 합니다. UTF-16BE 키에는 BOM 다음에 접두사를 삽입합니다
/Dest 또는 단일 /A /GoTo action을 사용하는 내부 링크 주석을 명시적 목적지로 다시 씁니다. 따라서 이름 충돌로 변경된 뒤에도 링크 대상은 올바릅니다
페이지 삽입 시 기존 링크의 소유 페이지와 목적지를 옮깁니다. 반복해서 가져온 페이지는 각각 독립적인 링크 주석을 받으며 내부 목적지는 대상 페이지가 처음 선택된 위치로 연결합니다
목적지 페이지를 생략했다면 이름 트리에서 제거합니다. 영향받는 링크는 주석과 다른 속성을 유지하고 /Dest 또는 GoTo action만 제거합니다
URI 링크는 그대로 유지합니다. /Next를 사용한 연결 action은 현재 헬퍼의 범위를 벗어나므로 거부합니다
잘못되었거나 순환하는 목적지 트리, 찾을 수 없는 객체 참조, 중복 이름 트리 키는 트랜잭션을 거부합니다. 실패, 취소, 상한 초과는 호출자의 문서를 변경하지 않습니다
기본 상한은 outline 10,000항목, 깊이 128, 제목 1,048,576문자, 명명된 목적지 10,000개, 페이지 링크 100,000개, 문서 256 MiB입니다. 문서 바이트 상한은 MaxInt를 초과할 수 없습니다
추가 목적지 또는 링크 처리를 활성화하면 설정 깊이는 최대 256, 명명된 목적지는 최대 65,536개, 페이지 링크는 최대 1,000,000개입니다. 소스 캡처 시 raw 키 바이트도 1 MiB로 제한합니다
합친 이름 키에는 MaxTitleCharacters와 같은 값의 별도 바이트 상한을 적용합니다. 각 소스는 선택 페이지 필터링 전에 설정 상한 안에서 캡처합니다
PreservedNamedDestinationCount는 최종 명명된 목적지 수, RenamedNamedDestinationCount는 선택 정책으로 이름을 바꾼 가져온 키 수, RemovedNamedDestinationCount는 미해석되거나 생략한 이름 목적지 수입니다
RemappedPageLinkCount는 기존 및 가져온 링크 전체의 최종 내부 목적지 수이며 RemovedPageLinkCount는 제거한 내부 목적지 수입니다. /Dest와 GoTo가 함께 있는 링크는 목적지마다 한 번씩 셉니다
type
TPdfMergeNavigationPolicy= (pmnPreserve, pmnGroupBySource);
TPdfMergeNamedDestinationPolicy= (pndReject, pndRename, pndNamespace);
TPdfNavigationMergeOptions= record
NativeOptions: TPdfBatchMergeOptions;
NavigationPolicy: TPdfMergeNavigationPolicy;
MaxOutlineItems: Integer;
MaxOutlineDepth: Integer;
MaxTitleCharacters: Integer;
MaxDocumentBytes: Int64;
PreserveNamedDestinations, PreservePageLinks: Boolean;
NamedDestinationPolicy: TPdfMergeNamedDestinationPolicy;
DestinationPrefix: string;
MaxNamedDestinations, MaxPageLinks: Integer;
class function Default: TPdfNavigationMergeOptions; static;
end;
TPdfNavigationMergeReport= record
Succeeded: Boolean;
Cancelled: Boolean;
ImportedSourceCount: Integer;
ImportedPageCount: Integer;
PreservedOutlineCount: Integer;
RemovedDestinationCount: Integer;
SourceGroupCount: Integer;
PreservedNamedDestinationCount, RenamedNamedDestinationCount: Integer;
RemovedNamedDestinationCount, RemappedPageLinkCount, RemovedPageLinkCount: Integer;
ErrorMessage: string;
end;
// The caller's document is replaced only after the complete staged result
// has been independently reopened and its outline destinations checked
TPdfNavigationMergeHelper= class helper for TPdf
function MergeFilesWithNavigation(const Sources: TPdfBatchMergeSources;
const Options: TPdfNavigationMergeOptions;
out Report: TPdfNavigationMergeReport): Boolean;
end;
function MergePdfFilesWithNavigation(Destination: TPdf;
const Sources: TPdfBatchMergeSources;
const Options: TPdfNavigationMergeOptions;
out Report: TPdfNavigationMergeReport): Boolean;
FPdfCompress는 자체 페이지 가져오기와 sparse PDF 리비전을 관리하는 호출자를 위해 CapturePdfNavigation과 WritePdfNavigation을 제공합니다
TPdfNavigationNamedDestination.NameKey는 raw PDF 키 바이트입니다. 페이지 번호는 절대 위치의 1부터 시작하며 0은 해석되지 않은 목적지입니다
TPdfNavigationPageLink.PageNumber는 소유 페이지입니다. AnnotationIndex는 원래 모든 주석에서 0부터 시작하는 순서이며 LinkIndex는 링크 주석만의 순서입니다
writer는 LinkIndex로 링크를 식별하고 최종 소유 페이지로 각 주석을 복제한 뒤 지정한 페이지 대상과 정확한 목적지 접미사를 씁니다. 호출자는 가져오기에 필요한 전체 대응표를 제공해야 합니다
writer에는 서로 다른 원본/출력 스트림과 암호화되지 않고 서명 없는 문서가 필요합니다. 같은 스트림을 지정한 인수 거부는 원본을 유지하고 다른 실패는 별도 출력 스트림을 비웁니다
이 스트림 함수들은 페이지를 가져오거나 실행 중인 TPdf 문서를 교체하지 않습니다. 완전한 탐색 병합에는 상위 트랜잭션 함수를 사용하세요
function CapturePdfNavigation(Source: TStream; MaxNamedDestinations, MaxPageLinks, MaxDepth: Integer; out Names: TPdfNavigationNamedDestinations; out Links: TPdfNavigationPageLinks; out ErrorText: string): Boolean; function WritePdfNavigation(Source, Output: TStream; const Names: TPdfNavigationNamedDestinations; const Links: TPdfNavigationPageLinks; ReplaceNamedDestinations: Boolean; out ErrorText: string): Boolean;