Разбитые PDF-файлы имеют размер, равный оригинальному PDF - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть PDF-файл размером 150 МБ (55 страниц, содержащий текст и изображения), сгенерированный с помощью FPDF.

Я бы хотел разделить этот PDF на отдельные страницы PDF.

Я использую FPDI, но у меня есть серьезная проблема, каждый PDF-файл на одной странице имеет размер 150 МБ (как в оригинальном PDF).

Вот мой код:

use setasign\Fpdi\Fpdi;
require('fpdf181/fpdf.php');
require('fpdi/autoload.php');

function split_pdf($filename, $end_directory = false)
{

    $end_directory = $end_directory ? $end_directory : './';
    $new_path = preg_replace('/[\/]+/', '/', $end_directory.'/'.substr($filename, 0, strrpos($filename, '/')));

    if (!is_dir($new_path))
    {
        // Will make directories under end directory that don't exist
        // Provided that end directory exists and has the right permissions
        mkdir($new_path, 0777, true);
    }

    $pdf = new FPDI();
    $pagecount = $pdf->setSourceFile($filename); // How many pages?

    // Split each page into a new PDF
    for ($i = 1; $i <= $pagecount; $i++) {
        $new_pdf = new FPDI();
        $new_pdf->AddPage();
        $new_pdf->setSourceFile($filename);
        $templateIndex = $new_pdf->importPage($i);
        $new_pdf->useTemplate($templateIndex, null, null, 0, 0, true);

        try {
            $new_filename = $end_directory.str_replace('.pdf', '', $filename).'_'.$i.".pdf";
            $new_pdf->Output($new_filename, "F");
            echo "Page ".$i." split into ".$new_filename."<br />\n";
        } catch (Exception $e) {
            echo 'Caught exception: ',  $e->getMessage(), "\n";
        }
    }
}
// Create and check permissions on end directory!
split_pdf("contract.pdf", 'split/');

Мой оригинальный PDF-файл содержит только PNG и текст Helvetica.

Заранее спасибо за любую помощь:)

1 Ответ

0 голосов
/ 11 сентября 2018

FPDF использует единый словарь ресурсов, что означает, что все ресурсы, такие как изображения, шрифты или другие импортированные страницы (через FPDI), расположены в одном месте. Страница ссылается на этот словарь как на источник ресурсов независимо от того, используются ресурсы на определенной странице или нет.

FPDI просто копирует словарь ресурсов при импорте страницы, включая все определенные ресурсы. Он не анализирует содержимое страницы, чтобы решить, какие ресурсы можно игнорировать или нет.

Невозможно решить эту проблему с помощью FPDI (если кто-то напишет расширение для этого).

Эта проблема является общей проблемой для любого инструмента, который объединяет или разделяет документы PDF. У нас (Setasign - также авторов FPDI) также есть проблема с другим инструментом слияния / разделения, но мы смогли написать скрипт, который оптимизирует ресурсы. Может быть, это решение может помочь вам. Просто посмотрите здесь . Это решение не является бесплатным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...