`
天梯梦
  • 浏览: 13733368 次
  • 性别: Icon_minigender_2
  • 来自: 洛杉矶
社区版块
存档分类
最新评论

PHP利用FPDI 制作PDF 档案 (php合并pdf, php签名pdf)

 
阅读更多

 

昨天研究如何在既有的PDF 档案上放入中文字,虽然找到支援中文的FPDF ,但是有些Unicode 字集我实在试不出如何显示(如:堃) 。

 

我的同事建议我用图形来解决看看,以下就是我的实验过程(我用的是Windows 平台) 。

 

我用的相关技术如下:

名称说明下载网址
FPDF PHP 上用来产生PDF 的第三方套件 [http://www.fpdf.org/](http://www.fpdf.org/)
FPDI 用来载入一个已存在的PDF 档案,以供FPDF 使用 [http://fpdi.setasign.de/](http://fpdi.setasign.de/)
香港参考宋体(DFSongSd.ttf) 包含许多Windows 内建中文字体所没有的中文字 [http://glyph.iso10646hk.net/index.jsp](http://glyph.iso10646hk.net/index.jsp)
GD 2 PHP 产生图形用的延伸套件 PHP Win32 内建
iconv 转换文字编码 PHP Win32 内建

 

首先,我利用FPDI 来载入一个已存在的PDF :

<?php
error_reporting (E_ALL);
require_once ('FPDI/FPDI.php');
// 建立 FPDI 物件
$pdf = new FPDI();
// 載入現在 PDF 檔案
$page_count = $pdf->setSourceFile("test.pdf");
// 匯入現在 PDF 檔案的第一頁
$tpl = $pdf->importPage(1);
// 在新的 PDF 上新增一頁
$pdf->addPage();
// 在新增的頁面上使用匯入的第一頁
$pdf->useTemplate($tpl);
// 輸出成本地端 PDF 檔案
$pdf->output("final.pdf", "F");
// 結束 FPDI 剖析器
$pdf->closeParsers();
?>

 

FPDI 是继承自FPDF 这个类别,所以它本身就算是一个加强型的FPDF 。 上面的程式会把现有PDF 的第一页输出成新的PDF 档案。

 

接着我把表单传送过来的文字,放到一个现有的图形档上。 这里有两种实作方式:如果HTML 页面编码是Big5 ,那么我会先把表单传送过来的文字用iconv 转成UTF-8 编码;如果HTML 页面编码已经是UTF-8 ,那么就不必再用iconv转换。 我采用的是第一种方式:

<?php
$text = isset($_POST['text']) ? trim($_POST['text']) : NULL;
$is_created = FALSE;
if ($text)
{
// 產生圖片
$img = imagecreatefrompng('test.png');
// 設定黑色畫筆
$black = imagecolorallocate($img, 0, 0, 0);
// 轉換文字編碼
$utf_text = iconv('big5', 'utf-8', $text);
// 繪製文字
imagettftext($img, 30, 0, 10, 40, $black, "DFSongSd.ttf", $utf_text);
// 儲存圖片
imagepng($img, 'final.png');
imagedestroy($img);
$is_created = TRUE;
}
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=big5" />
<title>測試</title>
</head>
<body>
<form name="form1" id="form1" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<input type="text" name="text" id="text" value="<?php echo $text; ?>" />
<input type="submit" name="Submit" value="送出" />
<a href="./">重新製作</a>
</form>
<?php if ($is_created) { ?>
<img src="final.png" alt="<?php echo $text; ?>" />
<?php } ?>
</body>
</html>

 

如此一来在输入文字并按下送出钮后,就会在现有图片上加上指定的文字。 当然文字的位置要加以计算,我是先用最简单的方式来完成。

 

最后就是要将制作好的图片加到PDF 上了, FPDF 提供了image 函式来让我们可以在PDF 上放置图形。 实作方式如下:

// 產生圖片
$img = imagecreatefrompng('test.png');
$black = imagecolorallocate($img, 0, 0, 0);
$utf_text = iconv('big5', 'utf-8', $text);
imagettftext($img, 30, 0, 10, 40, $black, "DFSongSd.ttf", $utf_text);
imagepng($img, 'final.png');
imagedestroy($img);
// 載入現在 PDF 的第一頁
$pdf = new FPDI();
$page_count = $pdf->setSourceFile("test.pdf");
$tpl = $pdf->importPage(1);
$pdf->addPage();
$pdf->useTemplate($tpl);
// 放置圖形
$pdf->image("final.png", 75, 85, 50);
// 輸出成本地端 PDF 檔
$pdf->output("final.pdf", "F");
$pdf->closeParsers();

 

要注意的是,貼上去的圖形可以大一點,這樣縮小並貼到 PDF 時會有比較好的列印效果。而圖形的放置位置和大小,也要經過計算再貼上去。

 

原文:http://www.jaceju.net/blog/archives/55/

 

实例:

 

1. 导入完整pdf

<?php
require_once('fpdf/fpdf.php');
require_once('fpdi/fpdi.php');

// initiate FPDI
$pdf = new FPDI();

// get the page count
$pageCount = $pdf->setSourceFile('Performance_Fact_Sheet.pdf');

// iterate through all pages
for ($pageNo = 1; $pageNo <= $pageCount; $pageNo++) 
{
    // import a page
    $templateId = $pdf->importPage($pageNo);
    // get the size of the imported page
    $size = $pdf->getTemplateSize($templateId);

    // create a page (landscape or portrait depending on the imported page size)
    if ($size['w'] > $size['h']) {
        $pdf->AddPage('L', array($size['w'], $size['h']));
    } else {
        $pdf->AddPage('P', array($size['w'], $size['h']));
    }

    // use the imported page
    $pdf->useTemplate($templateId);

    $pdf->SetFont('Helvetica');
    $pdf->SetXY(5, 5);
    $pdf->Write(8, 'A complete document imported with FPDI');
}

// Output the new PDF
$pdf->Output();

 

2. 导入pdf的单页

<?php
require_once('fpdf/fpdf.php');
require_once('fpdi/fpdi.php');

// initiate FPDI
$pdf = new FPDI();
// add a page
$pdf->AddPage();
// set the source file
$pdf->setSourceFile("Fantastic-Speaker.pdf");
// import page 1
$tplIdx = $pdf->importPage(1);
// use the imported page and place it at point 10,10 with a width of 100 mm
$pdf->useTemplate($tplIdx, 10, 10, 100);

// now write some text above the imported page
$pdf->SetFont('Helvetica');
$pdf->SetTextColor(255, 0, 0);
$pdf->SetXY(30, 30);
$pdf->Write(0, 'This is just a simple text');

$pdf->Output();

 

3. 导入多pdf

<?php
require_once('fpdf/fpdf.php');
require_once('fpdi/fpdi.php');

// define some files to concatenate
$files = array(
    'Boombastic-Box.pdf',
    'Fantastic-Speaker.pdf',
    'Noisy-Tube.pdf'
);

// initiate FPDI
$pdf = new FPDI();

// iterate through the files
foreach ($files AS $file) {
    // get the page count
    $pageCount = $pdf->setSourceFile($file);
    // iterate through all pages
    for ($pageNo = 1; $pageNo <= $pageCount; $pageNo++) {
        // import a page
        $templateId = $pdf->importPage($pageNo);
        // get the size of the imported page
        $size = $pdf->getTemplateSize($templateId);

        // create a page (landscape or portrait depending on the imported page size)
        if ($size['w'] > $size['h']) {
            $pdf->AddPage('L', array($size['w'], $size['h']));
        } else {
            $pdf->AddPage('P', array($size['w'], $size['h']));
        }

        // use the imported page
        $pdf->useTemplate($templateId);

        $pdf->SetFont('Helvetica');
        $pdf->SetXY(5, 5);
        $pdf->Write(8, 'A simple concatenation demo with FPDI');
    }
}

// Output the new PDF
$pdf->Output();

 

4. 导入pdf文件,并且在最后一页签名

<?php
require_once('fpdf/fpdf.php');
require_once('fpdi/fpdi.php');

// initiate FPDI
$pdf = new FPDI();

// get the page count
$pageCount = $pdf->setSourceFile('Performance_Fact_Sheet.pdf');

// iterate through all pages
for ($pageNo = 1; $pageNo <= $pageCount; $pageNo++) 
{
    // import a page
    $templateId = $pdf->importPage($pageNo);
	
    // get the size of the imported page
    $size = $pdf->getTemplateSize($templateId);

    // create a page (landscape or portrait depending on the imported page size)
    if ($size['w'] > $size['h']) $pdf->AddPage('L', array($size['w'], $size['h']));
    else $pdf->AddPage('P', array($size['w'], $size['h']));
	
    // use the imported page
    $pdf->useTemplate($templateId);
	
	// sign when last page
	if($pageNo==$pageCount)
	{
	    // sign with your name
	    $pdf->SetFont('Arial','B','12');
	    $pdf->SetXY(68, 129); // you should keep testing untill you find out correct x,y values 
	    $pdf->Write(7, 'Gideon Liang');
		
	    // sign with current date
	    $pdf->SetXY(40, 144); // you should keep testing untill you find out correct x,y values 
	    $pdf->Write(7, '12/03/2014');
	} 
}

// Output the new PDF
$pdf->Output();

 

更多实例:http://manuals.setasign.com/fpdi-manual/the-fpdi-class/examples/

分享到:
评论
1 楼 sos7966002 2017-01-06  
还得引用tcpdf?

相关推荐

    1.PHP使用插件fpdf fpdi 给PDF文件加水印(中文乱码)

    本文将详细讲解如何利用这两个插件为PDF文件添加水印,尤其是解决中文乱码的问题。 首先,fpdf是一个开源的PHP类库,它允许我们在服务器端生成PDF文件。fpdf提供了丰富的API,可以方便地创建、编辑和打印PDF文档。...

    php生成PDF电子合同签名

    在"php生成PDF电子合同签名"这个主题中,我们主要关注的是如何利用PHP技术来创建PDF文档,并在其中实现电子签名功能,这在现代商业环境中具有很高的实用价值。以下是对这一主题的详细阐述: 首先,我们需要理解PDF...

    FPDI 合并 多个pdf文件

    FPDI 合并 多个pdf文件 FPDI 合并 多个pdf文件 FPDI 合并 多个pdf文件 FPDI 合并 多个pdf文件 FPDI 合并 多个pdf文件 FPDI 合并 多个pdf文件 FPDI 合并 多个pdf文件

    2.PHP使用插件fpdf fpdi chinese.php 给PDF文件加水印

    而FPDI(Flexible PDF Import)是FPDF的一个扩展,它的主要功能是导入已存在的PDF文档,这样可以方便地对已有PDF进行编辑,例如添加水印、替换页面、合并文档等。FPDI通过解析PDF文件的结构,提供了读取和操作PDF...

    FPDI-1.2.1.zip_FPDI_PHP7 Fpdi_mannerexg_pdf_pdf 操作

    通过这个桥接,用户可以利用FPDI导入PDF并结合TCPDF的强大功能进行更复杂的编辑和生成任务。 4. **PDF上下文管理**:`pdf_context.php`文件可能包含关于PDF文档上下文管理的代码,比如处理PDF页眉、页脚、注释、...

    3.PHP使用插件fpdf fpdi 给PDF文件加水印(中文乱码)

    fpdi是另一个PHP库,全称“FPDI - PDF Page Importer”,它能够导入现有的PDF页面并将其作为fpdf的基础,这样我们就可以在已有PDF上添加内容,如水印。 中文乱码问题的解决通常需要以下几个步骤: 1. **安装和配置...

    PHP生成PDF文件

    在IT行业中,生成PDF文件是一项常见的需求,尤其在网页服务器端处理数据时。PHP作为一种流行的服务器端脚本语言,提供了多种方法来实现这一功能。在这个话题中,我们将深入探讨如何使用FPDF库在PHP中生成PDF文件。 ...

    FPDI-2.0.0.zip

    开发者可以利用FPDI轻松地从现有PDF中提取页面,进行编辑或合并,从而实现各种复杂的PDF处理需求。通过阅读`README.md`和`src`目录中的源码,可以进一步了解如何在实际项目中应用和扩展FPDI的功能。

    FPDI:FPDI是PHP类的集合,可帮助开发人员从现有PDF文档中读取页面并将其用作FPDF中的模板

    FPDI-免费的PDF文档导入器 :red_exclamation_mark: 本文档引用了FPDI2。不建议使用版本1,并停止开发。 :red_exclamation_mark: FPDI是PHP类的集合,它使开发人员可以从现有的PDF文档中读取页面并将它们用作模板,...

    PHP实现在线阅读PDF文件的方法

    一般情况下,PHP默认不包含处理PDF文件的功能,因此可能需要安装额外的PHP扩展如fpdi、TCPDF等,或者使用第三方的库如PDFLib等来实现对PDF文件的操作。 在PHP代码中,实现在线阅读PDF文件一般会用到几个关键的PHP...

    PHP生成PDF完美支持中文简体和繁体

    在项目中遇到PHP生成PDF的工作 寻找再三,终于找到可用的代码,现分析整理打包共享给大家 chinese-unicode.php -----支持简体中文的测试chinese文件 test-unicode.php -----测试简体繁体都可以用的调试文件 fpdf.php...

    fpdi读取部分版本PDF失败

    FPDI(Flexible PDF Import for PHP)是一个PHP库,用于导入PDF页面并将其插入到新的PDF文档中。然而,有时可能会遇到"fpdi读取部分版本PDF失败"的问题。这个问题可能是由多种因素引起的,下面我们将详细探讨这些...

    fpdf(php生成pdf)

    FPDF 是一个用 PHP 编写的库,它允许开发者在 PHP 环境中生成 PDF 文档,无需依赖任何外部的软件或者扩展。这个库因其轻量级、易用和高度可移植性而受到广泛欢迎。PHP 开发者可以通过 FPDF 来创建报告、发票、证书等...

    php.rar_php pdf

    1. **生成PDF**:使用PHP的PDF库,你可以动态生成包含文字、图像、表格的PDF文件,这在报告生成、发票打印、合同制作等场景中非常有用。 2. **读取PDF**:虽然PHP本身不直接支持PDF的读取,但可以借助第三方库如PDF...

    php 真正可以支持中文 Fpdf类包 微软雅黑 黑体

    在PHP开发中,生成PDF文档是一项常见的需求,特别是在需要输出报表、合同或证书等文档时。Fpdf是一个广泛使用的PHP类库,它允许开发者在服务器端生成PDF文档,而无需依赖Adobe Acrobat。然而,Fpdf在默认情况下并不...

    PHP的FPDF的中文包chinese.php

    FPDF(Free PDF Generator)是一个用PHP编写的开源库,用于生成PDF文档。这个库的主要优点是它完全用PHP编写,无需任何外部依赖,因此在服务器端生成PDF文档时非常方便。"chinese.php"是FPDF的一个扩展,专门为解决...

    PHP解决pdf中文乱码

    PHP作为服务器端脚本语言,提供了多种处理PDF的库,如FPDF和FPDI,这些库可以帮助我们创建、修改PDF文档。 FPDF是“Free PDF Document Formatting”(免费PDF文档格式化)的缩写,是一个用PHP编写的库,可以生成PDF...

    laravel-pdfmerger:用于Laravel的FPDI PDF包装器,其中包括“合并”功能

    Laravel PDF合并安装通过作曲家$ composer require webklex/laravel-pdfmerger设置将服务提供者添加到config/app.php的providers数组中。 'providers' =&gt; [ . . . Webklex \ PDFMerger \ Providers \ ...

    Fpdf1.7官方最新版

    FPDF 是一个用于生成PDF文档的PHP类库,它允许开发者在服务器端使用PHP语言创建PDF文件。"Fpdf1.7官方最新版"指的是FPDF库的1.7版本,这是该库的一个稳定版本,包含了各种优化和改进,以满足不同用户的需求。 FPDF...

    Php pdf 相对定位打印导出

    在本案例中,"Php pdf 相对定位打印导出"着重关注如何更方便地在PDF模板上进行文字填充和定位,以替代使用fpdi库进行绝对定位时的复杂操作。fpdi库虽然强大,但在处理复杂布局和定位时可能会变得繁琐。 首先,让...

Global site tag (gtag.js) - Google Analytics