php отдать файл на скачивание pdf
Отдаем файлы эффективно с помощью PHP
1. Используем readfile()
Метод хорош тем, что работает с коробки. Надо только написать свою функцию отправки файла (немного измененный пример из официальной документации):
Таким способом можно отправлять даже большие файлы, так как PHP будет читать файл и сразу отдавать его пользователю по частям. В документации четко сказано, что readfile() не должен создавать проблемы с памятью.
2. Читаем и отправляем файл вручную
Метод использует тот же Drupal при отправке файлов из приватной файловой системы (файлы недоступны напрямую по ссылкам):
3. Используем модуль веб сервера
3a. Apache
Модуль XSendFile позволяет с помощью специального заголовка передать отправку файла самому Apache. Существуют версии по Unix и Windows, под версии 2.0.*, 2.2.* и 2.4.*
В настройках хоста нужно включить перехват заголовка с помощью директивы:
Также можно указать белый список директорий, файлы в которых могут быть обработаны. Важно: если у Вас сервер на базе Windows путь должен включать букву диска в верхнем регистре.
Описание возможных опций на сайте разработчика: https://tn123.org/mod_xsendfile/
Пример отправки файла:
3b. Nginx
Nginx умеет отправлять файлы из коробки через специальный заголовок.
Для корректной работы нужно запретить доступ к папку напрямую через конфигурационный файл:
Пример отправки файла (файл должен находиться в директории /some/path/protected):
Как сделать так, чтобы PDF-файл можно было загружать по HTML-ссылке с помощью PHP?
Скачать PDF из HTML по ссылке с помощью PHP с помощью функции header () в php. Функция header () используется для отправки необработанного HTTP-заголовка. Иногда требуется, чтобы пользователю было предложено сохранить данные, такие как сгенерированный PDF.
Синтаксис:
Примечание: Помните, что HTTP header () должен вызываться перед отправкой любого фактического вывода, либо обычными тегами HTML, пустыми строками в файле, либо из PHP.
Пример 1. Сохраните ниже HTML-файл как htmllinkpdf.html и сохраните PHP-файл как downloadpdf.php
title >Download PDF using PHP from HTML Link title >
h2 style = «color:green;» >Welcome To GFG h2 >
p > b >Click below to download PDF b >
a href = «gfgpdf.php?file=gfgpdf» >Download PDF Now a > center >
// Мы будем выводить PDF
header( ‘Content-Type: application/pdf’ );
// будет называться download.pdf
header( ‘Content-Disposition: attachment; filename=»gfgpdf.pdf»‘ );
Ниже приведен пример, иллюстрирующий концепцию загрузки файла PDF локально (т. Е. Чтение файла gfgpdf.pdf из локального файла) с использованием ссылки HTML.
Пример 2. Сохраните файл HTML как htmllinkpdf.html и сохраните файл PHP как файл downloadpdf.php
title >Download PDF using PHP from HTML Link title >
h2 style = «color:green;» >Welcome To GFG h2 >
p > b >Click below to download PDF b >
a href = «downloadpdf.php?file=gfgpdf» >Download PDF Now a >
header( «Content-Type: application/octet-stream» );
header( «Content-Type: application/download» );
header( «Content-Description: File Transfer» );
flush (); // Это не имеет значения.
flush (); // Это важно для больших загрузок
Dompdf – мощнейший PHP-класс для конвертирования HTML-документов в PDF-файлы
Не так давно передо мной встала задача – организовать экспорт HTML-данных в один из популярных графических файлов или же в PDF.
Поскольку получать на выходе картинку в данном случае мне показалось безумием, я решил остановиться на PDF.
Поискав информацию в Интернете и испробовав уйму различных вариантов реализации похожего функционала, я обнаружил, что часть из них работают некорректно, а часть – попросту не работает с кириллицей (русским языком).
Это, конечно, меня не огорчило, и потратив еще немного времени (как говорится, кто ищет – тот всегда найдет), я нашел-таки тот инструмент, который помог мне решить поставленные задачи.
Это класс «Dompdf» для PHP. Что же он из себя представляет?
Возможно, что-то забыл упомянуть, но согласитесь – звучит впечатляюще.
Так вот, именно этот класс помог мне превратить некий документ HTML в идентичный PDF. Именно тому, как им пользоваться, и будет посвящена эта статья.
Итак, прежде всего, для того чтобы воспользоваться этим классом, вы скачиваете архив в конце статьи.
Далее загружаете файлы к себе на сервер и осуществляете подключение скрипта в вашем PHP-файле:
Здесь мы указываем документ непосредственно в теле скрипта, но также вы можете заменить всю строку, например, на:
Где «LINK» – ссылка на HTML-страницу, которую нужно конвертировать.
Ну и финальные штрихи – это добавить соответствующие теги класса:
И общая картина получается такая:
Если вы не хотите, чтобы при посещении скрипта происходило скачивание полученного PDF-файла, а хотите поместить данные в переменную для дальнейшего использования, то строку:
Еще один важный момент: если ссылки на изображения прописаны не относительные, а абсолютные (то есть не «/logo.png», а «https://your_site.com/logo.png»), то в таком случае откройте файл dompdf_config.inc.php в папке /dompdf/ и строку:
Вот, собственно, и все. Очень важный момент: если вы получаете ошибку при конвертировании, то всего скорее, вы используете новые свойства стилей (как было у меня), в таком случае – просто постарайтесь оптимизировать (упростить) свой код.
Что такое PDF и как его можно прикрутить к web-приложениям средствами PHP
В наше время формат документов PDF приобретает большую популярность. Он был разработан компанией Adobe Systems Incorporated. Как указано в документации, THE ADOBE PORTABLE DOCUMENT FORMAT (PDF) — переносимый формат документов, является «родным» для программных продуктов семейства Adobe Acrobat. Их цель — дать пользователю возможность легко обмениваться электронными документами и просматривать их независимо от той среды, в которой эти документы были созданы. PDF опирается на графическую модель, позволяющую отображать картинки и текст вне зависимости от установленных на компьютере устройств и разрешения. В документах этого формата присутствуют такие объекты, как гиперссылки и аннотации, что делает их интерактивными.
С другой стороны, web-приложения зачастую нуждаются в отображении динамически составленных документов, таких как отчеты, прайслисты, счета и многое другое. Это позволяет персонализировать приложение и сделать его более мощным по своим функциональным возможностям. Помимо PDF, существуют и другие решения, но этот формат можно назвать одним из самых удачных, так как PDF документ без потери форматирования можно вывести на принтер или конвертировать в HTML или текст.
PHP, как один из самых мощных и популярных современных средств разработки web-приложений, справляется с задачей генерации PDF документов «на лету». Для этого разработано несколько дополнительных инструментов. Не возьмусь перечислить их все, но назову одни из самых известных — библиотеку PDFLib, ClibPDF и PHP класс FPDF.
Названные в предыдущей главе PDFLib и ClibPDF требуют дополнительной настройки PHP, в то время как класс FPDF является чистым PHP кодом и легко подключается к скриптам командой include() и другими подобными. Скачать класс и ознакомиться с подробной документацией можно на сайте www.fpdf.org. Дополнительным (порой решающим) аргументом в пользу этого решения можно рассматривать его бесплатность для использования как в личных, так и коммерческих целях. Цитата из лицензионного соглашения:
«FPDF is Freeware (it is stated at the beginning of the source file). There is no usage restriction. You may embed it freely in your application (commercial or not), with or without modification».
Разрешается также видоизменять исходный код класса. Никаких ограничений.
Решение проблемы с кириллицей
При создании русскоязычных документов средствами иностранных программных продуктов (библиотек, приложений и прочего) часто возникает проблема правильного отображения кириллических шрифтов. Не всякий зарубежный продукт корректно работает (а то и вовсе не работает) с кириллицей. К счастью, класс FPDF не принадлежит к их числу и легко настраивается на работу с русским языком.
Если быть точным, то сам класс настраивать практически не придется. Проблема может возникнуть с файлами кириллических шрифтов. Оговорюсь, что тестирование класса я проводил на wintel платформе (впрочем, весь приведенный код работал и на коммерческом *nix хостинге). В windows одним из самых основных форматов шрифтов (наряду с PostScript) является TTF (True Type Font). Но для правильной работы наших скриптов необходим и еще один формат файлов — AFM (файл метрики шрифта). Как считается, AFM файлы поставляются вместе с TTF. В своей ОС я AFM файлов не обнаружил.
После того, как утилита скачана, ее необходимо запустить из командной строки (в windows Пуск->Выполнить команду cmd). Формат вызова утилиты для нужной нам цели выглядит следующим образом:
Следующим шагом является генерация файла описания шрифта. Этот файл будет иметь знакомое нам расширение — PHP. Вместе с классом FPDF поставляется полезный скрипт для решения этой задачи. Его можно найти в директории font/makefont/ класса. Использовать его просто. Для этого создадим РНР файл (скажем, mf.php) и в нем укажем:
Используя require, мы подключаем нужный скрипт. Понятно, что для этого рядом с нашим файлом должна быть папка font, содержащая в себе makefont/makefont.php. А вот функция MakeFont() уже является специфической и по определению имеет следующий формат:
где fontfile — путь к TTF или PFB файлу, afmfile — путь к AFM файлу, enc — имя используемой кодировки (по умолчанию это cp1252), patch — опциональное изменение кодировки и type — тип шрифта (по умолчанию True Type). Для выбора кодировки можно воспользоваться следующим списком:
* cp1250 (Central Europe)
* cp1251 (Cyrillic)
* cp1252 (Western Europe)
* cp1253 (Greek)
* cp1257 (Baltic)
* ISO-8859-1 (Western Europe)
* ISO-8859-2 (Central Europe)
* ISO-8859-4 (Baltic)
* ISO-8859-4 (Cyrillic)
* ISO-8859-7 (Greek)
* ISO-8859-15 (Western Europe)
* ISO-8859-16 (Central Europe)
* KOI8-R (Cyrillic)
Кодировка определяет связь между кодом (от 0 до 255) и символом. Для выбора кириллической кодировки в Windows используйте cp1251. Обычно кодировки с префиксом cp используются в Windows, в то время как Linux системы используют ISO.
Составленный нами скрипт mf.php необходимо открыть в браузере. Он подготовит для наших нужд необходимый файл с расширением php. Итак, что мы имеем? У нас теперь есть комплект из трех файлов шрифта — times.ttf, times.afm и times.php. Важно два из них (times.ttf и times.php) положить в нужное место. Этим местом является директория font, находящаяся в папке класса. Впрочем, вы вольны сами указать место директории, которая будет хранить шрифты. Для этого нужно определить константу FPDF_FONTPATH обыкновенным для PHP способом:
Теперь наша система готова к разработке web приложения с динамической генерацией русскоязычного PDF документа.
Начинаем работу
Для наглядного иллюстрирования возможностей FPDF класса попробуем создать реальный документ — прайс-лист фирмы, занимающейся оптово-розничной продажей алкогольных напитков. Краткое техническое задание следующее:
* в шапке документа должны быть данные: логотип, наименование фирмы, заголовок документа;
* в теле документа должны быть приведены данные по товарным позициям, включающие наименование товара, розничную цену и оптовую цену;
Сразу разобьем нашу работу на три этапа. Первый этап — вывод статической информации. Для простоты примера к статической информации мы отнесем все, кроме данных по товарным позициям. На втором этапе уделим внимание табличному выводу товарных позиций в теле документа. Уточним, что в этой статье мы рассмотрим загрузку данных из файла CSV, где разделителем является точка с запятой. Я остановился на этом решении по одной причине — такой файл легко получить из формата xls и, одновременно, с ним легко работать из РНР приложения в других целях (например, организовать вывод в HTML). На третьем этапе мы рассмотрим доставку PDF файла конечному пользователю.
Приступим к практическому знакомству с классом FPDF. Для начала создадим файл price.php, который будет осуществлять вывод PDF документа прямо в браузер (остальные способы мы рассмотрим в главе 6). Рядом с этим рабочим файлом положим скачанный ранее fpdf.php (файл класса) и папку font с вложенными в нее файлами кириллических шрифтов (см. предыдущую главу). Теперь в файле price.php подключим класс FPDF и установим путь к папке шрифтов.
При написании метода Footer() мы использовали также PageNo(), метод, возвращающий номер текущей страницы и параметр
Вывод в браузер
По идее, существует всего два варианта вывода документа в браузер — открытие (если установлен adobe acrobat) и скачивание без непосредственного открытия. В классе FPDF выводом документа в браузер управляет метод Output(). В нашем примере мы использовали этот метод без дополнительных аргументов. Однако документация к FPDF приводит следующий формат его записи:
Output([string file [, boolean download]])
Метод предназначен для сохранения PDF документа в локальный файл или для непосредственного вывода в браузер (если установлена программа просмотра PDF файлов).
Аргумент file означает имя файла. Если таковое отсутствует, то производится попытка открыть документ в окне браузера. Если аргумент file определен, то аргумент download указывает, что файл должен быть сохранен на сервере (значение false) или у пользователя (при установке true выводится диалог «Сохранить как»).
Соответственно, можно выделить три варианта написания метода Output() для нашего документа. Первый — Output() — пытается открыть документ в окне браузера. Второй вариант написания выведет у пользователя диалоговое окно «Сохранить как» и предложит скачать документ на его диск — Output(«AlkoPrice.pdf», true). И, наконец, третий вариант просто сохранит документ на локальном для скрипта сервере — Output(«AlkoPrice.pdf»,false) или просто Output(«AlkoPrice.pdf»), так как по умолчанию атрибут download всегда имеет значение false.
Стоит отдельно рассмотреть компрессию полученного файла. По умолчанию будет произведена попытка его «ужать» средствами Zlib. Это расширение (extension) должно быть установлено в системе. Если установка не была произведена, то документ получится не сжатым, и будет весить немного больше.
Generating PDF files with PHP and FPDF
Большинство web-сервисов экспортируют данные в разных форматах для дальнейшего использования. Данная статья о том, как экспортировать данные в pdf-формате.
Хотя многие знают как это делать, я опишу кратко для тех кто не знает.
PHP позволяет нам генерировать файлы в формате pdf налету. FPDF — это бесплатный код на языке php, позволяющий создавать документы в формате pdf и производить с ними различные манипуляции.
PDFlib
PHP API содержит большое количество функций для работы с PDF, реализованных на базе PDFlib. Несмотря на это, данная библиотека не является бесплатной для коммерческого использования. Бесплатная версия называется PDFlib Lite и бесплатная для персонального использования, однако она ограничена в функциональности. Для того чтобы использовать полную библиотеку PDFlib необходимо купить лицензию.
Почему FPDF?
Альтернатива — это использование FPDF, бесплатный класс содержащий большое количество функций для создания и манипулирования PDF-документами. Ключевое слово для данного момента — это ее бесплатность. Вы можете скачать, использовать и модифицировать данный класс как вам заблагорассудится. В дополнение к бесплатности, эта библиотека намного проще, чем PDFlib. Для использования PDFlib необходимо установить ее как расширение к PHP, в то время как FPDF может быть подключена в программу напрямую.
Создание документов PDF
Для того чтобы начать, необходимо скачать код FPDF с сайта FPDF Web site и включить в программу. Например, вот так
$pdf->SetAuthor(‘Lana Kovacevic’);
$pdf->SetTitle(‘FPDF tutorial’);
В функцию AddPage () можно передать параметры «P» или «L» для указания ориентации страницы. Функция SetDisplayMode определяет как будет отображена страница. Вы можете определить параметры увеличения и разметки. В примере мы используем 100% увеличение и разметку по умолчанию, определенную в программе, используемой для просмотра.
Сейчас, когда у нас есть страница, давайте вставим в нее изображение для того чтобы сделать страницу приятней, также мы добавим ссылку. Мы отобразим логотип FPDF используя функцию Image и передадим в нее следующие параметры — название файла, размерность и адрес.
$pdf->SetXY(10,50);
$pdf->SetFontSize(10);
$pdf->Write(5,’Congratulations! You have generated a PDF. ‘);
Здесь мы указали имя файла и параметры вывода, в данном случае «I». «I»-параметр выведет результат в браузер.
require(‘fpdf.php’);
//create a FPDF object
$pdf=new FPDF();
//set document properties
$pdf->SetAuthor(‘Lana Kovacevic’);
$pdf->SetTitle(‘FPDF tutorial’);
//set font for the entire document
$pdf->SetFont(‘Helvetica’,’B’,20);
$pdf->SetTextColor(50,60,100);
//set up a page
$pdf->AddPage(‘P’);
$pdf->SetDisplayMode(real,’default’);
//insert an image and make it a link
$pdf->Image(‘logo.png’,10,20,33,0,’ ‘,’http://www.fpdf.org/’);
//display the title with a border around it
$pdf->SetXY(50,20);
$pdf->SetDrawColor(50,60,100);
$pdf->Cell(100,10,’FPDF Tutorial’,1,0,’C’,0);
//Set x and y position for the main text, reduce font size and write content
$pdf->SetXY (10,50);
$pdf->SetFontSize(10);
$pdf->Write(5,’Congratulations! You have generated a PDF.’);
//Output the document
$pdf->Output(‘example1.pdf’,’I’);
Сейчас когда мы научились создавать документы, посмотрим что еще можно сделать, используя FPDF. Пример ниже показывает нам как создать верх и низ (хедер и футер 🙂 ) нашего документа.
require(‘fpdf.php’);
class PDF extends FPDF
<
function Header()
<
$this->Image(‘logo.png’,10,8,33);
$this->SetFont(‘Helvetica’,’B’,15);
$this->SetXY(50, 10);
$this->Cell(0,10,’This is a header’,1,0,’C’);
>
function Footer()
<
$this->SetXY(100,-15);
$this->SetFont(‘Helvetica’,’I’,10);
$this->Write (5, ‘This is a footer’);
>
>
$pdf=new PDF();
$pdf->AddPage();
$pdf->Output(‘example2.pdf’,’D’);
Как вы видите мы создали дочерний класс, используя наследование и создания функций Header и Footer. Затем мы создали новый объект и добавили страницу в документ. Функция AddPage автоматически вызовет функции Header и Footer. В конце мы вывели полученную информацию в файл с названием example2.pdf, используя значение «D». В этом случае браузер предложит сохранить данный файл.
Итак, мы изучили основы создания PDF-документов, для более подробной информации используйте FPDF Web site.