Sample code for 30+ languages & platforms
Delphi DLL

Extract Embedded Files from PDF

Demonstrates how to get information about the embedded files (if any) contained within a PDF, and shows how to extract each file.

Note: This example requires Chilkat v9.5.0.95 or greater.

Chilkat Delphi DLL Downloads

Delphi DLL
uses
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, BinData, Pdf, JsonObject;

...

procedure TForm1.Button1Click(Sender: TObject);
var
success: Boolean;
pdf: HCkPdf;
numFiles: Integer;
json: HCkJsonObject;
bd: HCkBinData;
i: Integer;
filename: PWideChar;

begin
success := False;

// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.

pdf := CkPdf_Create();

success := CkPdf_LoadFile(pdf,'qa_data/pdf/embedded_files/my_embedded_files_test.pdf');
if (success = False) then
  begin
    Memo1.Lines.Add(CkPdf__lastErrorText(pdf));
    Exit;
  end;

// Note: The embedded file functionality was added in Chilkat v9.5.0.95

// How many embedded files exist within the opened PDF?
numFiles := CkPdf_getNumEmbeddedFiles(pdf);
Memo1.Lines.Add('Number of embedded files: ' + IntToStr(numFiles));

json := CkJsonObject_Create();
CkJsonObject_putEmitCompact(json,False);

bd := CkBinData_Create();

// Get information about each file, and extract each to the filesystem.
i := 0;
while i < numFiles do
  begin

    success := CkPdf_GetEmbeddedFileInfo(pdf,i,json);
    if (success = False) then
      begin
        Memo1.Lines.Add(CkPdf__lastErrorText(pdf));
        Exit;
      end;

    Memo1.Lines.Add(CkJsonObject__emit(json));

    // Get the filename from the JSON.
    filename := 'someFile.dat';

    // The filename SHOULD always be present..
    if (CkJsonObject_HasMember(json,'filename') = True) then
      begin
        filename := CkJsonObject__stringOf(json,'filename');
      end;

    // Get the file data.
    success := CkPdf_GetEmbeddedFileBd(pdf,i,bd);
    if (success = False) then
      begin
        Memo1.Lines.Add(CkPdf__lastErrorText(pdf));
        Exit;
      end;

    // Save the contents of the bd to the filename (in the current working directory) in the filesystem.
    success := CkBinData_WriteFile(bd,filename);
    if (success = False) then
      begin
        Memo1.Lines.Add('Failed to write output file.');
      end;

    i := i + 1;
  end;

// Sample output for the above code:

// Number of embedded files: 3
// {
//   "filename": "employees.json",
//   "desc": "JSON",
//   "subType": "application/json",
//   "size": 159,
//   "creationDate": "D:20230715170506-05'00'",
//   "modDate": "D:20160207153838-05'00'"
// }
// 
// {
//   "filename": "rsaPubKey.pem",
//   "desc": "RSA Public Key PEM",
//   "size": 451,
//   "creationDate": "D:20230715170546-05'00'",
//   "modDate": "D:20150724133153-05'00'"
// }
// 
// {
//   "filename": "starfish.jpg",
//   "desc": "Starfish JPG",
//   "subType": "image/jpeg",
//   "size": 6229,
//   "creationDate": "D:20230715170356-05'00'",
//   "modDate": "D:20080529103055-05'00'"
// }

CkPdf_Dispose(pdf);
CkJsonObject_Dispose(json);
CkBinData_Dispose(bd);

end;