我一直在玩FPDF并且需要使用起始模板PDF创建PDF,以便设法使用FPDI来解决这个问题。然后我需要使用非标准字体,我设法也可以使用。然而......字母间距全部搞砸了(有些字母紧密相连,其他字母间隔相同的单词)。
我找到了FPDF_CellFit的附加解决方案,但该类扩展了FPDF,那么在使用FPDI时如何才能使其工作?这是我的代码:
$pdf =& new FPDI();
$pdf->AddFont('AgencyFB-Reg','','agencyfbb.php');
$pdf->AddPage('mm', array(54,92));
$pdf->setSourceFile('test.pdf');
$tplIdx = $pdf->importPage(1);
$pdf->useTemplate($tplIdx, 0, 0, 92);
$pdf->SetFont('AgencyFB-Reg','',14);
$pdf->SetXY(100, 27);
$pdf->Write(0, "testing");
$pdf->Output();
但如上所述,当我查看FPDF_CellFit类时,它会以这种方式启动:
$pdf = new FPDF_CellFit();
class FPDF_CellFit extends FPDF {
... ... ...
}
请帮忙......我太近了!
答案 0 :(得分:0)
我已经制作了一个包来解决这个问题。您必须始终保持相同的PDF。所以当你为它添加一些效果时,它必须始终是相同的。
事实上,装饰器模式是一种很好的方法。
装饰者类
<?php
abstract class DecoratorPdf extends \FPDF {
protected $pdf;
public function __construct(\FPDF $pdf) {
$this->pdf = $pdf;
}
}
我已经把这个类裂开了像这样的对象
<?php
class FPDF_CellFit extends \DecoratorPdf {
//Cell with horizontal scaling if text is too wide
function CellFit($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='', $scale=false, $force=true)
{
//Get string width
$str_width=$this->pdf->GetStringWidth($txt);
//Calculate ratio to fit cell
if($w==0)
$w = $this->pdf->w-$this->pdf->rMargin-$this->x;
$ratio = ($w-$this->pdf->cMargin*2)/$str_width;
$fit = ($ratio < 1 || ($ratio > 1 && $force));
..
所以现在当你使用它时,你创建了一个扩展FPDF的PDF类。所以pdf将被创建,你可以调用cellfit类来扩展装饰器类并在构造函数中添加你的PDF。所以你一直保持相同的PDF格式。
实施例
class Pdf extends \FPDI
{
//Fonction qui représente une zone ciblée concernant le code postale de l'adresse du destinataire
function destinataireCodePostal($string)
{
// Helvetica 12
$this->SetFont('Helvetica',"",10);
//PdfDraw enrichie avec la pattern Decorator mon PDF
$cellfit = new \FPDF_CellFit($this);
//Position du code poste
$this->SetXY(102, 67.3);
//Permet d'espacer les lettres de manière égale
$cellfit->CellFitSpaceForce(15.5, 10, utf8_decode($string), 0, 0, 'l', 0);
//Retour à la police normal
$this->mainFont();
}
与作曲家一起使用,座位项目将是自动加载器
"require": {
"php": ">=5.3.3",
"setasign/fpdi-fpdf": "1.5.4"
},
"autoload": {
"classmap": [
"lib/draw/draw.php",
"lib/cellfit/cellfit.php",
"lib/DecoratorPdf.php"
]
}
示例的完整包就在这里,在lib文件夹中,我已经在这个对象模式中进行了draw和cellfit。