电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

用PHP創建PDF中文文檔

瀏覽:39日期:2023-12-25 16:53:02

我使用的是FPDF(www.fpdf.org),下載了fpdf類庫后,還要使用下面的中文類庫才能支持中文,但只能使用一種中文字體(華文仿宋)。為此我煩惱了很長時間,現在終于搞定了,將TrueType字體轉化為pt1字體使用:

下面是在FPDF上找的一個中文類庫:<?phprequire('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);elsereturn 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);elseparent::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 breakif($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 breakif($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 chunkif($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);elseparent::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 breakif($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 chunkif($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');}}?>

將以上代碼存為chinese.php即可引用。但用它只能得到一種字體。為了支持所有中文字體,可用ttf2pt1程序將TrueType字體轉化pt1字體,一個一個地轉(具體方法在FPDF的教程中有詳細說明)。為了支持其他中文字體,養分要修改上面的chinese.php,如下:

1: Replace the following line in the AddGBFont() method:

function AddGBFont($family='GB',$name='STSongStd-Light-Acro') { $cw=$GLOBALS['GB_widths']; // $name='STSongStd-Light-Acro'; $CMap='GBKp-EUC-H'; ........

2: This is a Sample.

<?php require('chinese.php');

$pdf=new PDF_Chinese(); $pdf->AddGBFont('simsun','宋體'); $pdf->AddGBFont('simhei','黑體'); $pdf->AddGBFont('simkai','楷體_GB2312'); $pdf->AddGBFont('sinfang','仿宋_GB2312''); $pdf->Open(); $pdf->AddPage(); $pdf->SetFont('simsun','',20); $pdf->Write(10,'簡體中文漢字‘); $pdf->SetFont('simhei','',20); $pdf->Write(10,'簡體中文漢字’); $pdf->SetFont('simkai','',20); $pdf->Write(10,'簡體中文漢字‘); $pdf->SetFont('sinfang','',20); $pdf->Write(10,'簡體中文漢字’); $pdf->Output(); ?>

標簽: PHP
主站蜘蛛池模板: 净水器代理,净水器招商,净水器加盟-FineSky德国法兹全屋净水 | 浙江栓钉_焊钉_剪力钉厂家批发_杭州八建五金制造有限公司 | 北京百度网站优化|北京网站建设公司-百谷网络科技 | 猪I型/II型胶原-五克隆合剂-细胞冻存培养基-北京博蕾德科技发展有限公司 | 泰兴市热钻机械有限公司-热熔钻孔机-数控热熔钻-热熔钻孔攻牙一体机 | 除尘器布袋骨架,除尘器滤袋,除尘器骨架,电磁脉冲阀膜片,卸灰阀,螺旋输送机-泊头市天润环保机械设备有限公司 | 无负压供水设备,消防稳压供水设备-淄博创辉供水设备有限公司 | 特材真空腔体_哈氏合金/镍基合金/纯镍腔体-无锡国德机械制造有限公司 | 锌合金压铸-铝合金压铸厂-压铸模具-冷挤压-誉格精密压铸 | 环讯传媒,永康网络公司,永康网站建设,永康小程序开发制作,永康网站制作,武义网页设计,金华地区网站SEO优化推广 - 永康市环讯电子商务有限公司 | 金属切削液-脱水防锈油-电火花机油-抗磨液压油-深圳市雨辰宏业科技发展有限公司 | 神超官网_焊接圆锯片_高速钢锯片_硬质合金锯片_浙江神超锯业制造有限公司 | 【灵硕展览集团】展台展会设计_展览会展台搭建_展览展示设计一站式服务公司 | 上海璟文空运首页_一级航空货运代理公司_机场快递当日达 | 珠海网站建设_响应网站建设_珠海建站公司_珠海网站设计与制作_珠海网讯互联 | 自动售货机_无人售货机_专业的自动售货机运营商_免费投放售货机-广州富宏主官网 | 原色会计-合肥注册公司_合肥代理记账公司_营业执照代办 | 干式磁选机_湿式磁选机_粉体除铁器-潍坊国铭矿山设备有限公司 | 真石漆,山东真石漆,真石漆厂家,真石漆价格-山东新佳涂料有限公司 | 一点车讯-汽车网站,每天一点最新车讯! | 专业深孔加工_东莞深孔钻加工_东莞深孔钻_东莞深孔加工_模具深孔钻加工厂-东莞市超耀实业有限公司 | 合肥网带炉_安徽箱式炉_钟罩炉-合肥品炙装备科技有限公司 | 泰安办公家具-泰安派格办公用品有限公司 | 定硫仪,量热仪,工业分析仪,马弗炉,煤炭化验设备厂家,煤质化验仪器,焦炭化验设备鹤壁大德煤质工业分析仪,氟氯测定仪 | 筒瓦厂家-仿古瓦-寺庙-古建琉璃瓦-宜兴市古典园林建筑陶瓷厂有限公司 | 电镀电源整流器_高频电解电源_单脉双脉冲电源 - 东阳市旭东电子科技 | 智能监控-安防监控-监控系统安装-弱电工程公司_成都万全电子 | 耐高温风管_耐高温软管_食品级软管_吸尘管_钢丝软管_卫生级软管_塑料波纹管-东莞市鑫翔宇软管有限公司 | 利浦顿蒸汽发生器厂家-电蒸汽发生器/燃气蒸汽发生器_湖北利浦顿热能科技有限公司官网 | 电动卫生级调节阀,电动防爆球阀,电动软密封蝶阀,气动高压球阀,气动对夹蝶阀,气动V型调节球阀-上海川沪阀门有限公司 | 水平垂直燃烧试验仪-灼热丝试验仪-漏电起痕试验仪-针焰试验仪-塑料材料燃烧检测设备-IP防水试验机 | [品牌官网]贵州遵义双宁口腔连锁_贵州遵义牙科医院哪家好_种植牙_牙齿矫正_原华美口腔 | 双效节能浓缩器-热回流提取浓缩机组-温州市利宏机械 | 铝合金脚手架厂家-专注高空作业平台-深圳腾达安全科技 | 阿米巴企业经营-阿米巴咨询管理-阿米巴企业培训-广东键锋企业管理咨询有限公司 | 臭氧灭菌箱-油桶加热箱-原料桶加热融化烘箱-南京腾阳干燥设备厂 臭氧发生器_臭氧消毒机 - 【同林品牌 实力厂家】 | 烟台条码打印机_烟台条码扫描器_烟台碳带_烟台数据采集终端_烟台斑马打印机-金鹏电子-金鹏电子 | 废旧物资回收公司_广州废旧设备回收_报废设备物资回收-益美工厂设备回收公司 | 杭州火蝠电商_京东代运营_拼多多全托管代运营【天猫代运营】 | China plate rolling machine manufacturer,cone rolling machine-Saint Fighter | 聚合氯化铝-碱式氯化铝-聚合硫酸铁-聚氯化铝铁生产厂家多少钱一吨-聚丙烯酰胺价格_河南浩博净水材料有限公司 |