aelian / make-pdf
一种简单的方法,用于在PHP中创建PDF文档和报告
Requires
- php: >=7.2
- chillerlan/php-qrcode: ^4.3
- setasign/fpdf: ^1.8
Requires (Dev)
- phpstan/phpstan: ^1.8
- phpunit/phpunit: ^9.5
This package is not auto-updated.
Last update: 2024-09-26 14:50:49 UTC
README
一种简单的方法,用于在PHP中创建PDF文档和报告。
入门
以下说明将帮助您将项目复制到本地计算机,以便进行开发和测试。
先决条件
PHP 7.4.x.
安装
composer require aelian/make-pdf
工作原理
简单文档
实例化对象 PdfDocument
use Pdf\MakePdf\PdfDocument;
$document = new PdfDocument();
配置文档
$settings = array(
'fileName' => 'hello_world.pdf',
'template' => array(
'body' => array(
array('cell' => array('text' => 'Hello World!')),
)
)
);
创建文档
$document->create($settings);
简单报告
实例化对象 PdfReport
use Pdf\MakePdf\PdfReport;
$report = new PdfReport();
配置报告
$settings = array(
'fileName' => 'report.pdf',
'template' => array(
'body' => array(
array('line' => array(
array('cell' => array('fieldName' => 'Aliance.number')),
array('cell' => array('fieldName' => 'Aliance.name'))
))
)
),
'records' => array(
array('Aliance' => array('number' => 1, 'name' => 'Luke Skywalker')),
array('Aliance' => array('number' => 2, 'name' => 'Leia Organa'))
);
);
创建报告
$report->create($settings);
在 tests 文件夹中查看更多示例。
PDF设置
您可以使用这些设置来自定义PDF文档或报告
-
fileName - 生成的PDF的完整路径和文件名。如果没有定义,Make PDF将返回一个PDF内容流,以便在Web浏览器中渲染。(默认null)
-
outputType - 文档的发送目标。可以是以下之一:I:将文件内联发送到浏览器。如果可用,则使用PDF查看器。D:发送到浏览器并强制以给定的名称下载文件。S:将文档作为字符串返回。(默认I)
-
orientation - PDF页面方向。使用'P'表示纵向或'L'表示横向。(默认'P')
-
size - PDF页面大小。使用A3、A4、A5、LETTER或LEGAL。(默认'A4')
-
records - 用于生成PDF内容的 数据结构,通常来自数据库实体。在PdfDocument中,每个记录将生成一页,但在PdfReport中,页面将包含许多记录,具体取决于模板定义的选项。
-
skipFirstFooter - 跳过第一页的页脚。(默认false)
记录示例
$records = array(
array('EntityName' => array('fieldName' => 'Some content one'),
array('EntityName' => array('fieldName' => 'Some content two'),
array('EntityName' => array('fieldName' => 'Some content two'),
...
);
- header - 一个类似 records 的数据结构,但仅包含用于页面页眉内容的单个记录。
定义PDF模板
模板是一组选项,用于自定义PDF文档或报告。它由会话、节点和相应的属性组成。所有元素都结构化为关联数组。
会话
会话将形成您的文档的区域
-
config - PDF默认选项将在整个文档中使用,如字体大小、对齐、边框和页边距。
-
header - PDF页面页眉选项。
-
columnTitles - PDF报告列标题选项。它将在 header 后打印。
-
body - 文档正文或报告详细选项。此会话是创建PDF所必需的。
-
sumary - PDF摘要选项,其中报告可以在 body 会话后总结。
-
footer - PDF页面页脚选项。它是最后要打印的会话。
节点
会话包含一组“节点”以形成所需的PDF页面布局。这些节点可以包含不同的行为,如
-
cell - 最简单的节点。它像一个盒子,可以在其中打印一些内容。
-
line - 用于在同一行中放置一个或多个节点。节点可以是相同类型或不同类型。
-
group - 与 line 节点类似,group 用于将多个节点分组,但它可以包含多个行。
-
标题 - 用于描述节点标题,默认情况下其出现在节点顶部,字体大小比节点小。
-
图片 - 用于打印图片。您可以设置图片的大小(宽度和高度)。
-
复选框 - 打印一个空白框供勾选,或者填充一些内容。
-
数字 - 打印一系列框,可用于设置表单的字段。
-
条码123ABC - 打印类型为123ABC的条码。
-
条码I25 - 打印类型为I25的条码。
-
诗行 - 用于定义页面诗行的内容。
-
水印 - 在PDF文档或报告中打印水印。
-
二维码图片 - 用于在PDF文档或报告中打印二维码图片。您可以设置图片的大小(宽度和高度)。
-
邮政编码 - 使用邮政编码打印POSTNET条码。
属性
节点可以包含以下属性,用于定义其特征
-
文本 - 在节点中打印的静态内容。
-
字段名 - 从记录获取的动态内容,用于在节点中打印。 (示例:Entity.field)
-
边框 - 节点的边框。 (0 - 无,1 - 全部,R - 右,L - 左,T - 顶和 B - 底)
-
页边距 - 文档或报告页面左、右和顶边距。只能在配置会话中使用。 (默认10毫米)
-
对齐 - 内容的水平对齐方式。 (L - 左,C - 居中,R - 右)
-
标题 - 节点标题内容。它可以是静态的(通过属性文本)或动态的(通过属性字段名)。
-
填充 - 节点的背景颜色(使用RGB标准)。
-
交替填充 - 通过线条使用白色和由交替填充设置的颜色的交替背景颜色。 (使用RGB标准)
-
字体族 - 文档或节点的字体族,如Arial、Times、Courier、Symbol和ZapfDingbats。 (默认Arial)
-
字体样式 - 文档或节点的字体样式。 (B - 加粗,I - 斜体,N - 正常,U - 下划线)
-
字体大小Pt - 文档或节点的字体大小。 (使用点)
-
文本颜色 - 文档或节点的文本颜色。使用逗号分隔的RGB字符串。 (例如:'100,150,200')
-
标题字体族 - 节点标题的字体族,如Arial、Times、Courier、Symbol和ZapfDingbats。 (默认Arial)
-
标题字体样式 - 节点标题的字体样式。 (B - 加粗,I - 斜体,N - 正常,U - 下划线)
-
标题字体大小Pt - 节点标题的字体大小,以点为单位。
-
线宽 - 节点的宽度大小,以毫米为单位。
-
行高 - 节点的高度大小,以毫米为单位。
-
x - 节点的水平位置,以毫米为单位。
-
y - 节点的垂直位置,以毫米为单位。
-
相对X - 节点水平位置的偏移量,以毫米为单位。它可以是一个负值。
-
相对Y - 节点垂直位置的偏移量,以毫米为单位。它可以是一个负值。
-
组间距 - 打印组后的空白空间。
-
小数 - 打印值的双精度值格式。 (示例:使用“小数 = 2”定义的1234.56结果为“1.234,56”
-
日期 - 打印日期的日期值格式。 (示例:使用“日期 = d/m/Y”定义的2018-05-01结果为“01/05/2018”
-
自动分页 - 设置底部页边距限制以自动分页。
-
页脚页 - 设置用于显示组的页面。
-
中间页 - 仅在页面中间显示组。
-
自动换行 - 设置为在文本中有“\ n”字符时自动换行。
-
使用标签 - 设置单元格以在内容中检测到标签时调整字体样式。允许的标签是:
<B>
- 加粗,<I>
- 斜体和<U>
- 下划线
包含会话、节点和属性的完整模板示例
$template = array(
'config' => array(
'border' => 1,
'align' => 'L',
'fill' => 0,
'fontFamily' => 'Arial',
'fontSizePt' => 10
),
'header' => array(
'line1' => array('line' => array(
'lineHeight' => 20,
'image1' => array('image' => array('fieldName' => 'Header.image', 'lineWidth' => 20)),
'cell1' => array('cell' => array('fieldName' => 'Header.title'))
))
),
'columnTitles' => array(
'line1' => array('line' => array(
'fontStyle' => 'B',
'cell1' => array('cell' => array('text' => 'Number', 'lineWidth' => 20)),
'cell2' => array('cell' => 'Name'),
'cell3' => array('cell' => array('text' => 'Value', 'lineWidth' => 30))
))
),
'body' => array(
'groupDetail1' => array('groupDetail' => array(
'fieldName' => 'Custumer.group',
'line1' => array('line' => array(
'lineHeight' => 10,
'fontSizePt' => 12,
'cell1' => array('cell' => array('text' => 'Group:', 'lineWidth' => 40, 'border' => 0)),
'cell2' => array('cell' => array('fieldName' => 'Custumer.group', 'border' => 0)),
))
)),
'line1' => array('line' => array(
'lineHeight' => 10,
'alternateFill' => 210,
'border' => '1',
'cell1' => array('cell' => array('fieldName' => 'Custumer.number', 'lineWidth' => 20)),
'cell2' => array('cell' => array('fieldName' => 'Custumer.name')),
'cell3' => array('cell' => array('fieldName' => 'Custumer.value', 'lineWidth' => 30))
))
),
'sumary' => array(
'SUM_OF_CUSTUMER' => 'Custumer.value',
'line1' => array('line' => array(
'cell1' => array('cell' => array('text' => 'CUSTUMER COUNT ==> [RECORD_COUNT]', 'fontStyle' => 'I')),
'cell2' => array('cell' => array('text' => '[SUM_OF_CUSTUMER]', 'fontStyle' => 'B', 'decimal' => '2'))
))
),
'footer' => array(
'line1' => array('line' => array(
'cell1' => array('cell' => 'Some footer text'),
'cell2' => array('cell' => 'In [DATE]'),
'cell3' => array('cell' => 'Pages: [PAGE]/[PAGES]'),
))
)
);
在 tests 文件夹中查看更多示例。
定义XML模板文件
设置PDF模板的另一种简单有效的方法是创建XML文件。通过XML文件,您可以保持模板规则与代码分离,从而实现模板的动态生成。使用templateFile选项来定义完整的路径和XML文件名。
包含模板的XML示例
<!--?xml version="1.0" encoding="UTF-8"?-->
<template>
<config>
<border>1</border>
<align>C</align>
<fill>0</fill>
<fontFamily>Arial</fontFamily>
<fontSizePt>20</fontSizePt>
<groupSpacing>2</groupSpacing>
</config>
<body>
<group1>
<group>
<lineWidth>250</lineWidth>
<border>1</border>
<line1>
<line>
<cell1>
<cell fieldName="Model.field1">
<title fieldName="Model.field2"></title>
</cell>
</cell1>
<cell2>
<digit>
<text>6</text>
</digit>
</cell2>
<cell3>
<cell>
<text>Some text line 1 cell 3</text>
</cell>
</cell3>
</line>
</line1>
<line2>
<line>
<lineHeight>20</lineHeight>
<border>1</border>
<title><text>Line title</text></title>
<cell1><cell><text>Some text line 2 cell 1</text></cell></cell1>
<cell2><cell><text>Some text line 2 cell 2</text><lineHeight>10</lineHeight></cell></cell2>
</line>
</line2>
</group>
</group1>
</body>
</template>
您可以使用“templateFile”选项中的数组设置一个或多个XML文件。例如:
$templateFile = array(
'/templates/config.xml',
'/templates/header.xml',
'/templates/body.xml',
'/templates/footer.xml'
);
更多模板XML文件示例请参阅tests/fixtures文件夹。
开发工具
- FPDF - 允许使用纯PHP生成PDF文件的PHP类。
- PHP-QRCODE - PHP QR码库。
贡献
请阅读CONTRIBUTING.md,了解我们的行为准则以及向我们提交pull请求的过程。
版本控制
我们使用SemVer进行版本控制。有关可用版本,请参阅此仓库的标签。
许可证
本项目采用Apache许可证,详情请见LICENSE文件。