SetaPDF Demos

List and Extract Attachments

This demo get information about embedded files in a PDF document and allows you to extract them as well.

PHP
<?php

// load and register the autoload function
require_once '../../../../../bootstrap.php';

// prepare some files
$files = [
    $assetsDirectory . '/pdfs/tektown/products/All-Portfolio.pdf',
    $assetsDirectory . '/pdfs/Logos-Portfolio.pdf',
];

$path = displayFiles($files);

// create a document
$document = SetaPDF_Core_Document::loadByFilename($path);

// get names
$names = $document->getCatalog()->getNames();
// get the "embedded files" name tree
$embeddedFiles = $names->getEmbeddedFiles();

// extract the file
if (isset($_GET['name'])) {
    $file = $embeddedFiles->get($_GET['name']);
    if ($file instanceof SetaPDF_Core_FileSpecification) {
        // resolve the filename
        $filename = $file->getFileSpecification();
        // resolve the file stream
        $embeddedFileStream = $file->getEmbeddedFileStream();

        // get the content type
        // $contentType = $embeddedFileStream->getMimeType();
        // Sadly this is sometimes faulty or "null", so we force a download here:
        $contentType = 'application/force-download';

        // pass the file to the client
        $stream = $embeddedFileStream->getStream();
        header('Content-Type: ' . $contentType);
        header('Content-Disposition: attachment; ' . SetaPDF_Core_Writer_Http::encodeFilenameForHttpHeader($filename));
        header('Content-Transfer-Encoding: binary');
        header('Content-Length: ' . strlen($stream));
        echo $stream;
        die();
    }
}

$files = $embeddedFiles->getAll();

foreach ($files AS $name => $file) {
    $filename = $file->getFileSpecification();

    $size = null;
    $params = $file->getEmbeddedFileStream()->getParams();
    if (isset($params[SetaPDF_Core_EmbeddedFileStream::PARAM_SIZE])) {
        $size = $params[SetaPDF_Core_EmbeddedFileStream::PARAM_SIZE];
    }

    echo '<a href="?f=' . urlencode($_GET['f']) . '&name=' . urlencode($name) . '">';
    echo htmlspecialchars($filename) . '</a>';
    if ($size) {
        echo ' (' . $size . ' Bytes)';
    }

    echo '<br />';
}