PHP新手技术求助:使用TCPDF将单个Div内的HTML表格生成PDF失败问题排查
解决TCPDF生成PDF失败的问题
别担心,单个PHP文件完全能搞定这个需求,你的代码里有几个容易忽略的小问题,我帮你梳理并修正:
先看几个关键错误点:
- TCPDF常量拼写错误:你写的
PDG_PAGE_ORIENTATION是笔误,应该是PDF_PAGE_ORIENTATION(少了个F),这会直接导致TCPDF初始化失败。 - HTML标签语法错误:你在PDF生成部分硬编码的HTML表格里,所有
<tr>都没有闭合(只有<tr>开头,没有</tr>结尾),TCPDF解析错误的HTML时会出现异常。 - HTTP头输出顺序问题:原代码先输出了完整的HTML页面,然后才处理PDF生成逻辑。当用户点击提交按钮后,服务器已经先发送了HTML的HTTP头,此时TCPDF再尝试发送PDF的Content-Type头就会失效,导致PDF无法正常渲染。
- 重复硬编码数据:明明已经有动态解析JSON生成表格的逻辑,没必要在PDF部分写死数据,复用动态生成的HTML更高效且不易出错。
修正后的完整代码:
<?php $askPriceBeds = '{"status":"success","postcode":"W14 9JH","postcode_type":"full","url":"https://propertydata.co.uk/draw?input=W14+9JH","bedrooms":2,"data":{"points_analysed":20,"radius":"0.09","average":657495,"70pc_range":[ 575000, 725000 ],"80pc_range":[ 550000, 875000 ],"90pc_range":[ 550000, 925000 ],"100pc_range":[ 525000, 950000 ],"raw_data":[ {"price":650000,"lat":"51.48887000","lng":"-0.20776000","bedrooms":2,"type":"flat","distance":"0.00" }, {"price":575000,"lat":"51.48884800","lng":"-0.20701200","bedrooms":2,"type":"flat","distance":"0.03" }, {"price":615000,"lat":"51.48851000","lng":"-0.20742000","bedrooms":2,"type":"flat","distance":"0.03" }, {"price":640000,"lat":"51.48932000","lng":"-0.20804000","bedrooms":2,"type":"flat","distance":"0.03" }, {"price":725000,"lat":"51.48843100","lng":"-0.20775400","bedrooms":2,"type":"flat","distance":"0.03" }, {"price":699950,"lat":"51.48928000","lng":"-0.20793700","bedrooms":2,"type":"flat","distance":"0.03" }, {"price":550000,"lat":"51.48941000","lng":"-0.20832000","bedrooms":2,"type":"flat","distance":"0.04" }, {"price":600000,"lat":"51.48813700","lng":"-0.20781600","bedrooms":2,"type":"flat","distance":"0.05" }, {"price":925000,"lat":"51.48948300","lng":"-0.20827400","bedrooms":2,"type":"flat","distance":"0.05" }, {"price":650000,"lat":"51.48824900","lng":"-0.20669000","bedrooms":2,"type":"flat","distance":"0.06" }, {"price":700000,"lat":"51.48941200","lng":"-0.20666900","bedrooms":2,"type":"flat","distance":"0.06" }, {"price":625000,"lat":"51.48817000","lng":"-0.20689500","bedrooms":2,"type":"flat","distance":"0.06" }, {"price":645000,"lat":"51.48822500","lng":"-0.20872100","bedrooms":2,"type":"flat","distance":"0.06" }, {"price":675000,"lat":"51.48877800","lng":"-0.20643200","bedrooms":2,"type":"flat","distance":"0.06" }, {"price":525000,"lat":"51.48978800","lng":"-0.20864000","bedrooms":2,"type":"flat","distance":"0.07" }, {"price":700000,"lat":"51.48785100","lng":"-0.20757600","bedrooms":2,"type":"flat","distance":"0.07" }, {"price":675000,"lat":"51.48819900","lng":"-0.20637900","bedrooms":2,"type":"flat","distance":"0.08" }, {"price":875000,"lat":"51.48818700","lng":"-0.20931800","bedrooms":2,"type":"flat","distance":"0.08" }, {"price":550000,"lat":"51.48891000","lng":"-0.20955000","bedrooms":2,"type":"flat","distance":"0.08" }, {"price":950000,"lat":"51.48808300","lng":"-0.20628500","bedrooms":2,"type":"flat","distance":"0.09" } ] },"process_time":"2.08"}'; $data = json_decode($askPriceBeds, true); $raw_data = $data['data']['raw_data']; // 先处理PDF生成请求,避免输出HTML后无法发送PDF头 if(isset($_POST['generate_pdf'])){ require_once('tcpdf/tcpdf.php'); // 修正常量拼写错误 $tcpdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); $tcpdf->SetCreator('PDF_CREATOR'); $tcpdf->SetTitle('Property Price Report'); $tcpdf->SetHeaderData('', '', PDF_HEADER_TITLE, PDF_HEADER_STRING); $tcpdf->setHeaderFont(array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN)); $tcpdf->setFooterFont(array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA)); $tcpdf->SetDefaultMonospacedFont('helvetica'); $tcpdf->SetFooterMargin(PDF_MARGIN_FOOTER); $tcpdf->SetMargins(PDF_MARGIN_LEFT, '5', PDF_MARGIN_RIGHT); $tcpdf->setPrintHeader(false); $tcpdf->setPrintFooter(false); $tcpdf->SetAutoPageBreak(true, 10); $tcpdf->SetFont('helvetica', '', 12); $tcpdf->AddPage('P', 'A4'); // 动态生成PDF里的表格,复用之前的JSON数据 $html = '<html><head></head><body>'; $html .= '<table border="1">'; $html .= '<tr><th>Price</th><th>Lat</th><th>Lng</th><th>Bedrooms</th><th>Type</th><th>Distance</th></tr>'; foreach($raw_data as $raw){ $html .= "<tr> <td>{$raw['price']}</td> <td>{$raw['lat']}</td> <td>{$raw['lng']}</td> <td>{$raw['bedrooms']}</td> <td>{$raw['type']}</td> <td>{$raw['distance']}</td> </tr>"; } $html .= '</table></body></html>'; $tcpdf->writeHTML($html, true, 0, true, 0); $tcpdf->lastPage(); $tcpdf->Output("datareport.pdf", 'I'); exit; // 生成PDF后终止脚本,避免继续输出HTML } ?> <!DOCTYPE html> <html> <body> <table border="1"> <thead> <tr> <td>Price</td> <td>Lat</td> <td>Lng</td> <td>Bedrooms</td> <td>Type</td> <td>Distance</td> </tr> </thead> <tbody> <?php foreach($raw_data as $raw){ echo "<tr> <td>{$raw['price']}</td> <td>{$raw['lat']}</td> <td>{$raw['lng']}</td> <td>{$raw['bedrooms']}</td> <td>{$raw['type']}</td> <td>{$raw['distance']}</td> </tr>"; } ?> </tbody> </table> <form method="POST"> <input type="submit" name="generate_pdf" value="Generate PDF"> </form> </body> </html>
重点修复说明:
- 调整代码执行顺序:把PDF生成的逻辑放在最前面,这样当用户提交表单时,服务器还没输出任何HTML内容,TCPDF可以正常发送PDF的HTTP头,避免"headers already sent"错误。
- 修正TCPDF常量拼写:把
PDG_PAGE_ORIENTATION改成正确的PDF_PAGE_ORIENTATION。 - 动态生成PDF表格:复用解析后的JSON数据生成PDF里的表格,避免硬编码数据,同时保证HTML标签完全闭合。
- 添加exit语句:生成PDF后立即终止脚本,防止后续的HTML内容被输出到PDF文件里。
这样修改后,点击"Generate PDF"按钮应该就能正常生成包含完整表格的PDF文件了。
内容的提问来源于stack exchange,提问作者janus sumbilon
相关产品推荐
相关产品推荐

