• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

php在线生成pdf中文乱码完美解决`` - 王峰炬

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

php在线生成pdf中文乱码完美解决``

经常看pdf文章,怎么样用网页生成在线的pdf呢`````

在网上找了很多资料`````

乱码````成了关键的问题,总要改下官方的类才能实现中文。。。。。。

 

在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



将以上代码存为chinese.php即可引用。但用它只能得到一种字体。为了支持所有中文字体,可用ttf2pt1程序将TrueType字体转化pt1 字体,一个一个地转(具体方法在FPDF的教程中有详细说明)。为了支持其他中文字体,养分要修改上面的chinese.php,如下:



<?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();
?>

下载官方fpdf后,装个chines.php就可以实现生成中文呢。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
安装 PHP发布时间:2022-07-10
下一篇:
DedeCMS Xss+Csrf Getshell \dede\file_manage_control.php发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap