вторник, 19 апреля 2011 г.

PHP. Как узнать количество страниц в PDF файле

Нашел интересный пример, как узнать количество страниц в документе PDF, достаточно применить регулярное выражение:
$pdf_content = file_get_contents($pdf_filename);
$count = preg_match_all("/\/Page\W/", $pdf_content, $matches);
echo "Count: {$count}";

Где $pdf_filename - путь к файлу

Но оказалось, что тут просто считывается весь файл (может и очень большой), после чего, мы считаем количество страниц в файле с помощь регулярного выражения. Каждая страница будет содержать ключик Page и номер страницы. Это очень расточительный путь.

Гораздо правильнее поискать в файле параметр где указано количество страниц, а не самим подсчитывать:
$f = fopen($pdf_filename, "r");
while(!feof($f)) {
  $line = fgets($f,255);
  if (preg_match('/\/Count [0-9]+/', $line, $matches)){
    preg_match('/[0-9]+/',$matches[0], $matches2);
    if ($count<$matches2[0]) $count=$matches2[0]; 
  } 
}
fclose($f);
echo "Count: {$count}";

Считываем файл построчно и анализируем пока не найдем искомое

понедельник, 18 апреля 2011 г.

PHP. Создать multi-page PDF на основне набора SVG файлов

Появилась интересная задача: как на основе SVG файла создать PDF. SVG файл должен содержать картинки с подписями и  background  (создаваться может в сторонней программе).

Путем проб и ошибок выяснил: ImageMagic еще не умеет обрабатывать картинки при конвертации   SVG, если они задаются относительным путем или ссылкой. 

Выбор пал на Inscape - открытый редактор векторной графики. Кроме графической оболочки он предоставляет для работы консоль с набором команд (что собственно и требовалось). Кроме того, он полностью кросс-платформенный.

Устанавливаем его, если под Winndows то прописываем в Path путь к приложению.

Теперь из PHP можно юзать следующим образом:

$filename = "svg_dir/test.svg"; //path to SVG file
$pdf_filename="pdf_dir/test.pdf"; // output PDF

if(!file_exists($filename)){
  throw new Exception("{$filename} not exists!");
}

system("inkscape -T $filename -A $pdf_filename",$success);
if($success!=0){
  throw new Exception('Error inkscape convertation!');
}

На Хабре предлагают не создавать PDF c помощью Inkscape, так как они большого размера и предлагают сначала конвертировать в PostScript формат, а потом использовать утилиту  ps2pdf из пакета GhostScript для генерации непосредственно PDF. Размер такого файла действительно намного меньше чем прямая генерация PDF. Но у меня в задачи было условие создать много страничный PDF (inkscape и ps2pdf этого не умеют как оказалось).

Потому я поступил проще: с помощью Inkscape я генерю отдельные PDF файлы, например с именами page1.pdf, page2.pdf, ...., pageN.pdf.

Дальше я скачал утилиту pdftk,  которая умеет генрить мульти-страничные PDF и многое другое. Более детально по этому вопросу смотрим тут.

Пример использования:

pdftk pdf1.pdf pdf2.pdf ... pdfn.pdf cat output multipage.pdf

или по маске:

pdftk *.pdf cat output multipage.pdf

для вызова из PHP нужно вызывать в контексте system("pdftk....")


Если необходимо, то теперь можем с помощью pdf2ps и  ps2pdf  утилит (пакет GhostScript) оптимизировать получившийся PDF (оптимизация ухудшает качество, и как по мне, может только для предварительного просмотра использоваться или для особых задач- когда клиент получает высокое разрешение картинки только за отдельную плату).

Пример очень прост (незабываем, команды в ПХП прогоняем через оператор system или exec):

pdf2ps multipage.pdf multipage.ps
ps2pdf multipage.ps multipage.pdf

суббота, 16 апреля 2011 г.

PHP. Как получить список установленных расширений (extensions)

Для того чтобы получить список установленных extensions для php, существует отдельная функция: get_loaded_extensions(). Она возвращает массив, в котором присутствует список установленых расширений.

Пример:
$list = get_loaded_extensions();
print_r($list);

Ответ:
Array
(
  [0] => Core
  [1] => bcmath
  [2] => calendar
  [3] => com_dotnet
  [4] => ctype
  [5] => date
  ....
)

Еще пример:
if(!in_array("gd", $list)){
  echo "GD extension not installed!";
}

Установка ImageMagic под Windows

Заходим сюда: http://www.imagemagick.org/script/binary-releases.php#windows, качаем бинарник и ставим

пятница, 8 апреля 2011 г.