Первая страница

Скачивание Wiki страниц в PDF

конвертация на движке MediaWiki
Онлайн: РИСОВАЛКИ | ИГРЫ | РЕЛАКС программы

Обзор PDF инструментов

На этой странице перечислены расширения, которые могут из Wiki-страниц генерить PDF:

https://www.mediawiki.org/wiki/PDF_export

Примечание:

Для испытаний я установил MediaWiki на свой локальный сервер XAMPP. Из нижеперечисленных вариантов Mpdf и PdfBook устанавливал, но безуспешно; ElectronPdfService - не устанавливал по причине отсутствия у меня shell; wkhtmltopdf - установил успешно.

Mpdf - показалось самое несложное в установке расширение - тут инструкция по его установке:

https://www.mediawiki.org/wiki/Extension:Mpdf

В инструкции по ссылке выше, я так понял, можно взять Mpdf из MediaWiki, а можно с GitHub. Еще есть замечание по версионности MediaWiki - до версии 1.31 нужен установщик composer. У меня Wiki 1.30. Я скачал composer (https://www.mediawiki.org/wiki/Composer). Он работает. Но при установке расширений composer ориентируется на прописанные зависимости - у меня не совпала версия PHP. Может быть поэтому Mpdf у меня так и не заработал.

PdfBook - испытал на локальном компе - инструкция по установке:

https://www.mediawiki.org/wiki/Extension:PdfBook

Также неудача, хотя установить удалось, сохранение из Wiki в PDF происходит, но файл пустой. Зависимость HTMLDOC для этого устанавливал, он может и автономно работать, и работает, но русскоязычные страницы сохраняет с нарушением отображения русских шрифтов. Не разбирался в проблеме.

ElectronPdfService - видимо, самый "крутой" вариант, т.к. используется сейчас в глобальной Википедии.

https://www.mediawiki.org/wiki/Extension:ElectronPdfService

Но для установки требуются не только права админа на Wiki, но и доступ к серверу для установки RESTBase.

wkhtmltopdf - конвертор HTML в PDF, не является расширением для Wiki. Зато удалось прикрутить в мою локальную Wiki.

https://wkhtmltopdf.org/

Установил его локально на свою Windows в виде экзешника. Работает хорошо. Проблем с русским нет. Есть билд на GitHub. Есть версии для Linux (Debian, Ubuntu, CentOS).
Можно генерить PDF как из одной страницы, так и из нескольких html-страниц - в один PDF. При этом в сайдбаре просмотрщика PDF будет сгенерировано древовидное содержание, состоящее из закладок на начало каждой страницы и на заголовки внутри страницы. Таким способом удобно компоновать электронные книги.
Можно конвертировать html-страницу в графический файл без надобности сшивать отдельные экраны в Фотошопе (за это отвечает утилита wkhtmltoimage, идущая в комплекте). А ведь в обычной жизни обычного пользователя это может быть проблемой - сделать скриншот страницы, которая заметно длиннее высоты компьютерного монитора. Утилита поддерживает несколько выходных растровых форматов.
Инструкция по установке и реализации wkhtmltopdf в web проекте:

https://habr.com/post/266571/

Небольшая неприятность этой инструкции - потребуется право PHP на функцию exec(), которая исполняет команды на сервере, что есть некоторое нарушение безопасности, но т.к. наша Wiki внутрикорпоративная, то острота снижена.
Кроме того, wkhtmltopdf захватывает всю страницу с хедером, футером и сайдбаром, в то время как ElectronPdfService аккуратно отрезает эти элементы страницы, оставляя только содержание статьи.
С другой стороны, wkhtmltopdf формирует в PDF документе закладки из заголовков страницы, а ElectronPdfService этого не делает.
Моя инструкция по установке на Wiki на сервере в среде Window, написанная по результатам успешной практики:

Инструкция по внедрению wkhtmltopdf

❶ Создать php-файл wkhtmltopdf.php с таким содержимым:
<?php
 $exe = '"c:/Program Files/wkhtmltopdf/bin/wkhtmltopdf.exe" -L 0 -R 0 -T 0 -B 0'; // путь к исполняемому файлу и пар-ры
 $page = "http://wiki.local/index.php/".$_GET["title"]; // url печатаемой страницы
 $out = "c:/tmp/".$_GET["title"].".pdf"; // временный выходной файл
 $comm = $exe.' '.$page.' '.$out; // команда
 exec($comm); // исполнение команды
 if (file_exists($out)) { // сохранение файла силами браузера
   header('Content-type: application/pdf');
   header('Content-Disposition: attachment; filename="'.$_GET["title"].'.pdf"'); // это будет видно в окне сохранения
   readfile($out);
 }
 unlink($out); // удаление временного файла
?>
❷ В коде wiki cтраницы прописать путь к этому файлу с аргументом title:
[http://wiki.local/wkhtmltopdf.php/?title={{PAGENAMEE}} Скачать в PDF]
P.S.1. здесь {{PAGENAMEE}} - название страницы с подчеркиванием вместо пробелов (чего не дождешься от {{PAGENAME}})

P.S.2. еще лучше сделать шаблон topdf:
<div style="float:right; padding:5px; margin:5px; background-color:#dde; border-radius:5px;">
  [http://wiki.local/wkhtmltopdf.php/?title={{PAGENAMEE}} Скачать в PDF]
</div>
и вставлять его в wiki-страницы так: {{topdf}}.

P.S.3. а еще лучше вставить подобную ссылку в сайдбар так:
** http://wiki.local/wkhtmltopdf.php/?title={{PAGENAMEE}}|Скачать в PDF
P.S.4. Видимо, в промышленном проекте надо применять запирание файла: http://www.php.su/functions/?flock

P.S.5. Видимо, в промышленном проекте надо проводить валидацию получаемого аргумента $_GET["title"]

Анатолий Опарин

Новости

Объявление
домой | живопись | графика | компьютерная графика | поделки | юные художники | темы | комментарии | перлы
конкурсы | игры | релакс | рисовалки | учиться рисовать | детские карты Москвы | детские стихи | статьи | видео | поиск | обратная связь