PDF文件页面大小不一致的解决方法(使用Chrome+Win10)

此方法曾实例化于Chrome78+Win10 ver1909环境

Step1 用Chrome打开PDF文件

可以在PDF文件上点右键

->点”打开方式”

->选择Chrome

Step2 在Chrome中点”菜单” ->打印, 如下图

Step3 在弹出的打印对话框中, 打印机选择”Mircosoft Print to PDF”

->点”更多设置”

->缩放选择”适合页面大小”

->选择”纸张尺寸”, 如下图

然后点”打印”按钮, 得到调整大小后的PDF文件.

PHP下使PDF文件下载而不是直接打开

如果直接有一个超链接, 指向一个PDF文件, Chrome很可能会直接打开它, 而不是下载它.

如何让用户点击链接就下载PDF呢?可以用如下代码

<?php
    //这么写它就会下载
    header("Content-Disposition: attachment;filename=下载默认文件名.pdf");

    //这里输入要读取的pdf的源文件
    $download = file_get_contents('http://class4ever.com/pdffile.pdf');

    //以流的方式输出
    echo $download;

ThinkPHP下使用wkhtmltopdf和phpwkhtmltopdf把网页转为pdf文件

第一部分 wkhtmltopdf的部署, 参见这篇文章

第二部分 用Composer给ThnkPHP安装phpwkhtmltopdf插件

可以将Composer设置为国内镜像, 以免下载卡住; 就像这样

composer config -g repo.packagist composer https://packagist.phpcomposer.com

进入ThinkPHP的根目录, 就是vendor的上层目录, 在此执行如下指令

composer require mikehaertl/phpwkhtmltopdf

第三部分 Composer报错的处理

如果运行Composer时出现以下报错:Warning: putenv() has been disabled for security reasons in…

那么可能是你的php.ini中禁用了某些函数, 可以编辑你的php.ini

->搜索 disable_functions

->找到被禁用的函数, 将其删除

第四部分 使用phphtmltopdf

然后就可以用了, 示例代码如下

<?php

namespace app\index\controller;

use app\index\controller\IndexBase;
use mikehaertl\wkhtmlto\Pdf;//关键代码: 引用phphtmltopdf

//这是一个叫做Book的控制器
class Book extends IndexBase
{

    //在这个方法来调用
    public function savePdf()
    {
       $pdf = new Pdf('http://www.baidu.com');

        if (!$pdf->saveAs('page1.pdf')) {
            $error = $pdf->getError();
        }
    }
}

这样, 我们调用/index/book/savepdf, 就会在ThinkPHP的/public目录下生成一个叫page1.pdf的文件, 而它就是由http://www.baidu.com转码成pdf而得的

但是我第一次运行它时, 系统是报错的, 系统这么说: proc_open() has been disabled for security reasons; 解决方法是像本文第三部分那样, 并重启PHP服务.