Heim > Artikel > Backend-Entwicklung > So erstellen Sie chinesische PDF-Dokumente mit PHP
So erstellen Sie chinesische PDF-Dokumente mit PHP
Ich verwende FPDF (www.fpdf.org) Nach dem Herunterladen der fpdf-Klassenbibliothek muss ich die folgende chinesische Klassenbibliothek verwenden, um Chinesisch zu unterstützen, es kann jedoch nur eine chinesische Schriftart verwendet werden (chinesische Nachahmung der Song-Dynastie). Ich habe mir schon lange darüber Gedanken gemacht, und jetzt habe ich es endlich herausgefunden, TrueType-Schriftarten in pt1-Schriftarten umzuwandeln, indem ich Folgendes verwende:
Das Folgende ist eine chinesische Klassenbibliothek auf FPDF:
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);
Klasse PDF_Chinese erweitert FPDF
{
Funktion 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);
}
Funktion 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);
}
Funktion 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);
}
Funktion GetStringWidth($s)
{
if($this->CurrentFont['type']=='Type0')
return $this->GetMBStringWidth($s);
sonst
return parent::GetStringWidth($s);
}
Funktion GetMBStringWidth($s)
{
//Multibyte-Version von 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 ;
}
sonst
{
$l =1000;
$i =2;
}
}
gib $l*$this->FontSize/1000;
zurück
}
Funktion MultiCell($w,$h,$txt,$border=0,$align='L',$fill=0)
{
if($this->CurrentFont['type']=='Type0')
$this->MBMultiCell($w,$h,$txt,$border,$align,$fill);
sonst
parent::MultiCell($w,$h,$txt,$border,$align,$fill);
}
Funktion MBMultiCell($w,$h,$txt,$border=0,$align='L',$fill=0)
{
//Multibyte-Version von 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 und $s[$nb-1]=="n"
$nb--;
$b=0;
if($border)
{
if($border==1)
{
$border='LTRB';
$b='LRT';
$b2='LR';
}
sonst
{
$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)
{
//Nächstes Zeichen abrufen
$c=$s[$i];
//Überprüfen Sie, ob ASCII oder MB
$ascii=(ord($c)<128);
if($c=="n"
{
//Expliziter Zeilenumbruch
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;
weiter;
}
if(!$ascii)
{
$sep=$i;
$ls=$l;
}
elseif($c=='')
{
$sep=$i;
$ls=$l;
$ns ;
}
$l =$ascii ? $cw[$c] : 1000;
if($l>$wmax)
{
//Automatischer Zeilenumbruch
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);
}
sonst
{
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;
}
sonst
$i =$ascii ? 1 : 2;
}
//Letzter Block
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;
}
Funktion Write($h,$txt,$link='')
{
if($this->CurrentFont['type']=='Type0')
$this->MBWrite($h,$txt,$link);
sonst
parent::Write($h,$txt,$link);
}
Funktion MBWrite($h,$txt,$link)
{
//Multibyte-Version von 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)
{
//Nächstes Zeichen abrufen
$c=$s[$i];
//Überprüfen Sie, ob ASCII oder MB
$ascii=(ord($c)<128);
if($c=="n"
{
//Expliziter Zeilenumbruch
$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 ;
weiter;
}
if(!$ascii oder $c=='')
$sep=$i;
$l =$ascii ? $cw[$c] : 1000;
if($l>$wmax)
{
//Automatischer Zeilenumbruch
if($sep==-1 or $i==$j)
{
if($this->x>$this->lMargin)
{
//Gehe zur nächsten Zeile
$this->x=$this->lMargin;
$this->y =$h;
$w=$this->w-$this->rMargin-$this->x;
$wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
$i ;
$nl ;
weiter;
}
if($i==$j)
$i =$ascii ? 1 : 2;
$this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link);
}
sonst
{
$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 ;
}
sonst
$i =$ascii ? 1 : 2;
}
//Letzter Block
if($i!=$j)
$this->Cell($l/1000*$this->FontSize,$h,substr($s,$j,$i-$j),0,0,'',0,$link);
}
Funktion _putfonts()
{
$nf=$this->n;
foreach($this->diffs as $diff)
{
//Kodierungen
$this->_newobj();
$this->_out('<>');
$this->_out('endobj');
}
$mqr=get_magic_quotes_runtime();
set_magic_quotes_runtime(0);
foreach($this->FontFiles as $file=>$info)
{
//Einbettung von Schriftartdateien
$this->_newobj();
$this->FontFiles[$file]['n']=$this->n;
if(definiert('FPDF_FONTPATH'))
$file=FPDF_FONTPATH.$file;
$size=filesize($file);
if(!$size)
$this->Error('Schriftartdatei nicht gefunden');
$this->_out('<
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)
{
//Schriftobjekte
$this->_newobj();
$this->fonts[$k]['n']=$this->n;
$this->_out('<
if($font['type']=='Type0')
$this->_putType0($font);
sonst
{
$name=$font['name'];
$this->_out('/BaseFont /'.$name);
if($font['type']=='core')
{
//Standardschriftart
$this->_out('/Subtype /Type1');
if($name!='Symbol' and $name!='ZapfDingbats')
$this->_out('/Encoding /WinAnsiEncoding');
}
sonst
{
//Zusätzliche Schriftart
$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');
sonst
$this->_out('/Encoding /WinAnsiEncoding');
}
}
$this->_out('>>');
$this->_out('endobj');
if($font['type']!='core')
{
//Breiten
$this->_newobj();
$cw=&$font['cw'];
$s='[';
for($i=32;$i<=255;$i )
$s.=$cw[chr($i)].' ';
$this->_out($s.']');
$this->_out('endobj');
//Deskriptor
$this->_newobj();
$s='<
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');
}
}
}
}
Funktion _putType0($font)
{
//Typ0
$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('<
$this->_out('/Subtype /CIDFontType0');
$this->_out('/BaseFont /'.$font['name']);
$this->_out('/CIDSystemInfo <>');
$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');
//Schriftartbeschreibung
$this->_newobj();
$this->_out('<
$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');
}
}
?>
Speichern Sie den obigen Code als Referenz als chinese.php. Allerdings kann man damit nur eine Schriftart erhalten. Um alle chinesischen Schriftarten zu unterstützen, kann das Programm ttf2pt1 verwendet werden, um TrueType-Schriftarten nacheinander in pt1-Schriftarten zu konvertieren (die spezifische Methode wird im FPDF-Tutorial detailliert beschrieben). Um andere chinesische Schriftarten zu unterstützen, müssen Sie die obige chinese.php wie folgt ändern:
1: Ersetzen Sie die folgende Zeile in der AddGBFont()-Methode:
Funktion AddGBFont($family='GB',$name='STSongStd-Light-Acro')
{
$cw=$GLOBALS['GB_widths'];
// $name='STSongStd-Light-Acro';
$CMap='GBKp-EUC-H';
........
2: Dies ist ein Beispiel.
$pdf=new PDF_Chinese();
$pdf->AddGBFont('simsun','宋体');
$pdf->AddGBFont('simhei','黑体');
$pdf->AddGBFont('simkai','楷体_GB2312');
$pdf->AddGBFont('sinfang','Imitation Song Dynasty_GB2312'');
$pdf->Open();
$pdf->AddPage();
$pdf->SetFont('simsun','',20);
$pdf->Write(10,'Vereinfachte chinesische Schriftzeichen');
$pdf->SetFont('simhei','',20);
$pdf->Write(10,'Vereinfachte chinesische Schriftzeichen');
$pdf->SetFont('simkai','',20);
$pdf->Write(10,'Vereinfachte chinesische Schriftzeichen');
$pdf->SetFont('sinfang','',20);
$pdf->Write(10,'Vereinfachte chinesische Schriftzeichen');
$pdf->Output();
?>
Das Obige stellt vor, wie man mit PHP chinesische PDF-Dokumente erstellt, einschließlich der relevanten Inhalte. Ich hoffe, dass es für Freunde hilfreich ist, die sich für PHP-Tutorials interessieren.