1.安装过程可以按照这里进行https://packagist.org/packages/barryvdh/laravel-snappy

其中要按装好

"barryvdh/laravel-snappy": "0.4.7",
"h4cc/wkhtmltoimage-amd64": "0.12.x",
        "h4cc/wkhtmltopdf-amd64": "0.12.x",
wkhtmltopdf/wkhtmltoimage安装在本地时,记得要添加环境变量(IDEA不同,wkhtmltopdf -V结果就可能不一样,phpstorm可以,vscode不行(可能是我设置完环境变量没有重启电脑的原因)
),如下:
1.检查是否安装了wkhtmltopdf

2.若安装,检查是否配置了path的环境变量。可通过cmd输入 wkhtmltopdf -V 来尝试。

3.若环境变量以配置,测试下wkhtmltopdf是否能正常使用。可在cmd命令中输入  wkhtmltopdf  www.baidu.com aaaaaa.pdf    点击回车,cmd面板会显示生成100%并且success,可以在user目录下搜索aaaaaa.pdf,看是否存在。注意这里命令的第二个是网址,页可以指定html文件,第三个是要生成的pdf名字,不要写路径,有时候路径会生成失败。

4.若以上都没有问题,那么存在一个非常恶心的清空,就是IDEA检测不到wkhtmltopdf的环境变量。可以在IDEA的Terminal中输入

wkhtmltopdf -V 命令来检查是否检测到了环境变量。若是没有那么就需要修改代码了。

核心代码如下:

String jsonData = JsonUtil.toJson(data);
String htmlStr = ResourceUtil.getResourceAsString("/import/import_preview_tpl.html");
htmlStr = htmlStr.replace("@{cdn}", mediaServer);
htmlStr = htmlStr.replace("@{data}", jsonData);
String htmlPath = FileUtil.randomTempFilePath(".html");
FileUtil.createStringFile(htmlPath, htmlStr); // generate pdf
String pdfPath = FileUtil.randomTempFilePath(".pdf");
List<String> cmd = new ArrayList<>();
cmd.add("D:\\wkhtmltopdf\\bin\\wkhtmltopdf");//注意这里要指定自己的安装目录了
cmd.add("-s");
cmd.add("letter");
cmd.add("-T");
cmd.add("0");
cmd.add("-B");
cmd.add("0");
cmd.add("-L");
cmd.add("0");
cmd.add("-R");
cmd.add("0");
cmd.add(htmlPath);
cmd.add(pdfPath);
CmdUtil.executeCmd(cmd);
CmdUtil中的executeCmd方法: public static void executeCmd(List<String> cmd) {
try {
ProcessBuilder pb = new ProcessBuilder(cmd);
pb.redirectErrorStream(true);
Process process = pb.start();
BufferedReader errStreamReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = errStreamReader.readLine();
while (line != null) {
logger.info(line);
line = errStreamReader.readLine();
}
process.waitFor();
} catch (IOException e) {
throw new LearningGenieRuntimeException("Execute cmd failed.", e);
} catch (InterruptedException e) {
throw new LearningGenieRuntimeException("Execute cmd failed.", e);
}
}

2.问题一,The exit status code '1' says something went wrong:\nstderr:

'pdf' => [
        'enabled' => true,
        // 'binary'  => env('WKHTML_PDF_BINARY', '/usr/local/bin/wkhtmltopdf'),
//        'binary'  => base_path('vendor/h4cc/wkhtmltopdf-amd64/bin/wkhtmltopdf-amd64'), //linux环境就可以用这个,如果是windows就会报错
         'binary' => '"D:\wk\wkhtmltopdf\bin\wkhtmltopdf.exe"',  //单引号和双引号,如果使用上一个就会报错,windows环境用这个
        'timeout' => false,
        'options' => [],
        'env'     => [],
    ],
    
    'image' => [
        'enabled' => true,
        // 'binary'  => env('WKHTML_IMG_BINARY', '/usr/local/bin/wkhtmltoimage'),
//        'binary'  => base_path('vendor/h4cc/wkhtmltoimage-amd64/bin/wkhtmltoimage-amd64'),
         'binary' => '"D:\wk\wkhtmltopdf\bin\wkhtmltoimage.exe"',
        'timeout' => false,
        'options' => [],
        'env'     => [],
    ],
