2015-06-09 1 views
0

Я играл с FPDF и вам нужно создать PDF-файл, используя начальный шаблон PDF, поэтому ему удалось получить это, используя FPDI. Затем мне нужно было использовать нестандартный шрифт, который мне тоже удалось получить. Однако ... разброс букв все испорчен (некоторые буквы плотно соединены друг с другом, другие расположены далеко друг от друга в одних и тех же словах).Как использовать FPDF_CellFit с 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

Вы читали [FAQ # 14] (http://fpdf.org/en/FAQ.php#q14)? –

+0

Да, но это еще не ясно, поскольку этот пример объединяет два класса, которые в ином случае расширяют один и тот же класс. В этом случае это 2 класса, каждый из которых расширяет другой класс. Я могу представить, что это вопрос чего-то подобного, но славы пока нет. –

ответ

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)); 
     .. 

Так что теперь, когда вы используете его, вы создаете класс PDF, который проходит FPDF. Таким образом, 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 папку я сделал ничью и cellfit в этом объекте шаблон.

lib for cellfit in object

Смежные вопросы