【TCPDF】使用TCPDF导出PDF文件

news2025/2/5 19:53:00

目录

一、安装TCPDF类库

二、安装字体

三、使用TCPDF导出PDF文件


目的:PHP通过TCPDF类库导出文件为PDF。

开发语言及类库:ThinkPHP、TCPDF

效果图如下

一、安装TCPDF类库

在项目根目录使用composer安装TCPDF,安装完成后会在vendor目录下生成tecnickcom文件夹,就是TCPDF类库

composer require tecnickcom/tcpdf

二、安装字体

有时候导出的文件是乱码,是因为TCPDF不支持中文,所以需要下载中文字体,字体在网上可以搜索下载,把下载好的字体(ttf格式)放到“\tecnickcom\tcpdf\tools\”目录下,在此目录打开CMD,输入

php tcpdf_addfont.php -i .\msyh.ttf

执行成功后,在“\tecnickcom\tcpdf\fonts\”文件夹下生成相应的文件

三、使用TCPDF导出PDF文件

TCPDF类库和字体安装好后,就可以引用TCPDF导出PDF文件了

<?php
use tecnickcom\tcpdf\tcpdf;

public function exportPDF(){
    $objPDF = new \TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
	// 是否显示页眉
	$objPDF->setPrintHeader(false);
	// 是否显示页脚
	$objPDF->setPrintFooter(true);
	// 设置页脚的字体
	$objPDF->setFooterFont(Array('msyh', '', '8'));
	// 设置页脚距离底部的距离
	$objPDF->SetFooterMargin('7');
	// 设置默认等宽字体
	$objPDF->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
	// 设置行高
	$objPDF->setCellHeightRatio(1.5);
	// 设置是否自动分页  距离底部多少距离时分页
	$objPDF->SetAutoPageBreak(TRUE, '10');
	$objPDF->setFontSubsetting(true);
	$objPDF->AddPage();
	// 设置字体
	$objPDF->SetFont('msyh', '', 12, '', true);

	// 调用拼接html代码方法
	$pdf_html = $this->pdf_html($info,$list,$title);

	$objPDF->writeHTMLCell(0, 0, '', '', $pdf_html, 0, 1, 0, true, '', true);
	// 输出  四种模式 I输出、D下载、F保存本地、S输出二进制字符串
	$objPDF->Output('test.pdf', 'D');
}

上面pdf_html方法是拼接html代码,里面的HTML代码可以根据自己需要修改。CSS样式并不是所有都支持,但也可以用其他HTML标签的代替,比如说font-weight就不支持,可以使用<b></b>代替。

