Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Как отобразить PDF-файл в браузере

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: PDF-файл выводится в виде текста, а надо в виде изображения
eastman75
Отправлено: 15 Мая, 2013 - 14:23:21
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




Здравствуйте! Формирую имя файла и путь к нему в форме запроса. Затем считываю содержимое файла одной строкой и пытаюсь увидеть этот файл в браузере, но вижу только текст, а не изображение. Что надо сделать, чтобы увидеть изображение? У меня 3 браузера и у всех есть нужные плагины. Вот та часть PHP-скрипта, которая выполняет чтение и вывод файла (использую mPDF):

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. if (file_exists($filename)) { // если файл существует
  3.         $html = file_get_contents($filename);
  4.  
  5. /* Выводим файл */
  6.     $mpdf=new mPDF();
  7.     $mpdf->WriteHTML($html);
  8.     $mpdf->Output();
  9.     exit;
  10. }
  11. else
  12.         echo "Файл <b>$filename</b> <font color=red> не существует</font>";
  13.  

Помогите советом или ссылкой - сам я ничего не смог отыскать. Не понял

(Отредактировано автором: 15 Мая, 2013 - 14:24:15)

 
 Top
DlTA
Отправлено: 15 Мая, 2013 - 15:07:28
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




а где та часть скрипта которая выдает заголовки говорящие браузеру что дальше будет идти пдф а не какой то непонятный текст?

(Отредактировано автором: 15 Мая, 2013 - 15:07:52)

 
 Top
eastman75
Отправлено: 15 Мая, 2013 - 15:43:51
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




DlTA пишет:
а где та часть скрипта которая выдает заголовки, говорящие браузеру, что дальше будет идти пдф, а не какой то непонятный текст?

Я пытался вставить заголовки таким способом:

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. header ("Content-type: application/pdf", false );
  3. header('Content-Disposition: inline; filename=$filename', false);
  4.  


но получил "отлуп" от mpdf.php в том смысле, что такие заголовки уже отосланы:

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. Warning: Cannot modify header information - headers already sent by (output started at C:\OpenServer\domains\Transport\archive_form.php:1) in C:\OpenServer\domains\Transport\archive_form.php on line 19
  3. Warning: Cannot modify header information - headers already sent by (output started at C:\OpenServer\domains\Transport\archive_form.php:1) in C:\OpenServer\domains\Transport\archive_form.php on line 20
  4.  


Я понимаю их важность, но не понимаю, как убедить mpdf.php.

(Отредактировано автором: 15 Мая, 2013 - 16:28:39)

 
 Top
DeepVarvar Супермодератор
Отправлено: 15 Мая, 2013 - 16:38:52
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




eastman75 пишет:
в том смысле, что такие заголовки уже отосланы:
Не то. Там говорят что поздно что-то слать т.к. уже пошел вывод текста.
А заголовки всегда можно изменить или добавить, главное сделать это вовремя.
 
 Top
eastman75
Отправлено: 15 Мая, 2013 - 17:00:16
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




DeepVarvar пишет:
eastman75 пишет:
в том смысле, что такие заголовки уже отосланы:
Не то. Там говорят что поздно что-то слать т.к. уже пошел вывод текста.
А заголовки всегда можно изменить или добавить, главное сделать это вовремя.

Не понимаю, куда их вставить. Вот последнее исправление:

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. if (file_exists($filename)) { // если файл существует
  3.     header ('Content-type: application/pdf', false);
  4.     header ('Content-disposition: inline; filename = \"".$filename.\""', false);
  5.     $html = file_get_contents($filename);
  6. /* Выводим файл */
  7.     $mpdf=new mPDF();
  8.     $mpdf->WriteHTML($html);
  9.     $mpdf->Output();
  10.     exit;
  11. }
  12.  


Как я понимаю, до вызова функции file_get_contents() вывод файла не производится. Я ошибаюсь?
 
 Top
DlTA
Отправлено: 15 Мая, 2013 - 17:03:23
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




eastman75 пишет:
Я ошибаюсь?
да

гдето и что то у вас до этого места уже было выведено в браузер
 
 Top
eastman75
Отправлено: 17 Мая, 2013 - 20:11:42
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




DlTA пишет:
гдето и что то у вас до этого места уже было выведено в браузер

Отказался от mPDF, так как этот класс предназначен для формирования PDF-файла, а мне нужно просто вывести в окно браузера готовый PDF-файл, имя которого формируется из запроса в HTML-файле в переменной $filename. Вот окончательный вариант скрипта:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <?php
  3. ...
  4. $html = "
  5. <html><head>
  6. <meta http-equiv="Content-Type" content="application/pdf; charset=UTF-8">
  7. <meta http-equiv="Content-Disposition" content="inline; filename = '.$filename.' ">
  8. </head><body>
  9. ';
  10. if (file_exists($filename)) {
  11.         $html .= file_get_contents($filename);
  12.         $html .= '</body></html>';
  13.         print $html;
  14.    exit;
  15. }
  16. ...
  17. ?>
  18.  

проблема в том, что в окно браузера из файла выводится не изображение, а PDF-код. Так как же заставить браузер сделать рендеринг?

(Отредактировано автором: 18 Мая, 2013 - 14:48:03)

 
 Top
