昨天研究如何在既有的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 pagesfor ($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 pageif($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/

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

  1. PDF怎么拆分/合并? 3款 PDF 拆分和合并工具分享

    以PDF格式传输文档已广泛使用很长时间,也是传输文档的最常见方式之一.但是,当涉及到从众多PDF文件中提取特定页面并将它们放在一起以制作新的PDF文档时,我们将需要专用软件来合并和拆分多个PDF. 现 ...

  2. 如何在C ++ 中分割PDF档案?试试Aspose

    PDF 是用于通过Internet共享文档的标准格式.它的全球支持和一致的布局使其成为此类方案的理想选择.但是在某些情况下,共享完整的PDF文件不是理想或适当的选择. 在这种情况下,可以根据需要拆分P ...

  3. c# 合并PDF小工具(合并PDF文件)

    一.背景鉴于现在网上PDF合并需要开通VIP,我自己动手,开发了一个PDF合并工具,帮助大家使用! 二.项目环境 C#环境,通过简单代码,完成PDF合并! class PDFhelper     { ...

  4. 多个vue项目合并成一个_将多个PDF文档合并成一个的方法,PDF合并软件,合并PDF...

      在我们日常办公中,因为工作的需要,我们要将多个PDF文件合并成为一个文件,那么如何将多个PDF合并在一起呢?对于一些电脑比较熟悉的人来说,搞定PDF文件合并问题还是比较轻松的,但是对于一些新手来说 ...

  5. Markdown转PDF→利用 Markdown 制作电子书|非常简单

    Markdown转PDF→利用 Markdown 制作电子书 前言 遇到什么问题就解决什么问题,什么不会就学什么. 是这样的,因为最近在看数据分析的书籍<利用Python进行数据分析 原书第2版 ...

  6. excel 按数据拆分 xlam_利用EXCEL提升效率之五分钟缩短至五秒批量合并EXCEL批量转换PDF批量上传报关单随附单据___EXCELVBA...

    进出口报关中,需要对各种发票,装箱,合同等进行重复的操作: 打印---盖章---扫描---重命名等操作. 之后将上述文件上传至单一窗口的报关单随附单据, 报关行通常需要安排一人专门进行上述操作, 每套 ...

  7. 利用Word制作pdf文件的方法

    利用Word制作pdf文件的方法 一.先用手机照成图片 二.把图片拖到word中 三.生成pdf文件 一.先用手机照成图片 二.把图片拖到word中 三.生成pdf文件 点文件 点导出 点创建PDF ...

  8. java完整的利用itext5制作pdf、二维码图片插入pdf,并解析pdf中的二维码信息

    利用itext5.zxing.QRCore制作pdf.二维码图片插入pdf,并解析pdf中的二维码信息,手机可以实现扫描获取二维码的信息,并进行验证你的解析是否正确. 先是生成二维码图片并插入pdf中 ...

  9. PDF文件怎么合并在一起?这三种方法快利用起来

    如何将几个PDF文件合并到一起呢?PDF文件相信大家是经常会使用到的,有时候为了工作上的需求,需要把几个PDF文件合并到一起来传输发送,最近有很多小伙伴私信来说不知道怎么把文件进行合并,今天给大家整理 ...

最新文章

  1. 树莓派进阶之路 (009) - 树莓派ftp脚本(原创)
  2. 超级计算机预测降雪,南方九省即将大雪纷飞?超级计算机:可能性增加,但还没有确定...
  3. 计算机应用基础期末考试电大,(电大)期末考试2017年广播电视大学网考《计算机应用基础》重点复习题目汇总版(理论题及操作题)...
  4. eclipse-连接TFS错误 the server to respond with a valid http response解决方法
  5. 【Git、GitHub、GitLab】七 git中分支的删除以及出现分离头指针的情况
  6. 面向对象开发方法概述
  7. bzoj2462 [BeiJing2011]矩阵模板 hash
  8. 《鸟哥的Linux私房菜 基础学习篇(第四版)》 第23章 XWindows设定介绍 笔记
  9. lol2月26日更新后一直提示服务器维护,《lol》2月26日更新了什么 2月26日更新内容一览...
  10. 云端服务器只能查看文件,云端服务器只能查看文件夹
  11. 《我也能做CTO之程序员职业规划》之十五:智商
  12. eclipse中文语言包安装
  13. https的加密原理-SSL+TLS
  14. solr4.3 solrconfig.xml配置文件
  15. 255%可用已接通电源_多路输出稳压电源电路
  16. Lunix基础终端控制器操作
  17. CorelDRAW Transparency(透明)效果(转)
  18. poj-2491-Scavenger Hunt
  19. ppt转换pdf转换器免费下载
  20. WPF 加OxyPlot 开发一个曲线图的小demo,设置最高点,最低点,平均值

热门文章

  1. 训练日志 2019.1.31
  2. 26 PP配置-生产车间控制-工序-为生产订单定义计划参数
  3. mmdetection多类目标训练查看单类准确率(AP)以及使用模型测试看结果(show)
  4. 【pytorch】torch.nn.Identity()
  5. excel柱状图堆叠图显示总和_如何在Excel堆积柱形图中显示合计值
  6. 如何关闭rsyslog服务?_Linux日志服务器设置过程
  7. 计算机网络(2)-数据链路层流量控制
  8. python文件的基本操作_「Python」 - 文件基本操作
  9. mysql增删改查 工具类_JDBC工具类实现对数据库数据的增删改查
  10. 是谁的名字缩写_浅谈女枪 or MF之争 盘点LOL中常见的英雄英文名缩写