여러 PDF 문서를 하나의 파일로 결합하는 것은 문서 관리 워크플로우에서 흔히 요구되는 작업입니다. PDF 병합 데모 이 데모는 PDFium VCL을 사용하여 Delphi에서 원하는 수의 PDF 파일을 하나로 병합하는 방법을 보여줍니다.
개요
이 데모는 여러 PDF 파일을 선택하고, 순서를 변경하고, 하나의 출력 PDF 파일로 병합할 수 있는 간단한 인터페이스를 제공합니다. 원본 문서의 모든 콘텐츠(텍스트, 이미지, 서식 등)를 유지합니다.
주요 기능
- 여러 파일 선택 – 한 번에 여러 PDF 파일을 추가합니다.
- 파일 순서 변경 – 병합 순서에서 파일을 위 또는 아래로 이동합니다.
- 파일 삭제 – 목록에서 불필요한 파일 제거
- 진행 상황 추적 – 병합 작업 중 시각적 진행 상황 표시
- 콘텐츠 보존 – 모든 페이지를 원래 품질로 병합
PDFium DLL 요구 사항
PDFium VCL 애플리케이션을 실행하기 전에, PDFium DLL 파일이 설치되어 있는지 확인하십시오.
pdfium32.dll/pdfium64.dll– 표준 버전 (약 5-6 MB)pdfium32v8.dll/pdfium64v8.dll– V8 JavaScript 엔진 포함 (약 23-27 MB)
설치: 실행 PDFiumVCL\DLLs\CopyDlls.bat 관리자 권한으로 실행하여 DLL 파일을 Windows 시스템 디렉터리에 자동으로 복사합니다.
병합 과정
핵심 병합 기능은 다음 방법을 사용합니다: ImportPages method:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
procedure TFormMain.ButtonMergeClick(Sender: TObject); var Page, I: Integer; begin ProgressBar.Position := 0; ProgressBar.Enabled := True; Screen.Cursor := crHourGlass; try // Create new empty document for merged result PdfNew.CreateDocument; Page := 1; ProgressBar.Max := ListBox.Items.Count; // Process each source PDF for I := 0 to ListBox.Items.Count - 1 do begin // Load source PDF Pdf.FileName := ListBox.Items[I]; Pdf.Active := True; // Import all pages from source PdfNew.ImportPages(Pdf, IntToStr(1) + '-' + IntToStr(Pdf.PageCount), Page); // Track page position for next document Inc(Page, Pdf.PageCount); // Close source document Pdf.Active := False; ProgressBar.Position := I + 1; end; // Save merged document PdfNew.SaveAs(ExtractFilePath(Application.ExeName) + 'Merged.pdf'); PdfNew.Active := False; MessageDlg('Merge completed', mtInformation, [mbOK], 0); finally Screen.Cursor := crDefault; ProgressBar.Position := 0; ProgressBar.Enabled := False; Pdf.Active := False; PdfNew.Active := False; end; end; |
ImportPages 이해하기
The ImportPages method는 PDF 병합의 핵심입니다.
|
1 2 3 4 5 |
function TPdf.ImportPages( Pdf: TPdf; // Source PDF document const Range: string; // Page range (e.g., "1-5", "1,3,5", "1-") PageNumber: Integer // Insert position in destination ): Boolean; |
지원되는 페이지 범위 형식:
"1-5"– 1페이지부터 5페이지까지"1,3,5"– 1페이지, 3페이지, 5페이지"1-"– 1페이지부터 마지막 페이지까지"-5"– 첫 페이지부터 5페이지까지
파일 목록에 추가
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
procedure TFormMain.ButtonAddFilesClick(Sender: TObject); var I: Integer; begin if OpenDialog.Execute then begin for I := 0 to OpenDialog.Files.Count - 1 do ListBox.AddItem(OpenDialog.Files[I], nil); SelectItem(ListBox.Items.Count - 1); UpdateButtons; end; end; |
파일 재정렬
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
procedure TFormMain.ButtonMoveUpClick(Sender: TObject); var ItemIndex: Integer; begin ItemIndex := ListBox.ItemIndex; ListBox.Items.Move(ItemIndex, ItemIndex - 1); SelectItem(ItemIndex - 1); UpdateButtons; end; procedure TFormMain.ButtonMoveDownClick(Sender: TObject); var ItemIndex: Integer; begin ItemIndex := ListBox.ItemIndex; ListBox.Items.Move(ItemIndex, ItemIndex + 1); SelectItem(ItemIndex + 1); UpdateButtons; end; |
파일 삭제
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
procedure TFormMain.ButtonDeleteClick(Sender: TObject); var ItemIndex, ItemCount: Integer; begin ItemIndex := ListBox.ItemIndex; if MessageDlg('Delete ' + ListBox.Items[ItemIndex] + '?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin ListBox.Items.Delete(ItemIndex); ItemCount := ListBox.Items.Count; // Select appropriate item after deletion if ItemIndex < ItemCount then SelectItem(ItemIndex) else if ItemCount > 0 then SelectItem(ItemIndex - 1); UpdateButtons; end; end; |
UI 상태 업데이트
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
procedure TFormMain.UpdateButtons; var ItemIndex, ItemCount: Integer; begin ItemIndex := ListBox.ItemIndex; ItemCount := ListBox.Items.Count; ButtonAddFiles.Enabled := True; ButtonDelete.Enabled := ItemIndex <> -1; ButtonMoveUp.Enabled := (ItemIndex <> -1) and (ItemIndex > 0); ButtonMoveDown.Enabled := (ItemIndex <> -1) and (ItemIndex < ItemCount - 1); ButtonMerge.Enabled := ItemCount > 1; // Need at least 2 files to merge end; |
고급: 특정 페이지 병합
您可以仅从源文档中合并特定页面:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
procedure MergeSpecificPages; var PdfSource, PdfDest: TPdf; begin PdfSource := TPdf.Create(nil); PdfDest := TPdf.Create(nil); try PdfDest.CreateDocument; // Import pages 1-3 from first document PdfSource.FileName := 'document1.pdf'; PdfSource.Active := True; PdfDest.ImportPages(PdfSource, '1-3', 1); PdfSource.Active := False; // Import only page 5 from second document PdfSource.FileName := 'document2.pdf'; PdfSource.Active := True; PdfDest.ImportPages(PdfSource, '5', 4); PdfSource.Active := False; // Import last 2 pages from third document PdfSource.FileName := 'document3.pdf'; PdfSource.Active := True; PdfDest.ImportPages(PdfSource, IntToStr(PdfSource.PageCount - 1) + '-' + IntToStr(PdfSource.PageCount), 5); PdfSource.Active := False; PdfDest.SaveAs('merged_custom.pdf'); finally PdfDest.Active := False; PdfSource.Free; PdfDest.Free; end; end; |
导入查看器偏好设置
从另一个文档复制查看器偏好设置:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
procedure CopyViewerPreferences; var PdfSource, PdfDest: TPdf; begin PdfSource := TPdf.Create(nil); PdfDest := TPdf.Create(nil); try PdfSource.FileName := 'template.pdf'; PdfSource.Active := True; PdfDest.FileName := 'output.pdf'; PdfDest.Active := True; // Copy viewer preferences (zoom, page layout, etc.) PdfDest.ImportPreferences(PdfSource); PdfDest.SaveAs('output.pdf'); finally PdfSource.Active := False; PdfDest.Active := False; PdfSource.Free; PdfDest.Free; end; end; |
사용 사례
- 报告编译 여러 보고서 섹션을 하나의 문서로 결합합니다.
- 송장 일괄 처리 매일의 송장을 월별 일괄 처리로 병합합니다.
- 문서 조립 템플릿과 콘텐츠를 사용하여 완전한 문서를 생성합니다.
- 아카이브 생성 관련된 문서를 결합하여 아카이브를 만듭니다.
결론
Merge PDF 데모는 PDFium VCL을 사용하여 PDF 문서를 결합하는 것이 얼마나 간단한지 보여줍니다. ImportPages 이 방법은 문서 구조와 콘텐츠를 유지하는 모든 복잡성을 처리합니다.
간단한 문서 결합 도구를 만들든 복잡한 문서 조립 시스템을 만들든, PDFium VCL은 필요한 도구를 제공합니다.
다음에서 시작하세요: PDFium VCL 컴포넌트 loslab.com에서 PDF 워크플로우를 간소화하세요.