如果还是有问题,可能就是缓存了,进行一下清楚缓存(在terminal上打上

wkhtmltopdf -V  //允许该程序执行之后再执行下面清楚缓存

php artisan view:clear
php artisan route:clear
php artisan cache:clear
php artisan config:clear

之后再重新生成pdf就可以了
问题二:

malformed utf-8 characters, possibly incorrectly encoded

电脑的语言设置问题:https://blog.csdn.net/qq_36025814/article/details/103439186

3.前后端配合生成pdf文件并且下载
前端:
printItem(item){
webServices.get('/packaged',{responseType:'arraybuffer'}) //responseType: `arraybuffer` //一定要写
.then(res => {
if (res.status == "200") {
let pdfUrl = window.URL.createObjectURL(new Blob([res.data], { type: `application/pdf` }));//word文档为msword,pdf文档为pdf
let fname = 'Invoice'; // 下载文件的名字
const link = document.createElement('a'); //创建一个a标签
link.href = pdfUrl;
link.setAttribute('download', fname);
document.body.appendChild(link);
link.click(); //自动下载下载
// console.log(res.data)
}
})
}
这是新建的blade视图,即生成pdf的内容(pdf.blade.php)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<table class="table table-striped">
<tr>
<th>Row No.</th>
<th>Entry ID</th>
<th>DC</th>
<th>Customer Name</th>
<th>ID No.</th>
<th>Referance No.</th>
<th>Entry Purpose</th>
<th>Time In</th>
<th>Time Out</th>
<th>Card No.</th>
<th>Cabinets</th>
<th>APC Card</th>
<th>Key</th>
</tr>
@foreach ($assignees as $assignee)
<tr>
<td>{{ ++$i }}</td>
<td>{{ $assignee->id }}</td>
<td>{{ $assignee->datacenter }}</td>
<td>{{ $assignee->cust->idnumber }}</td>
<td>{{ $assignee->custidno}}</td>
<td>{{ $assignee->refnumber }}</td>
<td>{{ $assignee->entrypurpose}}</td>
<td>{{ $assignee->timein }}</td>
<td>{{ $assignee->timeout }}</td>
<td>{{ $assignee->cardno }}</td>
<td>{{ $assignee->cabinet }}</td>
<td>{{ $assignee->apccard }}</td>
<td>{{ $assignee->key }}</td>
</tr>
@endforeach </table>
<div class="pull-right">
<strong> Report Generated on {{ date("d.m.Y") }} at {{date("h:i:sa")}} </strong>
</body>
</html>

后端:

use Barryvdh\Snappy\Facades\SnappyPdf as PDF;

$pdf = PDF::loadView('pdf',$data); //$data是pdf需要的一些数据值,即传递到pdf的变量
return $pdf->setPaper('a4')->download('test.pdf'); //download可以在前端浏览器下载,save可以保存到磁盘,默认路径是public文件夹中,使用stream()方法显示在浏览器中
//使用save()的时候,在windows环境保存到具体位置时就没有保存到,但是在网上查时说linux可以,
//在windows想保存到具体位置可以这样
$pdf = PDF::loadView('pdf.invoice', $data);

Storage::put('public/pdf/invoice.pdf', $pdf->output());  //$pdf->output()为pdf文件流   public/pdf/invoice.pdf具体路径
return $pdf->download('invoice.pdf');

最新文章

  1. jxse2.6在jdk8下,JxtaMulticastSocket存在的问题
  2. (转)Linux上的Shebang符号(#!)
  3. Class org.apache.struts2.json.JSONWriter can not access a member of
  4. asp.net2.0安全性(2)--用户个性化设置(2)--转载来自车老师
  5. windows 下面安装gcc
  6. [知了堂学习笔记]_用JS制作《飞机大作战》游戏_第1讲(素材查找和界面框架搭建)
  7. .NET Core Community 第三个千星项目诞生:爬虫 DotnetSpider
  8. NIO和经典IO
  9. [idea] - 项目启动报错Process finished with exit code 1
  10. python 一行代码字符串转字典方法
  11. NGS基础 - 高通量测序原理
  12. angular2+ 初理解
  13. C#treeView控件单击事件选中节点滞后问题解决方法
  14. 关于Unity中UI中的Mask组件、Text组件和布局
  15. url传带有汉字的参数乱码解决
  16. kafka启动及查看topic命令【已用过的,待更新】
  17. 爬虫之Xpath案例
  18. spring mvc:内部资源视图解析器2(注解实现)@Controller/@RequestMapping
  19. Hadoop-2.4.0中HDFS文件块大小默认为128M
  20. golang相关问题

热门文章

  1. IDEA查看项目日志Version Control、log
  2. .Net Core 3.0依赖注入替换 Autofac
  3. 永久修改Ubuntu的主机名称
  4. Python使用Tornado+Redis维护ADSL拨号服务器代理池
  5. windows 下部署 .netcore 到 windows service
  6. IDEA操作jdbc总结
  7. Vulnhub靶场-Me Tomcat Host 学习笔记
  8. 《MySQL必知必会》通配符 ( like , % , _ ,)
  9. 拼接html不显示layui进度条解决方法
  10. JAVA字符串的替换replace、replaceAll、replaceFirst的区别解析。