PHP编程:用PHP创立PDF中文文档
怎么配置呢 ,问最好的老实百度,问啥都有答案。所以用好搜索引擎是学好的令1个关键,程序会出各样的问题,没有1个人可能会碰到所有的问题,所有就可以问百度这个大家精华的集合了。创立|中文 我利用的是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.'' '';
$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 '');
$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: WordStr 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();
?>
我的文章不会对您的学习起到实质性的作用,您能否成功,还得靠自己的,坚持,坚持,再坚持,就是步入成功的不二法门。 Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81 说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年具体的记不清啦,囧。 为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。 这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。 Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81 我学习了一段时间后,我发现效果并不好(估计是我自身的问题)。因为一个人的精力总是有限的,同时学习这么多,会导致每个的学习时间都得不到保证。 找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。 找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。 我还是强烈建议自己搭建php环境。因为在搭建的过程中你会遇到一些问题,通过搜索或是看php手册解决问题后,你会更加深刻的理解它们的工作原理,了解到php配置文件中的一些选项设置。 不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。 写的比较杂,因为我也是个新手,不当至于大家多多指正。 找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。 你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。 微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox支持的不是很好,所以能少用还是少用的好。 我还是强烈建议自己搭建php环境。因为在搭建的过程中你会遇到一些问题,通过搜索或是看php手册解决问题后,你会更加深刻的理解它们的工作原理,了解到php配置文件中的一些选项设置。 要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。 建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。 在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、 php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。
页:
[1]
2