Pdfmerger合并预览PDF时移动端显示异常的问题排查求助
问题描述
使用Pdfmerger进行文档预览与合并,PC/笔记本电脑显示正常,但移动端预览时会显示错误文档。以下是相关代码,请排查修复以实现多端预览效果一致。
iframe代码
<iframe src="<?= base_url('pdfjs/web/viewer.html?file=/') ?><?= base_url('my_ctrl/my_func/'.$my_var) ?>" frameborder="0" width='100%' style="height:100vh !important" allowfullscreen webkitallowfullscreen></iframe>
控制器代码
$this->load->library('pdfmerger'); $pdfx = new Pdfmerger; ob_clean(); ob_end_flush(); ob_end_clean(); $pdfx->addPDF('uploads/merge/'.$waktu.'.pdf', 'all'); $output2 = $this->pdf102->load_view_new('my_folder1/my_folder2/pdf/my_view', $data); usleep(2000); $waktu2 = date("YmdHis"); $t2 = microtime(true); $micro2=explode(".",$t2); $waktu2=$waktu2.$micro2[0].$micro2[1]; $nama2='uploads/merge/'.$waktu2.'.pdf'; file_put_contents($nama2, $output2); ob_clean(); ob_end_flush(); ob_end_clean(); $pdfx->addPDF('uploads/merge/'.$waktu2.'.pdf', 'all'); foreach($data['file'] as $filenya){ ob_clean(); ob_end_flush(); ob_end_clean(); $cekpdf=strpos($filenya['ALAMAT'],".pdf"); if($cekpdf!==false){ $pdfx->addPDF('uploads/global-init/plugins-init/jquery-file-upload/server/php/files/'.$var, 'all'); } else{ } } usleep(2000); $waktuz = date("YmdHis"); $tz = microtime(true); $microz=explode(".",$tz); $waktuz=$waktuz.$microz[0].$microz[1]; $tempat='uploads/merge/'.$waktuz.'.pdf'; ob_clean(); ob_end_flush(); ob_end_clean(); $pdfx->merge('browser', base_url('uploads/merge/'.$waktuz.'.pdf')); unlink('uploads/merge/'.$waktu.'.pdf'); exit(0);
排查修复要点
URL拼接错误:iframe的src拼接后会生成重复域名的URL(如
http://xxx.com/pdfjs/...?file=/http://xxx.com/my_ctrl/...),移动端解析这类URL易出错。正确拼接需用urlencode处理参数:<iframe src="<?= base_url('pdfjs/web/viewer.html?file=' . urlencode(base_url('my_ctrl/my_func/'.$my_var))) ?>" frameborder="0" width='100%' style="height:100vh !important" allowfullscreen webkitallowfullscreen></iframe>缓存清理逻辑混乱:控制器中反复调用
ob_clean()、ob_end_flush()、ob_end_clean(),可能导致PDF输出不完整。只需在合并输出前做一次缓存清理:ob_start(); // 合并PDF逻辑 ob_end_clean();临时文件名生成异常:通过拆分
microtime生成文件名的方式易出现格式问题,改用uniqid生成唯一文件名更可靠:$waktu2 = uniqid('merge_', true); $nama2 = 'uploads/merge/' . $waktu2 . '.pdf';PDF合并输出逻辑错误:
$pdfx->merge('browser', base_url(...))用法错误,browser模式下无需传URL,直接输出即可;若需先保存文件再输出,按以下方式处理:// 方式1:直接输出到浏览器 $pdfx->merge('browser'); // 方式2:保存文件后输出内容 $pdfx->merge('file', $tempat); header('Content-Type: application/pdf'); readfile($tempat);临时文件残留:仅删除了单个临时文件,未清理
$nama2和$tempat对应的文件,可能导致旧文件被移动端缓存显示错误,需补充清理:unlink($nama2); unlink($tempat); unlink('uploads/merge/'.$waktu.'.pdf');
内容的提问来源于stack exchange,提问作者Deka Pramesta
相关产品推荐
相关产品推荐

