整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

PHP转换HTML为PDF文档的方法和常见问题

司的某项业务需要与用户线上签订协议,即用户在线手写一个签名,后台将公司公章信息和用户的签名以及合同信息生成一份PDF文件,供用户查看和下载。



比对了一些插件,我们最终决定使用dompdf这个插件,插件的github在这里:https://github.com/dompdf/dompdf。

1. 使用方法

  • 安装可以使用composer或者直接下载源代码,使用require或者include引入。
  • 具体的使用方式,可以参考以下示例代码。
// 引入命名空间
use Dompdf\Dompdf;
// 初始化dompdf对象
$dompdf = new Dompdf();
// 加载html文档内容
$dompdf->loadHtml('hello world');
// 设置纸张类型和方向
$dompdf->setPaper('A4', 'landscape');
// 渲染HTML为PDF
$dompdf->render();
// 流输出
$dompdf->stream();

2. 常见问题和解决办法

2.1 中文乱码的问题

插件对于字体和编码问题是这样形容的:

PDF documents internally support the following fonts: Helvetica, Times-Roman, Courier, Zapf-Dingbats, & Symbol. These fonts only support Windows ANSI encoding. In order for a PDF to display characters that are not available in Windows ANSI, you must supply an external font. Dompdf will embed any referenced font in the PDF so long as it has been pre-loaded or is accessible to dompdf and reference in CSS @font-face rules. See the font overview for more information on how to use fonts.The DejaVu TrueType fonts have been pre-installed to give dompdf decent Unicode character coverage by default. To use the DejaVu fonts reference the font in your stylesheet, e.g. body { font-family: DejaVu Sans; } (for DejaVu Sans). The following DejaVu 2.34 fonts are available: DejaVu Sans, DejaVu Serif, and DejaVu Sans Mono.

尝试了一下,默认带的字体是无法渲染中文的,使用CSS的@font-face引入会报错(也可能是我打开方式不对)。这样就只好自己引入一个字体了。

插件给了一个安装语言文件的工具,地址再这里:https://github.com/dompdf/utils。

使用步骤:

  • 下载或者复制load_font.php文件,放到dompdf文件夹内,与src和test文件夹同级
  • 修改load_font.php文件中引入的autoload.php为项目实际的位置
  • 在命令行中执行php load_font.php simkai /path/to/simkai.ttf

这样,我们就可以在html文档的css中使用font-family属性来指定字体了。

html {
 font-family: simkai;
}

2.2 图片无法展示

插件应该是无法直接显示网络图片,所以需要将图片转换为BASE64格式才能显示。

将HTML文档中的所有图片转换为BASE64的方式:

function imgToBase64($html) {
 $html = preg_replace_callback('/<img(?:.*?)src="(.*?)"(?:.*?)\/?>/', function($matches) {
 $imageInfo = getimagesize($matches[1]);
 $base64 = "" . chunk_split(base64_encode(file_get_contents($matches[1])));
 $base64_image = 'data:' . $imageInfo['mime'] . ';base64,' . $base64;
 return str_replace($matches[1], $base64_image, $matches[0]);
 }, $html);
 return $html;
}

这样转换其实性能影响挺大的,感觉性能不太好可以加一下缓存。

当今数字时代,网站是企业和个人的必需品。而HTML是创建网站的基础,它赋予了网站结构、内容和交互性。本文将深入探讨HTML,提供一个全面的指南,帮助你掌握网站设计的关键。

什么是HTML?

HTML(超文本标记语言)是一种标记语言,用于描述网页的结构和内容。它由一组元素和属性组成,这些元素和属性定义了文本、图像、链接和其他网页组件。

HTML元素

HTML元素是构成网页基本构建块的标签。每个元素都有一个开始标签和一个结束标签,它们之间包含元素的内容。最常见的元素包括:

  • <head>:定义网页的元数据
  • <body>:包含网页的可见内容
  • <p>:创建段落
  • <a>:创建链接
  • <img>:插入图像

HTML属性

属性用于修改元素的行为或外观。每个元素可以具有多个属性,这些属性由名称和值对组成。例如,<img>元素可以具有src属性来指定图像文件的路径。

HTML结构

HTML文档遵循一个特定的结构,包括:

  1. **文档类型声明:**指定所使用的HTML版本
  2. **<head>元素:**包含元数据,如页面标题、描述和关键词
  3. **<body>元素:**包含网页的可见内容

HTML交互性

虽然HTML本质上是静态的,但它可以与其他技术结合使用,如JavaScript和CSS,以创建交互式网站。例如,JavaScript可以用于验证表单输入或创建动画效果。

学习HTML

学习HTML相对容易,有许多在线资源和教程可供使用。以下是一些提示:

  • 从基础开始,学习基本元素和属性
  • 练习创建简单的网页
  • 探索高级概念,如表格、表单和多媒体
  • 使用代码编辑器和浏览器调试工具

掌握HTML的好处

掌握HTML有很多好处,包括:

  • **创建自己的网站:**设计和开发你的个人或商业网站
  • **提高就业能力:**HTML是许多技术工作的重要技能
  • **理解网络:**深入了解网页如何工作
  • **激发创造力:**用你的想象力创建视觉上引人注目的网站

结论

HTML是网站设计的基石。通过理解其基本原理、元素和结构,你可以解锁创建引人入胜且功能丰富的网页的能力。无论你是想建立自己的网站还是提升你的职业生涯,掌握HTML都是必不可少的。

、简介

在PHP中,htmlentities()函数是一个常用的字符串处理函数,用于将字符串中的特殊字符(如<>等)转换为HTML实体,以防止跨站点脚本攻击(XSS)。

二、语法

htmlentities(string $string, int $flags = ENT_COMPAT | ENT_HTML401, string|null $encoding = ini_get("default_charset"), bool $double_encode = true)

三、参数解释

$string:必需,要处理的字符串,字符串类型。

$flags:可选,指定转换过程中的一些规则和选项,整数类型,默认为ENT_COMPAT | ENT_HTML401。

$encoding:可选,指定要使用的字符编码,字符串类型,如果未指定,则使用ini_get("default_charset")函数获取默认字符编码。

$double_encode:可选,指定是否对已存在的HTML实体进行转义,布尔类型,默认为true。

四、返回值

htmlentities()函数返回一个新的字符串,其中的特殊字符被转换为了HTML实体。

五、使用实例

下面是一个简单的使用实例:

在上面的例子中,我们使用htmlentities()函数将字符串中的特殊字符(如<>等)转换为了HTML实体,以防止跨站点脚本攻击(XSS)。

六、注意事项

1、在使用htmlentities()函数时,需要注意转换规则。例如,它只会将特殊字符转换为HTML实体,但不会对其他类型的攻击进行防护,例如SQL注入攻击、跨站点请求伪造(CSRF)攻击等。

2、在使用htmlentities()函数时,需要注意字符编码。例如,如果在使用htmlentities()函数时未指定字符编码,可能会导致转换结果不正确,从而引发安全性问题。

3在处理用户输入的文本时,我们需要注意安全性问题。例如,可以使用addslashes()函数来防止SQL注入攻击,在输出到HTML页面中时,需要使用htmlentities()函数防止跨站点脚本攻击(XSS)。