У меня есть php-файл, который запрашивает базу данных, а затем записывает и обновляет html соответственно.
У меня есть кнопка на этой странице «Экспорт как PDF». Я пытаюсь преобразовать эту страницу в pdf с помощью HTML2FPDF, но я получаю следующую ошибку:
FPDF error: Unable to create output file: Entry Report
Я подозреваю, проблема в том, что я передаю файл php вместо html-файла:
<?php require('html2fpdf.php'); if(isset($_POST['link'])){ $url = $_POST['link']; $nm = $_POST['nm']; convert($url, $nm); } function convert($link, $name){ $pdf=new HTML2FPDF(); $pdf->AddPage(); $fp = fopen($link,"r"); $strContent = fread($fp, filesize($link)); fclose($fp); $pdf->WriteHTML($strContent); $pdf->Output($name); echo ("PDF file generated successfully!"); } ?>
Кто-нибудь знает, как я могу обойти это? возможно, путем преобразования php в html, затем html в pdf …
Или есть прямой способ конвертировать php-файл в файл PDF …
EDIT: ОК, поэтому проблема заключалась в том, что я не разрешал публичные разрешения на запись. После изменения этого мне удалось создать файл pdf … Проблема в том, что … файл pdf пуст …
Я знаю, что это связано с тем, что я передаю php-страницу, которая, вероятно, пуста, когда она передается … Как я могу захватить html-контент в html, чтобы выход в PDF не был пустым?
Вот страница php:
<?php function connect() { $dbh = mysql_connect ("localhost", "user", "password") or die ('I cannot connect to the database because: ' . mysql_error()); mysql_select_db("PDS", $dbh); return $dbh; } session_start(); if(isset($_SESSION['username'])){ if(isset($_POST['entryId'])){ //do something $dbh = connect(); $ide = $_POST['entryId']; $usertab = $_POST['usertable']; $answertable = $usertab . "Answers"; $entrytable = $usertab . "Entries"; $query = mysql_query("SELECT e.date, q.questionNumber, q.question, q.sectionId, a.answer FROM $answertable a, Questions q, $entrytable e WHERE a.entryId = '$ide' AND a.questionId = q.questionId AND e.entryId = '$ide' ORDER BY q.questionNumber ASC;") or die("Error: " . mysql_error()); if($query){ //set variables $sectionOne = array(); $sectionTwo = array(); $sectionThree = array(); $sectionFour = array(); $sectionFive = array(); while($row=mysql_fetch_assoc($query)){ $date = $row['date']; $section = $row['sectionId']; switch($section){ case '1': $sectionOne[] = $row; break; case '2': $sectionTwo[] = $row; break; case '3': $sectionThree[] = $row; break; case '4': $sectionFour[] = $row; break; case '5': $sectionFive[] = $row; break; default: break; } } }else{ //error - sql failed } } ?> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <script src = "jQuery.js"></script> <script> $(document).ready(function(){ $("#export").click(function(e){ //post to html2pdfconverter.php $("#link").val("Testers/viewentryreport.php"); $("#nm").val("Entry Report.pdf"); $("form#sendanswers").submit(); }); }); </script> <title>Personal Diary System - Entry Report - <?php echo($date); ?></title> </head> <body> <h1>Entry Report - <?php echo($date); ?></h1> <div id = "buttons"> <form id = "sendanswers" name = "sendanswers" action="Testers/html2pdfconverter.php" method="post"> <input type = "hidden" name = "link" id = "link" value = ""> <input type = "hidden" name = "nm" id = "nm" value = ""> <input type = "button" name = "export" id = "export" value = "Export As PDF"/> </form> </div> <h3>Biological Information</h3> <?php $i = 0; foreach($sectionOne as &$value){ if($i == 1 || $i == 3){ $image = "assets/urine".$i.".png"; echo("<br/>"); echo($value['question']." <br/> "."<img src = \"$image\"/>"); echo("<br/>"); }else{ echo($value['question'].' : '.$value['answer']); } echo("<br/>"); $i++; } ?> <h3>Fatigue and Recovery</h3> <?php foreach($sectionTwo as &$value){ echo($value['question'].' : '.$value['answer']); echo("<br/>"); } ?> <h3>Illness and Injury</h3> <?php foreach($sectionThree as &$value){ echo($value['question'].' : '.$value['answer']); echo("<br/>"); } ?> <h3>Training Sessions</h3> <?php foreach($sectionFour as &$value){ echo($value['question'].' : '.$value['answer']); echo("<br/>"); } ?> <h3>General Feedback</h3> <?php if(count($sectionFive)>0){ foreach($sectionFive as &$value){ echo($value['question'].' : '.$value['answer']); } }else{ $sectionFive = "User didn't leave any feedback"; echo("User didn't leave any feedback"); } echo("<br/>"); ?> </body> </html> <?php } ?>
в<?php function connect() { $dbh = mysql_connect ("localhost", "user", "password") or die ('I cannot connect to the database because: ' . mysql_error()); mysql_select_db("PDS", $dbh); return $dbh; } session_start(); if(isset($_SESSION['username'])){ if(isset($_POST['entryId'])){ //do something $dbh = connect(); $ide = $_POST['entryId']; $usertab = $_POST['usertable']; $answertable = $usertab . "Answers"; $entrytable = $usertab . "Entries"; $query = mysql_query("SELECT e.date, q.questionNumber, q.question, q.sectionId, a.answer FROM $answertable a, Questions q, $entrytable e WHERE a.entryId = '$ide' AND a.questionId = q.questionId AND e.entryId = '$ide' ORDER BY q.questionNumber ASC;") or die("Error: " . mysql_error()); if($query){ //set variables $sectionOne = array(); $sectionTwo = array(); $sectionThree = array(); $sectionFour = array(); $sectionFive = array(); while($row=mysql_fetch_assoc($query)){ $date = $row['date']; $section = $row['sectionId']; switch($section){ case '1': $sectionOne[] = $row; break; case '2': $sectionTwo[] = $row; break; case '3': $sectionThree[] = $row; break; case '4': $sectionFour[] = $row; break; case '5': $sectionFive[] = $row; break; default: break; } } }else{ //error - sql failed } } ?> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <script src = "jQuery.js"></script> <script> $(document).ready(function(){ $("#export").click(function(e){ //post to html2pdfconverter.php $("#link").val("Testers/viewentryreport.php"); $("#nm").val("Entry Report.pdf"); $("form#sendanswers").submit(); }); }); </script> <title>Personal Diary System - Entry Report - <?php echo($date); ?></title> </head> <body> <h1>Entry Report - <?php echo($date); ?></h1> <div id = "buttons"> <form id = "sendanswers" name = "sendanswers" action="Testers/html2pdfconverter.php" method="post"> <input type = "hidden" name = "link" id = "link" value = ""> <input type = "hidden" name = "nm" id = "nm" value = ""> <input type = "button" name = "export" id = "export" value = "Export As PDF"/> </form> </div> <h3>Biological Information</h3> <?php $i = 0; foreach($sectionOne as &$value){ if($i == 1 || $i == 3){ $image = "assets/urine".$i.".png"; echo("<br/>"); echo($value['question']." <br/> "."<img src = \"$image\"/>"); echo("<br/>"); }else{ echo($value['question'].' : '.$value['answer']); } echo("<br/>"); $i++; } ?> <h3>Fatigue and Recovery</h3> <?php foreach($sectionTwo as &$value){ echo($value['question'].' : '.$value['answer']); echo("<br/>"); } ?> <h3>Illness and Injury</h3> <?php foreach($sectionThree as &$value){ echo($value['question'].' : '.$value['answer']); echo("<br/>"); } ?> <h3>Training Sessions</h3> <?php foreach($sectionFour as &$value){ echo($value['question'].' : '.$value['answer']); echo("<br/>"); } ?> <h3>General Feedback</h3> <?php if(count($sectionFive)>0){ foreach($sectionFive as &$value){ echo($value['question'].' : '.$value['answer']); } }else{ $sectionFive = "User didn't leave any feedback"; echo("User didn't leave any feedback"); } echo("<br/>"); ?> </body> </html> <?php } ?>
и html2pdfconverter.php
<?php require('html2fpdf.php'); if(isset($_POST['link'])){ $url = $_POST['link']; $nm = $_POST['nm']; convert($url, $nm); } function convert($link, $name){ $pdf=new HTML2FPDF(); $pdf->AddPage(); $fp = fopen($link,"r"); $strContent = fread($fp, filesize($link)); fclose($fp); $pdf->WriteHTML($strContent); $pdf->Output($name); echo ("PDF file generated successfully!"); } ?>
EDIT @TIMFERRIS
Я изменил мою функцию преобразования на это на основе ответа @TimeFerris:
function convert($link, $name){ $pdf=new HTML2FPDF(); $pdf->AddPage(); $content = file_get_contents( $link ); //shorter than what you did ob_start(); echo $content; $pdf->WriteHTML( ob_get_contents() ); ob_end_clean(); $pdf->Output($name); echo ("PDF file generated successfully!"); }
Файл PDF создается, но все еще пуст.
Недавно я это сделал, используя TCPDF . TCPDF – это еще одна разработанная версия FPDF.
См. Эту ссылку для примера, касающегося преобразования в PDF. Кроме того, здесь вы можете найти больше примеров. Пример 61 также может пригодиться.
Пример кода, который использует TCPDF:
$html = '<h1>HTML Example</h1> <div style="text-align:center">IMAGES<br /> <img src="../images/logo_example.png" alt="test alt attribute" width="100" height="100" border="0" /><img src="../images/tiger.ai" alt="test alt attribute" width="100" height="100" border="0" /><img src="../images/logo_example.jpg" alt="test alt attribute" width="100" height="100" border="0" /> </div>'; // output the HTML content $pdf->writeHTML($html, true, false, true, false, '');
Одна вещь, которую вы можете сделать, – запустить файл PHP, но использовать буферизацию вывода, чтобы захватить содержимое, которое пишет скрипт PHP. Затем сохраните это содержимое в файле .html и передайте этот файл в конвертер.
Файл php, который вы поставляете, должен запускаться через синтаксический анализатор до того, как он будет действительным html-кодом.
$content = file_get_contents( $filename ); //shorter than what you did ob_start(); echo $content; $pdf->WriteHTML( ob_get_contents() ); ob_end_clean();