首页 > 语言 > 关键词 > php最新资讯 > 正文

PHP开发实例:创建PDF中文文档的程序代码

2008-10-15 13:23 · 稿源:网页教学网

我使用的是FPDF(www.fpdf.org),下载了fpdf类库后,还要使用下面的中文类库才能支持中文,但只能使用一种中文字体(华文仿宋)。为此我烦恼了很长时间,现在终于搞定了,将TrueType字体转化为pt1字体使用:

下面是在FPDF上找的一个中文类库:

以下为引用的内容:

<?php
require('fpdf.php');
$Big5_widths=array(' '=>250,'!'=>250,'"'=>408,'#'=>668,'$'=>490,'%'=>875,'&'=>698,'''=>250,
'('=>240,')'=>240,'*'=>417,'+'=>667,','=>250,'-'=>313,'.'=>250,'/'=>520,'0'=>500,'1'=>500,
'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>250,';'=>250,
'<'=>667,'='=>667,'>'=>667,'?'=>396,'@'=>921,'A'=>677,'B'=>615,'C'=>719,'D'=>760,'E'=>625,
'F'=>552,'G'=>771,'H'=>802,'I'=>354,'J'=>354,'K'=>781,'L'=>604,'M'=>927,'N'=>750,'O'=>823,
'P'=>563,'Q'=>823,'R'=>729,'S'=>542,'T'=>698,'U'=>771,'V'=>729,'W'=>948,'X'=>771,'Y'=>677,
'Z'=>635,'['=>344,''=>520,']'=>344,'^'=>469,'_'=>500,'`'=>250,'a'=>469,'b'=>521,'c'=>427,
'd'=>521,'e'=>438,'f'=>271,'g'=>469,'h'=>531,'i'=>250,'j'=>250,'k'=>458,'l'=>240,'m'=>802,
'n'=>531,'o'=>500,'p'=>521,'q'=>521,'r'=>365,'s'=>333,'t'=>292,'u'=>521,'v'=>458,'w'=>677,
'x'=>479,'y'=>458,'z'=>427,'{'=>480,'|'=>496,'}'=>480,'~'=>667);
$GB_widths=array(' '=>207,'!'=>270,'"'=>342,'#'=>467,'$'=>462,'%'=>797,'&'=>710,'''=>239,
'('=>374,')'=>374,'*'=>423,'+'=>605,','=>238,'-'=>375,'.'=>238,'/'=>334,'0'=>462,'1'=>462,
'2'=>462,'3'=>462,'4'=>462,'5'=>462,'6'=>462,'7'=>462,'8'=>462,'9'=>462,':'=>238,';'=>238,
'<'=>605,'='=>605,'>'=>605,'?'=>344,'@'=>748,'A'=>684,'B'=>560,'C'=>695,'D'=>739,'E'=>563,
'F'=>511,'G'=>729,'H'=>793,'I'=>318,'J'=>312,'K'=>666,'L'=>526,'M'=>896,'N'=>758,'O'=>772,
'P'=>544,'Q'=>772,'R'=>628,'S'=>465,'T'=>607,'U'=>753,'V'=>711,'W'=>972,'X'=>647,'Y'=>620,
'Z'=>607,'['=>374,''=>333,']'=>374,'^'=>606,'_'=>500,'`'=>239,'a'=>417,'b'=>503,'c'=>427,
'd'=>529,'e'=>415,'f'=>264,'g'=>444,'h'=>518,'i'=>241,'j'=>230,'k'=>495,'l'=>228,'m'=>793,
'n'=>527,'o'=>524,'p'=>524,'q'=>504,'r'=>338,'s'=>336,'t'=>277,'u'=>517,'v'=>450,'w'=>652,
'x'=>466,'y'=>452,'z'=>407,'{'=>370,'|'=>258,'}'=>370,'~'=>605);
class PDF_Chinese extends FPDF
{
function AddCIDFont($family,$style,$name,$cw,$CMap,$registry)
{
$i=count($this->fonts)+1;
$fontkey=strtolower($family).strtoupper($style);
$this->fonts[$fontkey]=array('i'=>$i,'type'=>'Type0','name'=>$name,'up'=>-120,'ut'=>40,'cw'=>$cw,'CMap'=>$CMap,'registry'=>$registry);
}
function AddBig5Font($family='Big5')
{
$cw=$GLOBALS['Big5_widths'];
$name='MSungStd-Light-Acro';
$CMap='ETenms-B5-H';
$registry=array('ordering'=>'CNS1','supplement'=>0);
$this->AddCIDFont($family,'',$name,$cw,$CMap,$registry);
$this->AddCIDFont($family,'B',$name.',Bold',$cw,$CMap,$registry);
$this->AddCIDFont($family,'I',$name.',Italic',$cw,$CMap,$registry);
$this->AddCIDFont($family,'BI',$name.',BoldItalic',$cw,$CMap,$registry);
}
function AddGBFont($family='GB')
{
$cw=$GLOBALS['GB_widths'];
$name='STSongStd-Light-Acro';
$CMap='GBKp-EUC-H';
$registry=array('ordering'=>'GB1','supplement'=>2);
$this->AddCIDFont($family,'',$name,$cw,$CMap,$registry);
$this->AddCIDFont($family,'B',$name.',Bold',$cw,$CMap,$registry);
$this->AddCIDFont($family,'I',$name.',Italic',$cw,$CMap,$registry);
$this->AddCIDFont($family,'BI',$name.',BoldItalic',$cw,$CMap,$registry);
}
function GetStringWidth($s)
{
if($this->CurrentFont['type']=='Type0')
return $this->GetMBStringWidth($s);
else
return parent::GetStringWidth($s);
}

 

function GetMBStringWidth($s)
{
//Multi-byte version of GetStringWidth()
$l=0;
$cw=&$this->CurrentFont['cw'];
$nb=strlen($s);
$i=0;
while($i<$nb)
{
$c=$s[$i];
if(ord($c)<128)
{
$l+=$cw[$c];
$i++;
}
else
{
$l+=1000;
$i+=2;
}
}
return $l*$this->FontSize/1000;
}
function MultiCell($w,$h,$txt,$border=0,$align='L',$fill=0)
{
if($this->CurrentFont['type']=='Type0')
$this->MBMultiCell($w,$h,$txt,$border,$align,$fill);
else
parent::MultiCell($w,$h,$txt,$border,$align,$fill);
}
function MBMultiCell($w,$h,$txt,$border=0,$align='L',$fill=0)
{
//Multi-byte version of MultiCell()
$cw=&$this->CurrentFont['cw'];
if($w==0)
$w=$this->w-$this->rMargin-$this->x;
$wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
$s=str_replace("\r",'',$txt);
$nb=strlen($s);
if($nb>0 and $s[$nb-1]=="\n"
$nb--;
$b=0;
if($border)
{
if($border==1)
{
$border='LTRB';
$b='LRT';
$b2='LR';
}
else
{
$b2='';
if(is_int(strpos($border,'L')))
$b2.='L';
if(is_int(strpos($border,'R')))
$b2.='R';
$b=is_int(strpos($border,'T')) ? $b2.'T' : $b2;
}
}
$sep=-1;
$i=0;
$j=0;
$l=0;
$ns=0;
$nl=1;
while($i<$nb)
{
//Get next character
$c=$s[$i];
//Check if ASCII or MB
$ascii=(ord($c)<128);
if($c=="\n"
{
//Explicit line break
if($this->ws>0)
{
$this->ws=0;
$this->_out('0 Tw');
}
$this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill);
$i++;
$sep=-1;
$j=$i;
$l=0;
$ns=0;
$nl++;
if($border and $nl==2)
$b=$b2;
continue;
}
if(!$ascii)
{
$sep=$i;
$ls=$l;
}
elseif($c==' ')
{
$sep=$i;
$ls=$l;
$ns++;
}
$l+=$ascii ? $cw[$c] : 1000;
if($l>$wmax)
{
//Automatic line break
if($sep==-1 or $i==$j)
{
if($i==$j)
$i+=$ascii ? 1 : 2;
if($this->ws>0)
{
$this->ws=0;
$this->_out('0 Tw');
}
$this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill);
}
else
{
if($align=='J')
{
if($s[$sep]==' ')
$ns--;
if($s[$i-1]==' ')
{
$ns--;
$ls-=$cw[' '];
}
$this->ws=($ns>0) ? ($wmax-$ls)/1000*$this->FontSize/$ns : 0;
$this->_out(sprintf('%.3f Tw',$this->ws*$this->k));
}
$this->Cell($w,$h,substr($s,$j,$sep-$j),$b,2,$align,$fill);
$i=($s[$sep]==' ') ? $sep+1 : $sep;
}
$sep=-1;
$j=$i;
$l=0;
$ns=0;
$nl++;
if($border and $nl==2)
$b=$b2;
}
else
$i+=$ascii ? 1 : 2;
}
//Last chunk
if($this->ws>0)
{
$this->ws=0;
$this->_out('0 Tw');
}
if($border and is_int(strpos($border,'B')))
$b.='B';
$this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill);
$this->x=$this->lMargin;
}
function Write($h,$txt,$link='')
{
if($this->CurrentFont['type']=='Type0')
$this->MBWrite($h,$txt,$link);
else
parent::Write($h,$txt,$link);
}
function MBWrite($h,$txt,$link)
{
//Multi-byte version of Write()
$cw=&$this->CurrentFont['cw'];
$w=$this->w-$this->rMargin-$this->x;
$wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
$s=str_replace("\r",'',$txt);
$nb=strlen($s);
$sep=-1;
$i=0;
$j=0;
$l=0;
$nl=1;
while($i<$nb)
{
//Get next character
$c=$s[$i];
//Check if ASCII or MB
$ascii=(ord($c)<128);
if($c=="\n"
{
//Explicit line break
$this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link);
$i++;
$sep=-1;
$j=$i;
$l=0;
if($nl==1)
{
$this->x=$this->lMargin;
$w=$this->w-$this->rMargin-$this->x;
$wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
}
$nl++;
continue;
}
if(!$ascii or $c==' ')
$sep=$i;
$l+=$ascii ? $cw[$c] : 1000;
if($l>$wmax)
{
//Automatic line break
if($sep==-1 or $i==$j)
{
if($this->x>$this->lMargin)
{
//Move to next line
$this->x=$this->lMargin;
$this->y+=$h;
$w=$this->w-$this->rMargin-$this->x;
$wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
$i++;
$nl++;
continue;
}
if($i==$j)
$i+=$ascii ? 1 : 2;
$this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link);
}
else
{
$this->Cell($w,$h,substr($s,$j,$sep-$j),0,2,'',0,$link);
$i=($s[$sep]==' ') ? $sep+1 : $sep;
}
$sep=-1;
$j=$i;
$l=0;
if($nl==1)
{
$this->x=$this->lMargin;
$w=$this->w-$this->rMargin-$this->x;
$wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
}
$nl++;
}
else
$i+=$ascii ? 1 : 2;
}
//Last chunk
if($i!=$j)
$this->Cell($l/1000*$this->FontSize,$h,substr($s,$j,$i-$j),0,0,'',0,$link);
}
function _putfonts()
{
$nf=$this->n;
foreach($this->diffs as $diff)
{
//Encodings
$this->_newobj();
$this->_out('<</Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences ['.$diff.']>>');
$this->_out('endobj');
}
$mqr=get_magic_quotes_runtime();
set_magic_quotes_runtime(0);
foreach($this->FontFiles as $file=>$info)
{
//Font file embedding
$this->_newobj();
$this->FontFiles[$file]['n']=$this->n;
if(defined('FPDF_FONTPATH'))
$file=FPDF_FONTPATH.$file;
$size=filesize($file);
if(!$size)
$this->Error('Font file not found');
$this->_out('<</Length '.$size);
if(substr($file,-2)=='.z')
$this->_out('/Filter /FlateDecode');
$this->_out('/Length1 '.$info['length1']);
if(isset($info['length2']))
$this->_out('/Length2 '.$info['length2'].' /Length3 0');
$this->_out('>>');
$f=fopen($file,'rb');
$this->_putstream(fread($f,$size));
fclose($f);
$this->_out('endobj');
}
set_magic_quotes_runtime($mqr);
foreach($this->fonts as $k=>$font)
{
//Font objects
$this->_newobj();
$this->fonts[$k]['n']=$this->n;
$this->_out('<</Type /Font');
if($font['type']=='Type0')
$this->_putType0($font);
else
{
$name=$font['name'];
$this->_out('/BaseFont /'.$name);
if($font['type']=='core')
{
//Standard font
$this->_out('/Subtype /Type1');
if($name!='Symbol' and $name!='ZapfDingbats')
$this->_out('/Encoding /WinAnsiEncoding');
}
else
{
//Additional font
$this->_out('/Subtype /'.$font['type']);
$this->_out('/FirstChar 32');
$this->_out('/LastChar 255');
$this->_out('/Widths '.($this->n+1).' 0 R');
$this->_out('/FontDescriptor '.($this->n+2).' 0 R');
if($font['enc'])
{
if(isset($font['diff']))
$this->_out('/Encoding '.($nf+$font['diff']).' 0 R');
else
$this->_out('/Encoding /WinAnsiEncoding');
}
}
$this->_out('>>');
$this->_out('endobj');
if($font['type']!='core')
{
//Widths
$this->_newobj();
$cw=&$font['cw'];
$s='[';
for($i=32;$i<=255;$i++)
$s.=$cw[chr($i)].' ';
$this->_out($s.']');
$this->_out('endobj');
//Descriptor
$this->_newobj();
$s='<</Type /FontDescriptor /FontName /'.$name;
foreach($font['desc'] as $k=>$v)
$s.=' /'.$k.' '.$v;
$file=$font['file'];
if($file)
$s.=' /FontFile'.($font['type']=='Type1' ? '' : '2').' '.$this->FontFiles[$file]['n'].' 0 R';
$this->_out($s.'>>');
$this->_out('endobj');
}
}
}
}
function _putType0($font)
{
//Type0
$this->_out('/Subtype /Type0');
$this->_out('/BaseFont /'.$font['name'].'-'.$font['CMap']);
$this->_out('/Encoding /'.$font['CMap']);
$this->_out('/DescendantFonts ['.($this->n+1).' 0 R]');
$this->_out('>>');
$this->_out('endobj');
//CIDFont
$this->_newobj();
$this->_out('<</Type /Font');
$this->_out('/Subtype /CIDFontType0');
$this->_out('/BaseFont /'.$font['name']);
$this->_out('/CIDSystemInfo <</Registry (Adobe) /Ordering ('.$font['registry']['ordering'].') /Supplement '.$font['registry']['supplement'].'>>');
$this->_out('/FontDescriptor '.($this->n+1).' 0 R');
$W='/W [1 [';
foreach($font['cw'] as $w)
$W.=$w.' ';
$this->_out($W.']]');
$this->_out('>>');
$this->_out('endobj');
//Font descriptor
$this->_newobj();
$this->_out('<</Type /FontDescriptor');
$this->_out('/FontName /'.$font['name']);
$this->_out('/Flags 6');
$this->_out('/FontBBox [0 0 1000 1000]');
$this->_out('/ItalicAngle 0');
$this->_out('/Ascent 1000');
$this->_out('/Descent 0');
$this->_out('/CapHeight 1000');
$this->_out('/StemV 10');
$this->_out('>>');
$this->_out('endobj');
}
}
?>

  • 相关推荐
  • 大家在看
  • 用php源码搭建二维码加密支付平台

    今天给大家介绍的项目-"用php源码搭建二维码加密支付平台",可以说,有一定的技术门槛,有一定的壁垒,因为需要搭建网站并且运营。正是因为有一定的门槛,需要学习和准备一些东西,才能挡住大多数用户的进入,才能长久的赚取利润。这些技术门槛,和需要准备的一些东西,我今天会详细的,手把手的教大家,如果你肯学习,并且有一定的网络基础,我相信可以很快突破难点,搭建成功。一旦搭建成功,运用一些推广的手段,后期

  • pdf怎么转换成word?这些pdf转word方法需要掌握

    pdf怎么转换成word?pdf文件的特点,大家多少会了解一些。虽然pdf格式的文件比较受小伙伴们的欢迎,但是很多的小伙伴对pdf文件的编辑操作有些苦恼,想要编辑pdf文件,可以通过文件转换的方式,将pdf转换为word文档,这样就可以编辑pdf的内容了。方法一:迅捷PDF转换器使用转换工具来完成pdf相关文件的转换是比较方便的。首先,我们需要在电脑中将转换工具给打开,然后找出对应的功能。如该软件默认的功能是“文件转word”,刚好可以?

  • 微软Edge浏览器PDF阅读器迎重要更新:流畅、安全、方便…

    尽管微软的Edge浏览器已经为PDF阅读器提供了注释和编辑支持等功能,但微软似乎想要进一步的提高Edge浏览器内置的PDF阅读器使用体验。6月17日,据外媒报道,微软宣布Chromium版Edge浏览器中的P

  • 2345加速浏览器新功能:PDF转Word一键搞定

    不管是学生还是已经步入职场,都离不开PDF文件。PDF良好的视觉阅读性和通用性,不但使得它成为大家平时交流、汇报最喜欢发送的格式文件,就连网络上分享的资料也多以PDF为版本。但PDF的修改与编辑不便,网络上常常可以看到相关提问和网络求助。有需求就有市场,打开搜索,各类转换软件层出不穷。可要么受限于付费使用,要么使用环境没有安全保障,容易造成信息泄露。为了解决这一痛点,近日,2345加速浏览器上线的了“PDF格式转换”功能。新?

  • 智能变革:英特尔HPC高性能计算与AI人工智能解决方案和实例

    在竞争日益激烈的环境中,数据中心作为传统信息化的基础,伴随着全面AI时代与5G、物联网的不断临近,企业希望获得出色的模拟和建模、人工智能(AI)和大数据分析功能,以便取得突破性的发现与创新,而高性能计算(HPC)基础设施能够为这些工作负载带来优势。 企业如果想在相同的 HPC 基础设施中运行 HPC、大数据分析和 AI 工作负载,优化的资源调度降低计算成本需要一个全面的融合HPC和AI集群的解决方案。 英特尔? 精选解决方案基于英

  • 现在买iPhone 11还是等iPhone 12?李楠:等iP12

    一年一度的618将于今晚0点正式开启。6月17日消息,一位知友在知乎提问:现在买iPhone 11还是等iPhone 12?目前iPhone 11在各大平台有大幅降价,京东平台iPhone 11 64GB版到手价4599元,拼多

  • 苹果将追踪定位iPhone抢夺者:定位iPhone技术介绍

    据 TMZ 报道称,5 月 25 日 George Floyd 遭遇明尼阿波利斯暴力执法而死亡。一周之后,美国多地发生了激烈的抗议示威活动,苹果 CEO 蒂姆·库克也曾在第一时间表达了对受害者的同情,以及对暴力伤害行为的反对。

  • iPhone SE 2 Plus、iPhone SE 3接踵而至?这可能吗?

    时隔两年,苹果今年终于发布了新款iPhone SE,连名字都懒得变,但是配备最新A13处理器、3299元的价格仍然让很多人大呼真香。那么接下来,iPhone SE又会怎么走?最新曝料称,苹果计划下一步推出

  • 京东iPhone疯狂降价:iPhone 11加899元全额换购iPhone 12

    6月1日开始,各大电商正式进入618大促。近日,京东官方宣布,自6月1日起,iPhone 11直降900元,到手价仅为4599元,同时还有iPhone 8 Plus领券立减600元、XS Max抢券立减500元等特别优惠,价格史

  • iPhone13机模曝光 手感类似iPhone5S

    近日日本网站Mac Otakara曝光一个5.5 英寸iPhone的3D打印模型,这款iPhone将于 2021 年上市,在苹果的命名中也就是iPhone13系列手机,该网站表示这款机模仅是正在开发的原型机,未来有可能会有变动。

  • 趁618买iPhone 11还是等iPhone 12?李楠给出了他的答案

    虽然如今的618的狂欢早已不仅局限于6月18日这一天,而是几乎贯穿6月一整个月,但不可否认,这一天仍将是其中所有人最期盼的狂欢高潮所在。而在热度最高的手机领域,苹果无疑是焦点中的焦点。正如此前预料的,各大平台以iPhone 11系列为代表的多款机型放出了极具竞争力的价格,牢牢吸引了无数用户的目光。

  • iPhone照片怎么添加标题

    苹果iPhone在iOS14系统中加入了给照片添加标题的新功能,这个功能具体是怎么使用呢,以下我们来看下照片添加标题的具体操作方法。

  • 比iPhone 11便宜不少!四款iPhone 12集体现身:命名曝光

    此前,多方权威信源显示,今秋苹果将推出四款iPhone 12机型,包括一款5.4英寸、两款6.1英寸以及一款6.7英寸机型。日前,荷兰T-mobile官网率先公布了iPhone 12的全系命名。相关页面信息显示,今

  • 老外大赞iPhone 12系列:全面屏版iPhone 4外形史上最佳

    综合当前比较可靠的消息,今年秋季苹果的年度旗舰iPhone 12系列将依旧提供iPhone 12、iPhone 12Max和iPhone 12 Pro、iPhone 12 Pro Max两个版本共四款机型,而且Wedbush证券最新报道称,iPhone 12的发行将重回“正轨”,依旧选择9月份发布。现在有最新消息,近日有油管博主进一步放出了据称是该机机模的“上手视频”。据国外知名油管博主@iup_date 最新发布的消息显示,与此前曝光的消息基本一致,全新的iPhone 12系列?

  • iPhone13机模曝光 苹果iPhone13机模高清大图

    iPhone12 即将发布,而目前有关于下下代iPhone13 的消息也已经曝光。Macrumors报道,日本网站Mac Otakara近日曝光了一个5. 5 英寸iPhone的3D打印模型,据称该款iPhone将于 2021 年上市。

  • iPhone小组件怎么叠放

    苹果iPhone在iOS14系统中加入了桌面小组件国内,用户可以将应用程序的某个功能单独放置到桌面中,让用户快速启动查看,如何在iPhone上添加桌面小组件呢,以及将小组件进行叠放设置,以下我们来看下具体的操作方法。

  • iPhone画中画怎么开启

    苹果iPhone画中画功能怎么开启,想要使用画中画需要进行什么样的操作步骤,这里我们来一起了解下苹果iOS14画中画功能的开启方法。

  • 哪些iPhone支持iOS14

    iOS14系统预计在6月底的苹果WWDC开发者大会上正式公布,这个新的系统可以支持哪些iPhone手机更新呢,以下我们提前来看下iOS14系统支持的iPhone型号。

  • 苹果将追踪定位iPhone抢夺者

    据外媒报道,华盛顿、洛杉矶、旧金山、纽约和费城等多家苹果商店受到袭击或破坏,抢劫者偷走了所有可用产品。苹果公司警告,被抢劫的手机和电脑等产品均不可被重置,并将追踪定位不法者的位置发送到当地执法部门。

  • 新iPhone发布将延迟 苹果iPhone12配置、准确发布日期介绍

    据彭博社报道称,博通首席执行官 Hock Tan 在当地时间周四与分析师举行的财报电话会议上讨论了「北美大型手机」客户的「主要产品周期延迟」。预计 iPhone 12 系列的发布时间将由常规的 9 月推迟到今年第四季度。

  • 参与评论
文明上网理性发言,请遵守新闻评论服务协议