如何在PDF中显示谷歌地图?TCPDF调用静态地图API遇尺寸错误
解决TCPDF加载谷歌静态地图图片出错的问题
嘿,我之前也帮不少开发者搞定过这个问题——你遇到的TCPDF ERROR: [Image] Unable to get the size of the image,本质上是TCPDF没法直接处理远程的谷歌地图图片链接,要么是远程请求出了问题,要么是TCPDF本身的加载机制限制。给你几个靠谱的解决思路,按优先级来:
1. 先把地图图片下载到本地再加载
这是最稳妥的方案,毕竟TCPDF对本地图片的处理比远程稳定太多,还能避免网络波动、权限这类坑。你可以用PHP的file_get_contents或者cURL先把地图图片存到服务器临时目录,再传给TCPDF的Image()方法。
举个例子:
// 注意!记得把YOUR_API_KEY换成你自己的谷歌地图API密钥,现在谷歌必须要这个 $mapUrl = 'https://maps.googleapis.com/maps/api/staticmap?center=19.39197217398235,-99.17327449786751&zoom=17&size=400x200&maptype=ROADMAP&markers=color:red%7Clabel:A%7C19.39197217398235,-99.17327449786751&key=YOUR_API_KEY'; // 临时保存的路径,用系统临时目录就行 $tempMapPath = sys_get_temp_dir() . '/temp_google_map.png'; // 用file_get_contents下载图片(如果服务器允许的话) if (file_put_contents($tempMapPath, file_get_contents($mapUrl))) { // 加载本地图片到PDF里,后面的坐标和尺寸按你的需求调 $pdf->Image($tempMapPath, 10, 10, 40, 20); // 用完记得删掉临时文件,避免占空间 unlink($tempMapPath); }
要是服务器禁用了allow_url_fopen,就换成cURL来下载:
$ch = curl_init($mapUrl); $fp = fopen($tempMapPath, 'wb'); curl_setopt($ch, CURLOPT_FILE, $fp); curl_setopt($ch, CURLOPT_HEADER, 0); curl_exec($ch); curl_close($ch); fclose($fp);
2. 检查谷歌地图API的参数和权限
别小看这个,很多时候问题就出在这:
- 必须加API密钥:现在谷歌静态地图API强制要求用密钥,没有的话返回的不是图片而是错误页面,TCPDF肯定没法识别尺寸。去谷歌云控制台申请密钥,开启「静态地图API」,然后把
&key=你的密钥加到URL末尾。 - URL要完整:你的错误信息里URL末尾是
color:red%...,看起来像是被截断了!得确保整个URL是完整的,比如标记点的参数没被砍断,不然请求返回的不是有效图片。 - 查配额和权限:要是你的密钥超了配额,或者没开静态地图API,谷歌会返回错误,TCPDF自然处理不了,去谷歌云控制台看看配额状态。
3. 配置TCPDF允许远程资源加载
如果你是通过HTML方式插入地图图片的,得确保TCPDF的K_TCPDF_CALLS_IN_HTML配置项开启了,同时服务器的allow_url_fopen要设为On——可以在php.ini里改,或者代码里临时设置:
ini_set('allow_url_fopen', 1);
不过这个方法不如下载到本地稳定,远程请求容易出意外,还是优先用第一种方法。
4. 手动指定图片尺寸(应急用)
要是实在没法获取远程图片的尺寸,你可以在调用Image()的时候手动指定宽高,跳过TCPDF的尺寸检测:
// 最后一个参数是图片格式,谷歌静态地图返回的是PNG $pdf->Image($mapUrl, 10, 10, 40, 20, 'PNG');
但这个方法有风险,要是图片实际尺寸和你指定的差太多,显示会变形;而且URL本身无效的话还是会出错,所以只当应急用。
内容的提问来源于stack exchange,提问作者Ya lo Encontre
相关产品推荐
相关产品推荐

