如何将FPDF_CellFit与FPDI

时间:2015-06-09 00:18:43

标签: fpdf fpdi

我一直在玩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 {
... ... ...
}

请帮忙......我太近了!

1 个答案:

答案 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。

lib for cellfit in object