Как объединить несколько PDF-файлов в Symfony 3

Хотите отправить все чертежи, отчеты, информацию о различных отделах своему начальнику, но все ли это разные PDF-файлы, содержащие соответствующую информацию? Многие пользователи просто объединяют PDF-файлы и все. Объединение файлов в общий PDF-файл является чрезвычайно полезным и необходимым в настоящее время, поэтому, если вы предлагаете какое-то административное приложение для какого-либо предприятия, добавление такой функции в вашу систему может быть полезным, так что им не нужно устанавливать внешнюю программу или делать это онлайн. используя сторонний сервис.

В этой статье мы покажем, как объединить несколько PDF-файлов в один с помощью библиотеки PDFMerger.

1. Установите pdfmerger

PDFMerger использует (устанавливаются автоматически как зависимости) классы fpdf и fpdi от Setasign. Есть другие версии оригинальной библиотеки, портирован в PHP5 как оригинальная библиотека был размещен в codeplex, однако у них нет минимального уровня стабильности (они работают, но не с композитором). Библиотечный форк, работающий с composer, создан @rguedes, Что касается Symfony, любая зависимость, которую вы хотите использовать, требует минимального уровня стабильности (не dev-master). Вилка работает даже для Laravel тоже. Чтобы продолжить установку пакета в вашем проекте symfony, откройте терминал, перейдите в каталог вашего проекта и установите библиотеку, используя composer:

composer require rguedes/pdfmerger

После установки вы сможете использовать класс PDFMerger и его методы. Для получения дополнительной информации о форке этой библиотеки, посетите хранилище в Github здесь.

2. Использование библиотеки

Использование библиотеки очень просто и понятно, вы создаете экземпляр PDF-слияния. Этот класс позволяет объединять множество файлов по вашему желанию с помощью метода addPDF и, наконец, генерировать объединенный результат с помощью метода слияния. Вы можете выбрать, какие страницы PDF-файлов следует добавить в окончательный вариант, а также решить, как и где будет создан конечный PDF-файл.

Указание страниц для слияния

Класс PDFMerger позволяет объединять многие PDF-файлы, как вы хотите и нуждаетесь, используя addPDF метод, вам нужно только указать путь в качестве первого аргумента и указать, какие страницы файла должны быть объединены в окончательный файл, используя второй аргумент, который ожидает строку. Например, вы можете объединить все страницы PDF:

$pdf = new PDFMerger();
// Add all the pages of the PDF to merge
$pdf->addPDF("somePdfToMerge.pdf", 'all');

Укажите, какие именно страницы вы хотите, указав их номер через запятую:

$pdf = new PDFMerger();
// Add only the pages 1, 3 and 5
$pdf->addPDF("somePdfToMerge.pdf", '1, 3, 5');

Или используя диапазон, например, от страницы 5 до 10:

$pdf = new PDFMerger();
// Add only the pages from 5 to 10
$pdf->addPDF("somePdfToMerge.pdf", '5-10');

Модель слияния

Используя метод слияния, вы создадите PDF-файл, содержащий добавленные файлы (указанные страницы каждого PDF-файла). Этот файл может быть сохранен или возвращен как ответ в соответствии с вашими потребностями. Метод для обработки PDF должен быть предоставлен в качестве первого аргумента метода слияния, возможные значения для этого аргумента: browser, download, string или же file, В качестве второго аргумента — путь, в котором будет сохранен PDF-файл (если в качестве метода используется файл) или имя PDF-файла, который будет использоваться для его возврата (с browser или же download):

Генерация прямой загрузки

Если вам не нужно никуда сохранять PDF-файл, а просто сгенерировать его и вернуть как ответ, вы можете принудительно загрузить сгенерированный PDF-файл напрямую, используя идентификатор загрузки:

get('kernel')->getRootDir() . '/../web/file1.pdf';
$pdfFile2Path = $this->get('kernel')->getRootDir() . '/../web/file2.pdf';
$pdfFile3Path = $this->get('kernel')->getRootDir() . '/../web/file3.pdf';
// Create an instance of PDFMerger
$pdf = new PDFMerger();
// Add 2 PDFs to the final PDF
$pdf->addPDF($pdfFile1Path, 'all');
$pdf->addPDF($pdfFile3Path, '1, 3, 5');
// Generate download of "mergedpdf.pdf"
$pdf->merge('download', "mergedpdf.pdf");
}
}

Сохранение в файл

Вы можете сохранить объединенный результат в файл на вашем сервере:

get('kernel')->getRootDir() . '/../web/file1.pdf';
$pdfFile2Path = $this->get('kernel')->getRootDir() . '/../web/file2.pdf';
// Create an instance of PDFMerger
$pdf = new PDFMerger();
// Add 2 PDFs to the final PDF
$pdf->addPDF($pdfFile1Path, 'all');
$pdf->addPDF($pdfFile2Path, 'all');
// Merge the files into a file in some directory
$pathForTheMergedPdf = $this->get('kernel')->getRootDir(). '/../web/result.pdf';
$pdf->merge('file', $pathForTheMergedPdf);
return new Response(
"Files succesfully merged !"
);
}
}

Получить двоичное содержимое результата pdf

В случае, если вам нужно извлечь содержимое сгенерированного файла (двоичные данные), не сохраняя его где-либо, вы можете использовать метод строкового вывода для извлечения содержимого как переменной. В этом случае мы вернем двоичный контент как ответ с заголовками PDF (для просмотра в браузере). Вы также можете использовать тип браузера, если хотите:

get('kernel')->getRootDir() . '/../web/file1.pdf';
$pdfFile2Path = $this->get('kernel')->getRootDir() . '/../web/file2.pdf';
$pdfFile3Path = $this->get('kernel')->getRootDir() . '/../web/file3.pdf';
// Create an instance of PDFMerger
$pdf = new PDFMerger();
// Add 2 PDFs to the final PDF adding all their pages
$pdf->addPDF($pdfFile1Path, 'all');
$pdf->addPDF($pdfFile2Path, 'all');
// Merge the files and retrieve its PDF binary content
$binaryContent = $pdf->merge('string', "mergedpdf.pdf");
// Send it as response to the browser
// (view in the browser as well)
// which is the same as
// $pdf->merge('browser', "mergedpdf.pdf");
$response = new Response($binaryContent);
$response->headers->set('Content-type' , 'application/pdf');
return $response;
}
}
Ссылка на основную публикацию