aelian/make-pdf

一种简单的方法,用于在PHP中创建PDF文档和报告

dev-master 2024-07-18 13:54 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文件。