DlTA
Отправлено: 17 Мая, 2013 - 20:30:19
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




абздец
а нафига верстку выводить?
если нужно выдать только данные из файла, то и выводите данные из файла, без каких либо посторонних символов

кстати первая строчка это что? опечатка, или в выполняемом скрипте она тоже есть? ее надо убрать,

не забываем о необходимости выдать заголовки перед подачей контента
 
 Top
eastman75
Отправлено: 18 Мая, 2013 - 14:47:04
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




DlTA, верстку я вывожу для того, чтобы дать браузеру информацию о типе вложения. Но, оказывается, это не помогает - и без верстки, и с версткой выводится только PDF-код. А первая строчка для $html - это не опечатка; оказывается, так можно задавать длинные строки для переменной в PHP (см. например http://www[dot]mpdf1[dot]com/mpdf/download ). Я тоже не знал об этом раньше. Во всяком случае, мой скрипт обрабатывается без ошибок. А ВОТ ИЗОБРАЖЕНИЕ ИЗ КОДА НЕ ВЫВОДИТСЯ !!!
 
 Top
caballero
Отправлено: 18 Мая, 2013 - 15:01:08
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
верстку я вывожу для того, чтобы дать браузеру информацию о типе вложения.

не должно быть никакой верстки, вообще никакого HTML

только заголовки и тело файла
(Добавление)
Цитата:
оказывается, так можно задавать длинные строки для переменной в PHP

а еще оказывается есть HEREDOC для этого

(Отредактировано автором: 18 Мая, 2013 - 15:01:37)



-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
eastman75
Отправлено: 18 Мая, 2013 - 18:54:21
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




caballero пишет:
HEREDOC

За это спасибо. Лишний раз убеждаюсь, что надо читать мануалы !!!
Что же касается никакого HTML, то я его убрал, оставил только заголовки в виде <meta ... и получил тот же результат - вывелся PDF-код. Вы скажете, что и <meta ... надо убрать, и опять я с Вами соглашусь, только вот функция header() у меня не катит - об этом написано раньше. НЕУЖЕЛИ НЕЛЬЗЯ ДАТЬ ДЕЛЬНЫЙ СОВЕТ ИЛИ ХОТЯ БЫ ССЫЛКУ?
 
 Top
Мелкий Супермодератор
Отправлено: 18 Мая, 2013 - 19:10:46
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




eastman75 пишет:
функция header() у меня не катит

Значит надо исправить.
По характерному
eastman75 пишет:
output started at C:\OpenServer\domains\Transport\archive_form.php:1)

Сохраните файл без метки BOM.


-----
PostgreSQL DBA
 
 Top
eastman75
Отправлено: 18 Мая, 2013 - 19:26:14
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




[quote=Мелкий][/quote]
Все правильно. Действительно, файл со скриптом содержал в самом начале 3 байта, которые всовывает туда Windows. Я их убрал - никакой редактор их не показывает, пришлось использовать WinHEX. Далее - вставил вызовы функции header() в самом начале скрипта и -- УРА!!! - все заработало, то есть я увидел красивый PDF-файл.
БОЛЬШОЕ СПАСИБО ВСЕМ, ПРИНЯВШИМ УЧАСТИЕ В ОБСУЖДЕНИИ !!!

Разрешите мне вернуться к теме. Итак, вот код, который работает:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <?php
  3. header('Content-Type:application/pdf; charset=UTF-8', false);
  4. header('Content-Disposition:inline; filename = file.pdf', false );
  5.  
  6. /* Осуществляем проверку вводимых данных */
  7. $year = htmlspecialchars($_POST["year"]);
  8. $number = htmlspecialchars($_POST["number"]);
  9.  
  10. /* Формируем ссылку на файл */
  11. $filename = '../files/' . $number . $year . '.pdf';
  12.  
  13. /* Проверяем наличие файла и выводим его содержимое в буфер как строку */
  14. $html = '';
  15. if (file_exists($filename)) { // если файл существует
  16.         $html = file_get_contents($filename);
  17.         if ($html != '') print $html;
  18.        else echo 'НЕТ такого файла';
  19.         exit();
  20. }      
  21. ?>
  22.  


Если файл существует, он отображается в браузере как PDF-файл. Но если файла нет, сообщение об этом НЕ ВЫВОДИТСЯ, а вместо этого Adobe Reader выводит окошко с сообщением об ошибке:
http://www[dot]4shared[dot]com/photo/Tdq[dot][dot][dot]eader_error[dot]html

Я понимаю, что ридеру передается что-то, не являющееся PDF-файлом, но как исправить эту ситуацию?
Разобрался я. Отправка заголовков в скрипте стоит в самом начале скрипта и производится до того, как будет сделана проверка на существование файла. Получается, что рендеринг PDF-кода происходит всегда, независимо от того, есть ли такой код или его нет. Отсюда и сообщение об ошибке: пустой файл есть, а кода нет. Если же переставить отсылку заголовков ПОСЛЕ проверки наличия файла, то они не будут отсылаться при отсутствии файла; нужно также добавить в скрипт сообщение о том, что файла нет (в ветке ELSE). Если кому-то надо, могу выложить полный текст работающего скрипта.

(Отредактировано автором: 20 Июня, 2013 - 18:39:39)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с файловой системой и файлами »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB