PHP生成pdf方法

1:第一种方法:

主要使用PHP的扩展 【 "spatie/browsershot": "3.57"】

使用这个扩展生成PDF需要环境安装以下依赖

1.1:NPM【版本:9.2.0】

1.2:NODE【版本:v18.19.1】

1.3:puppeteer【npm install -g puppeteer】

下面是示例代码:示例是脚本生成pdf的方法;

扩展也可以是接口形式直接输出给浏览器生成pdf,这种,方式不需要安装依赖。

php 复制代码
use console\base\ConsoleBaseController;
use Spatie\Browsershot\Browsershot;

class PtdfController extends ConsoleBaseController
{
    public function actionIndex()
    {


        $html = 'html代码';
        $savePath = __DIR__ . '/../../runtime/';
        $fileName = realpath($savePath)."/20250526.pdf";
        $browsershot = Browsershot::html($html); // 如果是URL页面,则使用 Browsershot::url()

        // 配置PDF输出选项
        $browsershot->setOption('format', 'A4') // 设置纸张大小
        ->setOption('margin', ['top' => '20px', 'right' => '20px', 'bottom' => '20px', 'left' => '20px']) // 设置页边距
        ->showBackground() // 显示背景图形
        ->waitUntilNetworkIdle() // 等待网络空闲后截图
        ->save($fileName); // 保存PDF到指定路径

        echo "PDF has been saved to {$fileName}";

    }
}

2:第二种方法:TCPDF

主要使用扩展【"tecnickcom/tcpdf": "6.3.5"】

这个扩展主要问题是默认不支持使用中文,需要自己下载支持中文的ttf文件转换。具体步骤如下

2.1:安装tecnickcom/tcpdf

php 复制代码
composer require tecnickcom/tcpdf:6.3.5

2.2:下载ttf文件【平台不支持上传,自己随便上网搜的下载一个就行】

STSong.ttf【最好是将这个文件放到下载好的扩展下面,我的是在

php 复制代码
vendor/tecnickcom/tools

这个目录下面有一个文件:tcpdf_addfont.php文件,这个文件是用来生成TCPDF需要的字体工具,执行下面命令【到vendor/tecnickcom/tools目录下面运行】,命令会在目录【vendor/tecnickcom/fonts】下,自动生成一个对应的文件 stsong.php

php 复制代码
php tcpdf/tools/tcpdf_addfont.php -b -t CID0CS -i STSsong.ttf

3:开始下载pdf

php 复制代码
        $pdf = new \TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
        // 设置文档信息
        $pdf->SetCreator(PDF_CREATOR);
        $pdf->SetAuthor('anson');
        $pdf->SetTitle('TCPDF Example 001');
        $pdf->SetSubject('TCPDF Tutorial');
        $pdf->SetKeywords('TCPDF, PDF, example, test, guide');
		// 移除默认的页眉和页脚
        $pdf->setPrintHeader(false);
        $pdf->setPrintFooter(false);
		// 添加一页
        $pdf->AddPage();
		// 设置字体-这个是自己下载的中文字体
        $pdf->SetFont('stsong', '', 12);
		// 添加文本
        $text = '<h1>Hello World</h1><p>你好</p>';
        $pdf->writeHTML($text, true, false, true, false, '');
		// 添加图片
//        $image_file = 'path/to/your/image.jpg'; // 替换为实际图片路径
//        $pdf->Image($image_file, 15, 140, 75, 113, 'JPG', '', 'T', false, 300, '', false, false, 0, false, false, false);
	// 输出PDF文档
        $pdf->Output('example_001.pdf', 'I'); // 'I'表示直接在浏览器中打开PDF文件

3:第三种方法:MPDF

这个扩展安装,需要安装其他依赖,这个安装的时候,会提示出来,自己根据情况安装依赖就行,但是 mbstring 和 gd依赖是必须安装的

3.1:安装

php 复制代码
composer require mpdf/mpdf: "^8.2"

3.2:下载中文字体ttf文件直接放到目录下就支持中文了【/vendor/mpdf/mpdf/ttfonts/STSong.ttf】

3.3:生成pdf

php 复制代码
        // 创建一个新的mPDF实例
        $fontDir = realpath(__DIR__ . '/../../vendor/mpdf/mpdf/ttfonts/');// 字体路径
        $mpdf = new Mpdf([
            'mode' => 'UTF-8',
            'format' => 'A4',
            'fontDir' => $fontDir,
            'fontdata' => [
                'msyh' => [
                    'R' => 'STSong.ttf',
                    'B' => 'FreeMono.ttf',
                ]
            ],
            'default_font' => 'msyh',
        ]);
//        $mpdf->setBorder()

        $html = '<h1>Hello World</h1><p>你好</p>';
	// 将HTML内容写入PDF对象
        $mpdf->WriteHTML($html);
		// 输出PDF文件给用户下载,或者直接在浏览器中打开
        $mpdf->Output('hello_world.pdf', 'D'); // 'D' 参数表示下载文件

注意:目前不管用那种方式都不能完全支持所有的css样式,都需要自己调试

相关推荐
猷咪7 分钟前
C++基础
开发语言·c++
IT·小灰灰8 分钟前
30行PHP,利用硅基流动API,网页客服瞬间上线
开发语言·人工智能·aigc·php
快点好好学习吧10 分钟前
phpize 依赖 php-config 获取 PHP 信息的庖丁解牛
android·开发语言·php
秦老师Q11 分钟前
php入门教程(超详细,一篇就够了!!!)
开发语言·mysql·php·db
烟锁池塘柳011 分钟前
解决Google Scholar “We‘re sorry... but your computer or network may be sending automated queries.”的问题
开发语言
是誰萆微了承諾11 分钟前
php 对接deepseek
android·开发语言·php
刚刚入门的菜鸟12 分钟前
php-curl
运维·web安全·php
2601_9498683615 分钟前
Flutter for OpenHarmony 电子合同签署App实战 - 已签合同实现
java·开发语言·flutter
星火开发设计29 分钟前
类型别名 typedef:让复杂类型更简洁
开发语言·c++·学习·算法·函数·知识
qq_1777673741 分钟前
React Native鸿蒙跨平台数据使用监控应用技术,通过setInterval每5秒更新一次数据使用情况和套餐使用情况,模拟了真实应用中的数据监控场景
开发语言·前端·javascript·react native·react.js·ecmascript·harmonyos