Drupal7+Webform+Webform2PDF生成PDF时上传字段显示链接问题求助
嘿,这个问题我之前帮好几个做Drupal表单的朋友解决过——Webform2PDF默认确实只会把上传字段的令牌解析成文件链接,要直接在生成的PDF里展示证件照和嵌入PDF文档,得做些针对性的调整,分两种情况来处理:
一、让JPG证件照直接显示在PDF中
Webform的默认令牌返回的是文件链接,我们需要在Webform2PDF的模板里替换成图片标签来渲染:
- 先找到Webform2PDF模块的模板文件
webform2pdf-template.tpl.php,把它复制到你的主题目录下(这样后续升级模块不会覆盖自定义内容)。如果只想针对当前表单生效,可以把文件名改成webform2pdf-template--[你的表单机器名].tpl.php。 - 在模板文件里找到你原本输出
[submission:value:recent_photo]令牌的位置,替换成以下PHP代码(记得把recent_photo改成你实际的证件照字段机器名):
<?php // 加载上传的证件照文件 $photo_file = file_load($submission->data['recent_photo'][0]); if ($photo_file) { // 获取文件的可访问URL $photo_url = file_create_url($photo_file->uri); // 输出图片标签,可自定义宽高样式 echo '<img src="' . $photo_url . '" alt="申请人证件照" style="width: 150px; height: auto;"/>'; } else { echo '未上传证件照'; } ?>
- 清除Drupal的缓存,测试表单提交后生成的PDF,就能看到证件照直接显示出来了。
二、嵌入上传的PDF说明文档到生成的PDF里
要把用户上传的PDF文档直接嵌入到生成的申请表单PDF中,得借助Webform2PDF底层的TCPDF库来实现:
- 同样在刚才的自定义模板文件里,找到你想插入PDF文档的位置,添加以下代码(替换
pdf_document为你的PDF字段机器名):
<?php // 加载用户上传的PDF文件 $doc_file = file_load($submission->data['pdf_document'][0]); if ($doc_file) { // 获取文件的服务器绝对路径 $doc_path = drupal_realpath($doc_file->uri); // 获取当前TCPDF实例 global $pdf; if (file_exists($doc_path)) { // 导入外部PDF的所有页面并添加到当前PDF中 $pdf->setSourceFile($doc_path); $page_count = $pdf->getNumPages(); for ($i = 1; $i <= $page_count; $i++) { $template_id = $pdf->importPage($i); $pdf->AddPage(); $pdf->useTemplate($template_id, 10, 10, 190, 270, true); } } else { echo '未上传有效说明文档'; } } else { echo '未上传说明文档'; } ?>
- 这段代码会把用户上传的PDF每一页都作为新页面添加到生成的申请表单PDF末尾,你可以调整
useTemplate方法里的参数(10,10是偏移量,190,270是宽高)来适配你的PDF模板。 - 清除缓存后测试,就能看到上传的PDF内容被嵌入进去了。
替代方案:用自定义模块钩子修改令牌输出
如果你不想修改模板,也可以在自定义模块里用hook_webform2pdf_token_replace_alter钩子来替换图片令牌的输出(注意这个方法只适合图片,PDF嵌入还是模板方法更可靠):
function YOUR_CUSTOM_MODULE_webform2pdf_token_replace_alter(&$replacements, $context) { $submission = $context['submission']; // 替换证件照令牌 if (isset($replacements['[submission:value:recent_photo]'])) { $photo_file = file_load($submission->data['recent_photo'][0]); if ($photo_file) { $photo_url = file_create_url($photo_file->uri); $replacements['[submission:value:recent_photo]'] = '<img src="' . $photo_url . '" alt="申请人证件照" style="width:150px;"/>'; } } }
注意事项
- 确保服务器用户对Drupal的文件上传目录(一般是
sites/default/files)有读取权限,否则Webform2PDF无法加载文件内容。 - 测试时尽量用标准的JPG和PDF文件,避免损坏或异常格式的文件导致显示失败。
- 如果使用模板,记得给模板文件设置正确的权限(一般755),确保Drupal能读取到。
内容的提问来源于stack exchange,提问作者Duront
相关产品推荐
相关产品推荐

