Επικάλυψη θέμα με τους πίνακες που χρησιμοποιούν τη βιβλιοθήκη FPDF

ψήφοι
0

Δουλεύω για ένα έργο web PHP χρησιμοποιώντας βιβλιοθήκη FPDF, η οποία είναι μια χαρά εργασίας. Διαρκές καθήκον μου είναι να εισάγετε έναν πίνακα στο παράγονται σελίδα pdf. Δεδομένου ότι χρειάζεται για την έξοδο του πίνακα με συγκεκριμένο τρόπο (δείτε την εικόνα παρακάτω), είναι ότι είναι πολύ δύσκολο να χρησιμοποιηθούν τα υπάρχοντα σενάρια μπορεί κανείς να βρει εδώ: http://www.fpdf.org/fr/script/index.php . Είμαι με τη χρήση των κατηγοριών που προβλέπονται στο σύνδεσμο ως χαρακτηριστικά στην τάξη μου έθιμο PDF.

εισάγετε

colonne (γαλλικά) = στήλης (Αγγλικά) / ligne = γραμμής

  • Με το σενάριο «Πίνακες HTML» (γραμμένο από τον Azeem Αμπάς), ήμουν σε θέση να εξάγει ο πίνακας στο σωστό τρόπο (δείτε την εικόνα παρακάτω), αλλά δεν μπορούσε να καταφέρει να χειριστεί τα περιθώρια, πλάτος και άλλες ιδιότητες HTML. εισάγετε
  • Με το «Τραπέζι με MySQL» σενάριο, δεν υπάρχει τρόπος να φωτεινότητά δεδομένων ακριβώς τρόπο που το έκανε με το σενάριο «πίνακες HTML». Έχω προσπαθήσει να ξαναγράψει τον πίνακα και Row λειτουργία, αλλά θα μπορούσε να πάρει καλό αποτέλεσμα.
  • Και στις δύο περιπτώσεις έχω συναντήσει θέμα επικάλυψη κειμένου whenener έχω αρκετά μεγάλο κείμενο στα κύτταρα. Προσπάθησα λειτουργία πολλών στοιχείων, αυτό που προκαλεί τα κύτταρα να συσσωρεύονται.

εισάγετε

Εδώ είναι ο κώδικας είμαι με τη χρήση:

Οποιεσδήποτε ιδέες για μια βιβλιοθήκη που μπορεί να με βοηθήσει να πάρετε ένα τραπέζι html εσωτερική σελίδα pdf με θέμα επικάλυψη και τη δυνατότητα να αλλάξετε τον πίνακα ιδιοτήτων html;

Δημοσιεύθηκε 09/10/2019 στις 18:02
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
0

