2011-08-18 90 views
2

我有一个php文件,它查询数据库,然后相应地写入和更新html。将PHP文件中的HTML转换为PDF文件

我有此页上的“导出为PDF”按钮..我想这个网页转换为使用HTML2FPDF一个PDF格式,但我得到了以下错误:

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文件的直接途径...

编辑:行,所以问题是,我没有不允许公共写入权限。在改变这个,我管理它创建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 
} 
?> 

和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!"); 
} 
?> 

编辑@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文件已创建,但仍为空

+0

你是什么意思“传递PHP文件”?在将它传递给你的函数之前,$ url的价值是什么? – Cfreak

+0

您的脚本在该目录中有写权限吗? PHP和FPDF并不在乎你的文件名是什么。除非您的文件名实际上是一个网址,并且您的脚本具有写入权限,否则它会将输出写入您指定的任何文件。 –

+0

$ url的值与www.url.co.uk/create类似。php – user559142

回答

1

我最近通过使用TCPDF来完成此操作。 TCPDF是FPDF的进一步开发版本。

有关转换为PDF的示例请参见this link。另外,here你可以找到更多的例子。例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, ''); 
1

一件事,你可以做的是运行PHP文件,但使用输出缓冲来捕获的PHP脚本写出来的内容。然后,将这些内容保存到.html文件并将该文件传递给转换器。

+1

输出缓冲是一种方法。您甚至不需要将内容保存在文件中,您可以直接将它们传递给转换器,并通过回显相应的标题将其作为pdf提供。 – markus

+0

好吧,所以基本上,我创建一个PHP变量来捕获PHP页面的HTML内容,然后发送到转换文件...? – user559142

+0

看看Tim Fennis的另一个答案。它应该完全按照我的建议进行,只是该示例将缓冲区内容直接传递到PDF解析器,而不是先将其保存到文件。 –

1

您提供的php文件必须在其有效的html代码之前通过解析器运行。

$content = file_get_contents($filename); //shorter than what you did 
ob_start(); 
echo $content; 
$pdf->WriteHTML(ob_get_contents()); 
ob_end_clean(); 
+0

对不起,我如何将它实现到我的代码中?什么是$文件名? – user559142

+0

我将此添加到我的转换函数中,但输出仍然是空白的...请参阅我的修改后的文章 – user559142