日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

用PHP創建PDF中文文檔

瀏覽:103日期: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
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久免费视频66| 欧美一区久久| 欧美国产美女| 中文字幕在线视频网站| 国产精品福利在线观看播放| 久久伊人亚洲| 激情国产在线| 蜜桃av在线播放| 性欧美xxxx免费岛国不卡电影| 天堂中文在线播放| 久久久国产精品一区二区中文| 91精品啪在线观看国产18| 高清一区二区三区av| 久久久水蜜桃av免费网站| 好吊日精品视频| 中文字幕一区二区三区四区久久| 91麻豆精品| 精品一区二区三区四区五区| 色婷婷精品视频| 久久av在线| 国产精品成人一区二区网站软件| 国产精品国产三级国产在线观看| 久久精品中文| 久久av在线| 国产精品永久| 久久精品123| 亚洲精品日韩久久| 久久精品xxxxx| 激情黄产视频在线免费观看| 亚洲激情久久| 日韩av不卡一区二区| 精品亚洲二区| 黑丝一区二区| 欧美一区免费| 欧洲一区二区三区精品| 亚洲中午字幕| 久久精品国产在热久久| 欧美日韩高清| 国产欧美91| 香蕉人人精品| 国产亚洲久久| 婷婷精品进入| 日产欧产美韩系列久久99| 久久精品一本| 在线综合亚洲| 国产精品综合| 亚洲精品网址| 欧美激情91| 香蕉久久国产| 日本久久精品| 在线精品视频一区| 精品一区二区三区免费看 | 国产精品网在线观看| 日韩av一级| 国产区精品区| 亚洲成人二区| 久久不卡日韩美女| 宅男噜噜噜66国产日韩在线观看| 美女精品一区二区| 老牛国产精品一区的观看方式| 国产成人精品一区二区三区在线| 亚洲欧美日本日韩| 国产在线观看www| 日韩欧美高清一区二区三区| 日韩成人高清| 日韩中文字幕| 91精品一区国产高清在线gif | 日韩欧美中文在线观看| 日本а中文在线天堂| 欧美日韩调教| 亚洲免费影院| 久久久久国产一区二区| 国产精品久久久久9999高清| 欧美在线网站| 国产精品原创| 国产精品亚洲四区在线观看| 亚洲丝袜美腿一区| 日本韩国欧美超级黄在线观看| 国产日韩欧美一区在线| 99国产精品久久久久久久| 国产精品a久久久久| 亚洲午夜久久| 欧美特黄视频| 久久久成人网| 国产精品高颜值在线观看| 国产日韩三级| 亚洲精品成人一区| 亚洲国产日韩欧美在线| 丁香六月综合| 欧美国产极品| 国产色99精品9i| 亚洲日本国产| 久久不射网站| 欧美一区二区三区高清视频| 精品国产乱码久久久久久樱花| 免费日本视频一区| 蜜桃tv一区二区三区| 大香伊人久久精品一区二区| 欧美影院视频| 日韩国产欧美三级| 一区二区精品| 性欧美精品高清| 黑丝一区二区三区| 欧美亚洲激情| 99精品美女| 亚洲精品成人图区| 久久精品免视看国产成人| 久久精品 人人爱| 日韩1区2区3区| 日韩欧美四区| 亚洲日本欧美| 亚洲精选成人| 亚洲bt欧美bt精品777| 久久国产99| 免费在线视频一区| 在线观看一区| 天堂久久一区| 91在线成人| 欧美一区影院| 国产精区一区二区| 欧美1区二区| 欧美日韩亚洲国产精品| 国产精品亚洲欧美一级在线| 免费亚洲婷婷| 精品不卡一区| 麻豆国产欧美一区二区三区| 国产精品久一| 国产精品观看| 美女视频黄免费的久久| 久久av电影| 国产videos久久| 日韩精品第一区| 久久中文字幕二区| 欧美午夜不卡| 亚洲欧洲国产精品一区| 日本色综合中文字幕| 日本欧美在线| 久久精品国产99国产| 国产不卡精品在线| 尤物tv在线精品| 一区视频在线| 综合激情五月婷婷| 国产日韩欧美一区二区三区在线观看 | 日韩电影免费在线观看| 欧美香蕉视频| 欧美日韩精品一本二本三本| 美女国产一区| 日韩欧美中文在线观看| 国产精品久久久久久久久免费高清 | 国产一区久久| jizzjizz中国精品麻豆| 国产精品啊v在线| 国产精品二区不卡| 香蕉人人精品| 综合激情在线| 麻豆国产精品视频| 久久精品欧美一区| 视频一区视频二区中文字幕| 国产日韩欧美高清免费| 国产aa精品| 天堂日韩电影| 亚洲开心激情| 国产精品xxx在线观看| 丝袜美腿诱惑一区二区三区| 热久久国产精品| 麻豆国产精品| 红桃视频国产一区| 欧美在线看片| 日韩欧美不卡| 亚洲天堂av资源在线观看| 久久成人av| 亚洲女同一区| 国产九九精品| 亚洲国产专区校园欧美| 日韩国产在线观看| 国产毛片精品| 成人久久久久| 日韩国产欧美一区二区三区| 超碰在线99| 免费成人在线观看| 六月丁香综合在线视频| 欧美在线亚洲综合一区| 国产精品mm| 日韩午夜av在线| 欧美国产另类| 亚洲专区在线| 国产成人精品一区二区三区免费| 亚洲一区成人| 欧美激情另类| 日本不卡的三区四区五区| 超碰在线99| 日本a口亚洲| 亚洲一本视频| 久久亚洲精品中文字幕| 蜜臀a∨国产成人精品| 亚洲天堂资源| 国产调教精品| 香蕉成人久久| 日韩欧美一区二区三区免费观看| 欧美日韩va|