Ήμουν σε θέση να παράγει ένα πίνακα με τον σωστό τρόπο ξαναγράφοντας τον κώδικα διαθέσιμο εδώ, ώστε να ταιριάζει στην ιδιαιτερότητα του πλαισίου μου: fpdf.org/en/script/script14.php. Παρακάτω είναι αυτό που έκανα.

  1. Δημιούργησα το ακόλουθο χαρακτηριστικό, το οποίο θα χρησιμοποιηθεί στο εσωτερικό της κατηγορίας PDF:

    <?php
    
    trait PDF_SQL_Table
    {
    protected $aCols=array();
    protected $TableX;
    protected $HeaderColor;
    protected $RowColors;
    protected $ColorIndex;
    
    /**
     * @return void
     */
    function TableHeader()
    {
        $this->SetFont('Arial','B',10);
        $this->SetTextColor(0); ## Couleur de police de caractères de l'en-tête du tableau
    
        ## Couleur de fond de l'en-tête du tableau
        $fill=!empty($this->HeaderColor);
        if($fill)
            $this->SetFillColor($this->HeaderColor[0],$this->HeaderColor[1],$this->HeaderColor[2]);
    }
    
    /**
     * @param array $tableData
     * @param $width
     * @param $align
     * @param $TableWidth
     * @param $key
     * @return float|int
     */
    function CalcWidths(array $tableData, $width, $align, $TableWidth, $key)
    {
        $w = $this->aCols[$key]['w'];
        if($w==-1)
            $w = $width/count($tableData);
        elseif(substr($w,-1) == '%')
            $w = $w/100 * $width;
        $this->aCols[$key]['w'] = $w;
        $TableWidth += $w;
    
        // Calcul de l'abscisse du tableau
        if($align=='C')
            $this->TableX=max(($this->w-$TableWidth)/2,0);
        elseif($align=='R')
            $this->TableX= $this->TableX=max($this->w-$this->rMargin-$TableWidth,0);//max($this->w-15-$TableWidth,0); //$this->TableX=max($this->w-$this->rMargin-$TableWidth,0);
        else
            $this->TableX=$this->lMargin;//15; // $this->TableX=$this->lMargin;
    
        return $w;
    }
    
    /**
     * @param int $field
     * @param int $width
     * @param string $caption
     * @param string $align
     */
    function AddCol($field=-1, $width=-1, $caption='', $align='L'): void
    {
        // Ajout d'une colonne du tableau
        if($field == -1)
            $field = count($this->aCols);
        $this->aCols[$field]=array('f'=>$field,'c'=>$caption,'w'=>$width,'a'=>$align);
    }
    
    /**
     * @param array $table
     * @param array $prop
     * @param array $array_paragraphes
     * @param float $interligne
     * @param array $excludedParagraphs
     * @param $dec
     */
    function TableAndParagraphs(array $table = array(), array $prop=array(), array $array_paragraphes, float $interligne, array $excludedParagraphs, $dec): void
    {
        foreach ($array_paragraphes as $ordre => $paragraphe) {
            ### $this->Ln(10); En activant ceci à cet endroit précis, un des tableaux s'affiche sur plusieurs pages de façon discontinue
            ###  Insertion d'un tableau au dessous du paragraphe correspondant à ordre_texte_saisi = $table['pos_paragr_prec']
            ### Utilisation d'une extension de la librairie FPDF disponible ici (que nous avons personnalisée) : http://www.fpdf.org/?go=script&id=14
    
            $counter = 0;
            foreach ($table as $num_tableau => $donnees_tableau) {
                ## Insertion d'un tableau au dessous du paragraphe correspondant à ordre_texte_saisi = $table['pos_paragr_prec']
                ## Utilisation d'une extension de la librairie FPDF disponible ici : http://www.fpdf.org/?go=script&id=14
                // Gestion des propriétés
                if(!isset($prop['width']))
                    $prop['width']=0;
                if($prop['width']==0)
                    $prop['width']= $this->w-$this->lMargin-$this->rMargin;//$this->w-15-15; //($this->lMargin = 15 / $this->rMargin = 15  cf. plus haut)
                if(!isset($prop['align']))
                    $prop['align']='C';
                if(!isset($prop['padding']))
                    $prop['padding']=$this->cMargin;
                $cMargin=$this->cMargin;
                $this->cMargin=$prop['padding'];
                if(!isset($prop['HeaderColor']))
                    $prop['HeaderColor']=array();
                $this->HeaderColor=$prop['HeaderColor'];
                if(!isset($prop['color1']))
                    $prop['color1']=array();
                if(!isset($prop['color2']))
                    $prop['color2']=array();
                $this->RowColors=array($prop['color1'],$prop['color2']);
    
                $this->ColorIndex = 0;
    
                if ($ordre === ($table[$num_tableau]['pos_paragr_prec'])) {
                    $excludedParagraphs[] = $ordre;
                    ### $this->Ln(10); En activant ceci un des tableaux s'affiche sur plusieurs pages de façon discontinue
                    $paragraphe = html_entity_decode($paragraphe, ENT_HTML5, "UTF-8");
                    $this->MultiCell(0,$interligne,$paragraphe);
                    ### $this->Ln($dec);  En activant ceci, à partir de la 2ème ligne du tableau l'affichage se fait sur plusieurs pages avec une cellule par page
    
                    if (count($table) > 0) {
                        $this->Ln(10); ### Un espace vertical avant d'afficher le tableau
                        if (is_array($donnees_tableau) && count($donnees_tableau) > 0) {
    
                            $iteration = 0; ### indice d'itération sur les tableaux
                            $TableWidth=0;
                            foreach ($donnees_tableau as $key => $value) { ### Début d'affichage d'un tableau
    
                                ### Si la hauteur h = 20 provoque un débordement, on effectue un saut de page manuel
                                ### $this->Ln(0);  juste un test : activer ceci donne une idée sur le traitement ligne par ligne (ceci produit une nette séparation entre les lignes)
    
                                $this->CheckPageBreak(10);// ceci permet de pouvoir afficher un tableau sur 2 ou plusieurs pages
                                $this->SetX(15);// On décale le tableau vers la droite de 18 unités (en argument de la fonction SetX()). Permet de déplacer le tableau horizontalement
    
                                $number = 0; // Itération sur les données du tableau
    
                                foreach($value as $key2 => $val) {
    
                                    foreach($val as $k => $col) {
                                        // Ajout dynamique d'une colonne au tableau
                                        $this->AddCol($key2, -1, '', 'R');
                                        // Calcul dynamique de la largeur de la colonne
                                        $w = $this->CalcWidths($value, $prop['width'], 'L', $TableWidth, $key2);
    
                                        $ci = $this->ColorIndex;
                                        $fill=!empty($this->RowColors[$ci]);
                                        if($fill)
                                            $this->SetFillColor($this->RowColors[$ci][0],$this->RowColors[$ci][1],$this->RowColors[$ci][2]);
    
                                        $this->SetFont('Arial','',9); // Police de caractère pour les tableaux
    
                                        if (is_numeric($donnees_tableau[$key][$key2][$k])) {
                                            $cellData = number_format($donnees_tableau[$key][$key2][$k], 2, ',',' ');
                                            $alignRight = true;
                                        } elseif (substr($donnees_tableau[$key][$key2][$k], -1) == '%') {
                                            $cellData = number_format($donnees_tableau[$key][$key2][$k], 2, ',',' ').'%';
                                            $alignRight = true;
                                        } elseif (preg_match('/^[0-9+-]{1,3}(\s|,)[0-9]{1,3}\s?[0-9]{0,3},?[0-9]{0,2}/', $donnees_tableau[$key][$key2][$k])) {
                                            $cellData = $donnees_tableau[$key][$key2][$k];
                                            $alignRight = true;
                                        } elseif (preg_match('/[0-9]{1,3},[0-9]{3}\.?[0-9]{0,2}/', $donnees_tableau[$key][$key2][$k])) {
                                            $cellData = str_replace(',', ' ', $donnees_tableau[$key][$key2][$k]);
                                            $cellData = str_replace('.', ',', $cellData);
                                            $alignRight = true;
                                        } elseif (preg_match('/^([0-9]{1,2})\/([0-9]{1,2})\/([0-9]{2,4})$/', $donnees_tableau[$key][$key2][$k])) {
                                            //$cellData = preg_replace('/^([0-9]{1,2})\/([0-9]{1,2})\/([0-9]{2,4})$/', "$2/$1/$3", $donnees_tableau[$key][$key2][$k]);
                                            $cellData = date_create($donnees_tableau[$key][$key2][$k]);
                                            $cellData = date_format($cellData, "d/m/Y");
                                            $alignRight = false;
                                        } else {
                                            $cellData = $donnees_tableau[$key][$key2][$k];
                                            $alignRight = false;
                                        }
    
                                        $x=$this->GetX();
                                        $y=$this->GetY();
    
                                        ## On évite qu'il y ait des Multicells de hauteur inférieure à celle du Cell suivant sur la même ligne
                                        if ($this->GetStringWidth($donnees_tableau[$key][$key2][$k]) < $w && $key2 == '0' /*&& $key >= '1'*/) {
                                            $spaces = "\n"." "; // Espace insécable : "&#160;"
                                            $cellData .= $spaces;
                                        }
    
                                        ## Mise en forme du header (police de caractère et couleur de l'arrière-plan)
                                        if ($key == '0') {
                                            $this->TableHeader();
                                        } else {
                                            $this->SetTextColor(0);
                                        }
    
    
                                        $this->SetDrawColor(0); ### couleur de la bordure des cellule du tableau : valeur de 0 (noir) à 255 (blanc)
                                        if ($this->GetStringWidth($donnees_tableau[$key][$key2][$k]) > $w || $key2 === 'A' || $key2 == '0') {
                                            $this->MultiCell($w,5,$cellData,1,'L',$fill);
                                            $newY = $this->GetY();
                                            $this->SetXY($x + $w, $y);
                                        } else {
                                            $H = $newY - $y;
                                            if ($alignRight) {
                                                $this->Cell($w, $H,$cellData,1,1,'R',$fill);
                                            } else {
                                                $this->Cell($w, $H,$cellData,1,1,'C',$fill);
                                            }
                                        }
    
                                        $this->SetFont('Arial','',11);
                                        $this->SetDrawColor(0);
                                        $this->SetXY($x+$w,$y);
                                    }
                                    $number++;
                                }// affichage d'une ligne entière
    
                                if ($iteration == 1) {
                                    $this->Ln(0); ###### 3 : valeur représentant l'écart entre le header du tableau et le corps du tableau
                                } else {
                                    $this->Ln($H);
                                }
    
                                // Retour à la ligne afin d'afficher la ligne suivante du tableau
                                $this->ColorIndex = 1-$ci;
    
                                $iteration++;
    
                            }// Un tableau entier est affiché
    
                        }
                    }
                }//if ($ordre === ($table[$num_tableau]['pos_paragr_prec']))
    
                //Espace entre le premier tableau et le paragraphe en dessous
                if ($counter == 0) {
                    $this->Ln(5.5);
                }
    
                //Empêcher qu'un paragraphe ne s'affiche plusieurs fois
                if ($counter == count($table) - 1) {
    
                    //Les paragraphes liés à des tableaux ont été déjà affichés
                    if (!in_array($ordre, $excludedParagraphs)) {
                        $this->Ln(5.5);// Espace entre un tableau et le paragraphe en dessous (premier tableau exclus)
                        $paragraphe = html_entity_decode($paragraphe, ENT_HTML5, "UTF-8");
                        $this->MultiCell(0,$interligne,$paragraphe);
                        $this->Ln($dec);
                    }
                }
    
                $counter++;
            }
        }
    }
    }
    
  2. Κατηγορία PDF:

    class PDF extends TFPDF
    {
        protected $B = 0;
        protected $I = 0;
        protected $U = 0;
        protected $HREF = '';
    
        use PDF_MC_Table, PDF_SQL_Table;
    
        function Entete() {
    
        }
    
        function Footer() {
           //some code
        }
    
        //etc.
    
    }
    
  3. Στο χειριστήριο, θα μπορούσαμε να ονομάσουμε TableAndParagraphs () λειτουργούν με αυτόν τον τρόπο:

    $pdf->TableAndParagraphs($table, $prop, $array_paragraphes, $interligne, $excludedParagraphs, $dec);
    

    Σημειώστε ότι TFPDF είναι μια βιβλιοθήκη που βασίζεται σε FPDF (μπορεί να βρεθεί στο διαδίκτυο):

    
    <?php
    /*******************************************************************************
    * tFPDF (based on FPDF 1.7)                                                    *
    *                                                                              *
    * Version:  1.24                                                               *
    * Date:     2011-09-24                                                         *
    * Author:   Ian Back <ianb@bpm1.com>                                           *
    * License:  LGPL                                                               *
    *******************************************************************************/
    
    define('tFPDF_VERSION','1.24');
    
    class tFPDF
    {
    
    var $unifontSubset;
    var $page;               // current page number
    var $n;                  // current object number
    var $offsets;            // array of object offsets
    var $buffer;             // buffer holding in-memory PDF
    var $pages;              // array containing pages
    var $state;              // current document state
    var $compress;           // compression flag
    var $k;                  // scale factor (number of points in user unit)
    var $DefOrientation;     // default orientation
    var $CurOrientation;     // current orientation
    var $StdPageSizes;       // standard page sizes
    var $DefPageSize;        // default page size
    var $CurPageSize;        // current page size
    var $PageSizes;          // used for pages with non default sizes or orientations
    var $wPt, $hPt;          // dimensions of current page in points
    var $w, $h;              // dimensions of current page in user unit
    var $lMargin;            // left margin
    var $tMargin;            // top margin
    var $rMargin;            // right margin
    var $bMargin;            // page break margin
    var $cMargin;            // cell margin
    var $x, $y;              // current position in user unit
    var $lasth;              // height of last printed cell
    var $LineWidth;          // line width in user unit
    var $fontpath;           // path containing fonts
    var $CoreFonts;          // array of core font names
    var $fonts;              // array of used fonts
    var $FontFiles;          // array of font files
    var $diffs;              // array of encoding differences
    var $FontFamily;         // current font family
    var $FontStyle;          // current font style
    var $underline;          // underlining flag
    var $CurrentFont;        // current font info
    var $FontSizePt;         // current font size in points
    var $FontSize;           // current font size in user unit
    var $DrawColor;          // commands for drawing color
    var $FillColor;          // commands for filling color
    var $TextColor;          // commands for text color
    var $ColorFlag;          // indicates whether fill and text colors are different
    var $ws;                 // word spacing
    var $images;             // array of used images
    var $PageLinks;          // array of links in pages
    var $links;              // array of internal links
    var $AutoPageBreak;      // automatic page breaking
    var $PageBreakTrigger;   // threshold used to trigger page breaks
    var $InHeader;           // flag set when processing header
    var $InFooter;           // flag set when processing footer
    var $ZoomMode;           // zoom display mode
    var $LayoutMode;         // layout display mode
    var $title;              // title
    var $subject;            // subject
    var $author;             // author
    var $keywords;           // keywords
    var $creator;            // creator
    var $AliasNbPages;       // alias for total number of pages
    var $PDFVersion;         // PDF version number
    
    /*******************************************************************************
    *                                                                              *
    *                               Public methods                                 *
    *                                                                              *
    *******************************************************************************/
    
    
    function __construct($orientation='P', $unit='mm', $size='A4')
    {
        // Some checks
        $this->_dochecks();
        // Initialization of properties
        $this->page = 0;
        $this->n = 2;
        $this->buffer = '';
        $this->pages = array();
        $this->PageSizes = array();
        $this->state = 0;
        $this->fonts = array();
        $this->FontFiles = array();
        $this->diffs = array();
        $this->images = array();
        $this->links = array();
        $this->InHeader = false;
        $this->InFooter = false;
        $this->lasth = 0;
        $this->FontFamily = '';
        $this->FontStyle = '';
        $this->FontSizePt = 12;
        $this->underline = false;
        $this->DrawColor = '0 G';
        $this->FillColor = '0 g';
        $this->TextColor = '0 g';
        $this->ColorFlag = false;
        $this->ws = 0;
        // Font path
        if(defined('FPDF_FONTPATH'))
        {
            $this->fontpath = FPDF_FONTPATH;
            if(substr($this->fontpath,-1)!='/' && substr($this->fontpath,-1)!='\\')
                $this->fontpath .= '/';
        }
        elseif(is_dir(dirname(__FILE__).'/font'))
            $this->fontpath = dirname(__FILE__).'/font/';
        else
            $this->fontpath = '';
        // Core fonts
        $this->CoreFonts = array('courier', 'helvetica', 'times', 'symbol', 'zapfdingbats');
        // Scale factor
        if($unit=='pt')
            $this->k = 1;
        elseif($unit=='mm')
            $this->k = 72/25.4;
        elseif($unit=='cm')
            $this->k = 72/2.54;
        elseif($unit=='in')
            $this->k = 72;
        else
            $this->Error('Incorrect unit: '.$unit);
        // Page sizes
        $this->StdPageSizes = array('a3'=>array(841.89,1190.55), 'a4'=>array(595.28,841.89), 'a5'=>array(420.94,595.28),
            'letter'=>array(612,792), 'legal'=>array(612,1008));
        $size = $this->_getpagesize($size);
        $this->DefPageSize = $size;
        $this->CurPageSize = $size;
        // Page orientation
        $orientation = mb_strtolower($orientation); // 20160707 ajout mb_
        if($orientation=='p' || $orientation=='portrait')
        {
            $this->DefOrientation = 'P';
            $this->w = $size[0];
            $this->h = $size[1];
        }
        elseif($orientation=='l' || $orientation=='landscape')
        {
            $this->DefOrientation = 'L';
            $this->w = $size[1];
            $this->h = $size[0];
        }
        else
            $this->Error('Incorrect orientation: '.$orientation);
        $this->CurOrientation = $this->DefOrientation;
        $this->wPt = $this->w*$this->k;
        $this->hPt = $this->h*$this->k;
        // Page margins (1 cm)
        $margin = 28.35/$this->k;
        $this->SetMargins($margin,$margin);
        // Interior cell margin (1 mm)
        $this->cMargin = $margin/10;
        // Line width (0.2 mm)
        $this->LineWidth = .567/$this->k;
        // Automatic page break
        $this->SetAutoPageBreak(true,2*$margin);
        // Default display mode
        $this->SetDisplayMode('default');
        // Enable compression
        $this->SetCompression(true);
        // Set default PDF version number
        $this->PDFVersion = '1.3';
    }
    
    //etc.
    
    }
    
    
Απαντήθηκε 02/01/2020 στις 11:30
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more