public function pdf_html($info,$list,$title)
{
	$html = '';
	$html .= '<h2 style="text-align:center;"><b>'.$title.'</b></h2>
				<table style="text-align:right">
				<tr><td>班级:'.$info['grade'].'_'.$info['year'].$info['season'].'</td></tr>
				<tr><td>总人数:'.$info['student'].'; 已交卷:'.$info['cmit'].'</td></tr>
				<tr><td>导出时间:'.date('Y-m-d H:i:s',time()).'</td></tr>
				</table>';

	foreach ($list as $k => $v) {
		
		$html .= '<div>
					【'.$v['type'].'】 第'.($k+1).'题:'.$v['title'].'<br><span style="color: green;">【正确答案:'.$v['answer'].'】</span><b style="color: #1E9FFF"> &nbsp; &nbsp; 正确率:'.$v['percent'].'%</b>
				</div>
				<table  border="1" style="text-align:center">
				    <colgroup>
				      <col width="40%">
				      <col width="10%">
				      <col width="50%">
				      <col>
				    </colgroup>
				    <tr style="background:#f2f2f2; ">
				        <th>选项</th>
				        <th>选择次数 / 人</th>
				        <th>比例</th>
				    </tr> 
			    		<tr>
					        <td style="text-align:left">A:'.$v['option_A'].'</td>
					        <td>'.$v['sel_A'].'</td>
					        <td>'.$v['percent_A'].'%</td>
					    </tr>
					    <tr>
					        <td style="text-align:left">B:'.$v['option_B'].'</td>
					        <td>'.$v['sel_B'].'</td>
					        <td>'.$v['percent_B'].'% </td>
				      	</tr>
				      	<tr>
					        <td style="text-align:left">C:'.$v['option_C'].'</td>
					        <td>'.$v['sel_C'].'</td>
					        <td> '.$v['percent_C'].'% </td>
					    </tr>
					    <tr>
					        <td style="text-align:left">D:'.$v['option_D'].'</td>
					        <td>'.$v['sel_D'].'</td>
					        <td> '.$v['percent_D'].'% </td>
					    </tr>
					    <tr>
					        <td style="text-align:left">E:'.$v['option_E'].'</td>
					        <td>'.$v['sel_E'].'</td>
					        <td> '.$v['percent_E'].'% </td>
					    </tr>
					    <tr>
					        <td style="text-align:left">F:'.$v['option_F'].'</td>
					        <td>'.$v['sel_F'].'</td>
					        <td> '.$v['percent_F'].'% </td>
					    </tr>
					    <tr>
					        <td style="text-align:left">G:'.$v['option_G'].'</td>
					        <td>'.$v['sel_G'].'</td>
					        <td> '.$v['percent_G'].'% </td>
					    </tr>
				    <tr>
				        <th>作答人数:'.$v['cmit_num'].' 人次</th>
				        <th></th>
				        <th></th>
				    </tr> 
				</table><br/>';
	}
	return $html;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1002132.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVAEE初阶相关内容第十一弹--多线程(进阶)

目录 一、常见的锁策略 1乐观锁VS悲观锁 1.1乐观锁 1.2悲观锁 2.轻量级锁VS重量级锁 2.1轻量级锁 2.2重量级锁 3.自旋锁VS挂起等待锁 3.1自旋锁 3.2挂起等待锁 4.互斥锁VS读写锁 4.1互斥锁 4.2读写锁 5.公平锁VS非公平锁 5.1公平锁 5.2非公平锁 6.可重入锁VS不…

记LGSVL Map Annotation(2)导入点云、以及地图

导入点云 内置的点云导入器工具提供了将最流行的点云文件格式&#xff08;PCD、PLY、LAS、LAZ&#xff09;转换为可用于仿真的数据所需的所有功能。 要访问点云导入器窗口&#xff0c;请在 Unity 编辑器中打开模拟器项目&#xff0c;然后导航到 Simulator/Import Point Cloud…

SpringCloud学习笔记(六)OpenFeign 服务接口调用

一、OpenFeign简介 1、OpenFeign是什么 Feign是一个声明式WebService客户端&#xff0c;使用Feign能让编写Web Service客户端更加简单。 它的使用方法是定义一个服务接口然后在上面添加注解&#xff0c;Feign也支持可拔插式的编码器和解码器&#xff0c;Spring Cloud对Feign进…

SolVES4.1学习2——导入数据运行模型

使用样例数据运行模型很容易&#xff0c;运行自己的数据要根据教程先对数据进行预处理之后根据教程导入数据。 首先新建一个solves数据库&#xff0c;之后restore。导入数据大概的流程为&#xff1a; 1、导入数据 首先使用PostGIS导入矢量数据。矢量数据包括点位和范围数据。…

grpc多语言通信之GO和DART

都是一个吗生的,找下例子 上一篇文章说到go实现的grpc方法已经实现了一个grpc的server端, 注意: 这两个项目的.proto文件应当是完全一致的,只是方法用各自的语言实现罢了 报错了: Caught error: gRPC Error (code: 12, codeName: UNIMPLEMENTED, message: grpc: Decompresso…

MySQL——命令行客户端的字符集问题

原因&#xff1a;服务器端认为你的客户端的字符集是utf-8&#xff0c;而实际上你的客户端的字符集是GBK。 查看所有字符集&#xff1a;SHOW VARIABLES LIKE character_set_%; 解决方案&#xff0c;设置当前连接的客户端字符集 “SET NAMES GBK;”

Nacos服务心跳和健康检查源码介绍

服务心跳 Nacos Client会维护一个定时任务通过持续调用服务端的接口更新心跳时间&#xff0c;保证自己处于存活状态&#xff0c;防止服务端将服务剔除&#xff0c;Nacos默认5秒向服务端发送一次&#xff0c;通过请求服务端接口/instance/beat发送心跳。 客户端服务在注册服务的…

论文解读 | 用于3D对象检测的PV-RCNN网络原创

原创 | 文 BFT机器人 01 背景 本文的背景涉及到3D物体检测&#xff0c;这是一个在自动驾驶和机器人等领域应用广泛的重要问题。在这些领域&#xff0c;LiDAR传感器被广泛用于捕捉3D场景信息&#xff0c;生成不规则且稀疏的点云数据。这些点云数据提供了理解和感知3D场景的关键…

QVector 和 QMap

QVector_QMap QVector简介 头文件&#xff1a;#include<QVector> 模块&#xff1a; QT core 功能&#xff1a; QVector类是动态数组的模板类&#xff0c;顺序容器&#xff0c;它将自己的每一个对象存储在连续的内存中&#xff0c;可以使用索引号来快速访问它们 常用…

【数据结构】树和二叉树概念

1.树概念及结构 树概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个特殊的结点&#xff0c;…

Android获取系统读取权限

在Androidifest.xml文件中加上授权语句 <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE"/>

Android12之/proc/pid/status参数含义(一百六十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

【LeetCode题目详解】第九章 动态规划part13 300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组 (day52补)

本文章代码以c为例&#xff01; 一、力扣第300题&#xff1a;最长递增子序列 题目&#xff1a; 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改…

Scrum敏捷开发工具的基本概念、使用方法、优势以及实际应用案例

​随着软件开发行业的不断发展和进步&#xff0c;Scrum敏捷开发工具逐渐成为了备受关注的话题。 Scrum是一种灵活且高效的项目管理方法&#xff0c;旨在提高团队协作和交付效率&#xff0c;使团队能够更快地响应变化和需求。 本文将深入探讨Scrum敏捷开发工具的基本概念、使用…

分类预测 | MATLAB实现WOA-CNN-BiGRU鲸鱼算法优化卷积双向门控循环单元数据分类预测

分类预测 | MATLAB实现WOA-CNN-BiGRU鲸鱼算法优化卷积双向门控循环单元数据分类预测 目录 分类预测 | MATLAB实现WOA-CNN-BiGRU鲸鱼算法优化卷积双向门控循环单元数据分类预测分类效果基本描述模型描述程序设计参考资料 分类效果 基本描述 1.Matlab实现WOA-CNN-BiGRU多特征分类…

敏捷项目管理实践及敏捷工具

​敏捷项目管理是一种基于敏捷开发方法的项目管理方式&#xff0c;它强调快速响应变化、持续交付价值和高效的团队合作。 1、确定敏捷宣言的价值观和原则&#xff0c;例如“以人为本”、“可用的软件”、“以客户为中心”、“拥抱变化”等&#xff0c;并在项目中始终遵循这些价…

二维差分---基础算法

书接上回 a二维数组是b二维数组的前缀和数组,b二维数组是a二维数组的差分数组,也就是说a[i][j]b[1][1]b[1][2] ......b[i][1] b[i][2] ...... b[i][j] ,下图是b的二维数组 如图,当你想要整个矩阵中的一个子矩阵都加上一个C,如果我们将b[x1][x2]加上C,那么a数组右下角所有的…

3.3 栈的表示和操作的实现

3.3.1 栈的类型定义 主要内容&#xff1a; 这段文字中包含了很多栈数据结构的基本概念和操作。 ### 3.3 栈的表示和操作的实现 #### 3.3.1 栈的类型定义 1. **数据对象**&#xff1a; - 定义了一个数据对象集合&#xff0c;记作 D {a1, a2, ..., an}&#xff0c;其…

一维的差分

差分的方法 差分实际上是前缀和的逆运算 ,这个关系和 积分与求导 的关系类似 例如有数组 ...... 和构造数组 ...... 我们要使得a数组是b数组的前缀和 ...... 那么该如何构造b数组呢? 令 , …

使用带有示例和代码的因式分解机的推荐系统

一、说明 在我之前的文章中&#xff0c;我讨论了推荐系统的基础知识、矩阵分解和神经协同过滤 &#xff08;NCF&#xff09;&#xff0c;您可以在下面的“我的博客”部分找到它们。接下来&#xff0c;这次我将通过示例和代码来探索因式分解机器。 将因子分解机用于推荐系统的一…