Столкнулся с небольшой, но интересной задачкой – необходимо разбить PDF-файл, который состоит из нескольких страниц, на отдельные листы. Разобрать pdf необходимо так, чтобы каждый ее лист стал картинкой. Задачка не часто встречается, поэтому про нее стоит написать заметку, вдруг кому-нибудь еще пригодится.
Как с помощью ImageMagick разбить PDF на страницы
Для этой задачи отлично подходит программа ImageMagick, которая в основном используется для работы с графикой. ImageMagick установлена по умолчанию, практически, на всех хостингах. А если не установлена, то служба поддержки без проблем может ее добавить для вашего сайта. Если же у вас не хостинг, а свой сервер, то можете сами добавить программу, это занимает всего пару минут.
После того, как программа установлена, достаточно всего одной команды, чтобы разбить pdf на отдельные страницы:
// Разбить всю PDF на отдельные листы
convert test.pdf -quality 100 page-%3d.png
// Взять только вторую страницу из PDF
convert test.pdf[1] -quality 100 page-2.png
// полный путь к PDF
$pdf = __DIR__ . "/test.pdf";
// открытие PDF
$im = new imagick($pdf);
// определение количества листов в PDF
$count_pages = $im->getNumberImages();
// если есть хотя бы один лист
if ($count_pages) {
for ($i = 0; $i < $count_pages; $i++) {
// вытаскиваем одну страницу
// номер страницы(от 0 до $count_pages)
$page = $pdf.'['.$i.']';
// создание холста из одной страницы PDF
$image = new Imagick($page);
// формат картинок
$image->setImageFormat("png");
// отключение прозрачности, чтобы пустые места на картинках страниц стали белыми
$image->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE);
// качества картинок(0-100)
$image->setImageCompressionQuality(100);
// сохранение картинки с именем НОМЕР-page.png
$image->writeImage(__DIR__."/".($i+1).'-page.png');
}
}
// вытащить одну страницу
// нумерация страниц начинается с нуля
$pdf = __DIR__ . "/test.pdf";
$page = $pdf.'[1]'; // [1] - номер страницы
$image = new Imagick($page);
$image->setImageFormat("png");
$image->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE);
$image->setImageCompressionQuality(100);
$image->writeImage(__DIR__."/2-page.png");
// Сохранить одну страницу в формате pdf
// Путь к pdf и в квадратных скобках номер страницы
// Нумерация страниц начинается с нуля
$page = __DIR__ . "/test.pdf[1]";
$image = new Imagick($page);
$image->setImageFormat("pdf");
$image->setImageCompressionQuality(100);
$image->writeImage(__DIR__."/2-page.pdf");