使用 WriteHTML FPDF 调整文本

问题描述 投票:0回答:3

问题:我正在尝试使用 FPDF 制作 pdf,就像下面文档的这一部分(我需要带有 html 标签和对齐文本的 pdf):

标题:Lorem ipsum dolor sat amet,consectetur adipiscing elit。骚扰他的人生。 Nulla pellentesque et enim non pulvinar。整数妊娠 ullamcorper totortor in dignissim。 Fusce gravida faucibus ultricies。 Morbi pulvinar nibh nec magna Tincidunt dignissim。 Cras faucibus condimentum pharetra。

标题:Lorem ipsum dolor sat amet,consectetur adipiscing elit。骚扰他的人生。 Nulla pellentesque et enim non pulvinar。整数妊娠 ullamcorper totortor in dignissim。 Fusce gravida faucibus ultricies。 Morbi pulvinar nibh nec magna Tincidunt dignissim。 Cras faucibus condimentum pharetra。 ....

我可以使用标签“B”、“P”、“BR”...或对齐对齐,但不能使用这两件事。

使用这两个脚本,FPDF Script41FPDF Script42,html标签工作正常,但我不能把align = justify。 使用此脚本http://fpdf.de/downloads/addons/8/我无法使用HTML标签,因为他使用“Cell”和“MultiCell”。

php html tags fpdf text-justify
3个回答
2
投票

当我遇到你的问题时,我遇到了同样的问题,并且正在寻找解决方案。既然我解决了,你也可以得到解决方案:)

问题在于 Write() 调用 Cell() 而 Cell() 不支持 $align='J'。

我找到了这个解决方案fpdf addon,它将 Justify 添加到 Cell() 函数中。我将此代码与我的 Cell() 函数进行了比较,因为版本略有不同,并且仅使用了添加对齐位的相关部分。

然后我在你提到的FPDF Script42中遵循这个函数并添加了一个

$align=''

Write() 函数的参数。然后添加它,以便将 $align 发送到 Cell 调用。我实际上不确定是否添加了 $align 还是原来就在那里(我做了很多更改,我不记得了)。然后只需将“FJ”传递给您的 Write() 调用,这将被发送以告诉 Cell() 进行调整。

$this->Write(5,stripslashes(txtentities($e)),'FJ');

0
投票

根据@yusuf-moola的回答,这里有两种方法:

细胞

function Cell($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link=''){
    $k=$this->k;
    if($this->y+$h>$this->PageBreakTrigger && !$this->InHeader && !$this->InFooter && $this->AcceptPageBreak()){
        $x=$this->x;
        $ws=$this->ws;
        if($ws>0){
            $this->ws=0;
            $this->_out('0 Tw');
        }
        $this->AddPage($this->CurOrientation);
        $this->x=$x;
        if($ws>0){
            $this->ws=$ws;
            $this->_out(sprintf('%.3F Tw',$ws*$k));
        }
    }
    if($w==0)
        $w=$this->w-$this->rMargin-$this->x;
    $s='';
    if($fill || $border==1){
        if($fill)
            $op=($border==1) ? 'B' : 'f';
        else
            $op='S';
        $s=sprintf('%.2F %.2F %.2F %.2F re %s ',$this->x*$k,($this->h-$this->y)*$k,$w*$k,-$h*$k,$op);
    }
    if(is_string($border)){
        $x=$this->x;
        $y=$this->y;
        if(is_int(strpos($border,'L')))
            $s.=sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-$y)*$k,$x*$k,($this->h-($y+$h))*$k);
        if(is_int(strpos($border,'T')))
            $s.=sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-$y)*$k);
        if(is_int(strpos($border,'R')))
            $s.=sprintf('%.2F %.2F m %.2F %.2F l S ',($x+$w)*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-($y+$h))*$k);
        if(is_int(strpos($border,'B')))
            $s.=sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-($y+$h))*$k,($x+$w)*$k,($this->h-($y+$h))*$k);
    }
    if($txt!=''){
        if($align=='R')
            $dx=$w-$this->cMargin-$this->GetStringWidth($txt);
        elseif($align=='C')
            $dx=($w-$this->GetStringWidth($txt))/2;
        elseif($align=='FJ'){
            //Set word spacing
            $wmax=($w-2*$this->cMargin);
            $nb=substr_count($txt,' ');
            if($nb>0)
                $this->ws=($wmax-$this->GetStringWidth($txt))/$nb;
            else
                $this->ws=0;
            $this->_out(sprintf('%.3F Tw',$this->ws*$this->k));
            $dx=$this->cMargin;
        }
        else
            $dx=$this->cMargin;
        $txt=str_replace(')','\\)',str_replace('(','\\(',str_replace('\\','\\\\',$txt)));
        if($this->ColorFlag)
            $s.='q '.$this->TextColor.' ';
        $s.=sprintf('BT %.2F %.2F Td (%s) Tj ET',($this->x+$dx)*$k,($this->h-($this->y+.5*$h+.3*$this->FontSize))*$k,$txt);
        if($this->underline)
            $s.=' '.$this->_dounderline($this->x+$dx,$this->y+.5*$h+.3*$this->FontSize,$txt);
        if($this->ColorFlag)
            $s.=' Q';
        if($link){
            if($align=='FJ')
                $wlink=$wmax;
            else
                $wlink=$this->GetStringWidth($txt);
            $this->Link($this->x+$dx,$this->y+.5*$h-.5*$this->FontSize,$wlink,$this->FontSize,$link);
        }
    }
    if($s)
        $this->_out($s);
    if($align=='FJ'){
        //Remove word spacing
        $this->_out('0 Tw');
        $this->ws=0;
    }
    $this->lasth=$h;
    if($ln>0){
        $this->y+=$h;
        if($ln==1)
            $this->x=$this->lMargin;
    }
    else
        $this->x+=$w;
}

function Write($h, $txt, $link='', $align=''){
    // Output text in flowing mode
    if(!isset($this->CurrentFont))
    $this->Error('No font has been set');
    $cw = &$this->CurrentFont['cw'];
    $w = $this->w-$this->rMargin-$this->x;
    $wmax = ($w-2*$this->cMargin);
    $s = str_replace("\r",'',(string)$txt);
    if ($this->unifontSubset) {
        $nb = mb_strlen($s, 'UTF-8');
        if($nb==1 && $s==" ") {
            $this->x += $this->GetStringWidth($s);
            return;
        }
    }
    else {
        $nb = strlen($s);
    }
    $sep = -1;
    $i = 0;
    $j = 0;
    $l = 0;
    $nl = 1;
    while($i<$nb){
        // Get next character
        if ($this->unifontSubset) {
            $c = mb_substr($s,$i,1,'UTF-8');
        }
        else {
            $c = $s[$i];
        }
        if($c=="\n"){
            // Explicit line break
            if ($this->unifontSubset) {
                $this->Cell($w,$h,mb_substr($s,$j,$i-$j,'UTF-8'),0,2,$align,false,$link);
            }
            else {
                $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,$align,false,$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);
            }
            $nl++;
            continue;
        }
        if($c==' ')
        $sep = $i;

        if ($this->unifontSubset) { $l += $this->GetStringWidth($c); }
        else { $l += $cw[$c]*$this->FontSize/1000; }

        if($l>$wmax){
            // Automatic line break
            if($sep==-1){
                if($this->x>$this->lMargin){
                    // Move to next line
                    $this->x = $this->lMargin;
                    $this->y += $h;
                    $w = $this->w-$this->rMargin-$this->x;
                    $wmax = ($w-2*$this->cMargin);
                    $i++;
                    $nl++;
                    continue;
                }
                if($i==$j)
                $i++;
                if ($this->unifontSubset) {
                    $this->Cell($w,$h,mb_substr($s,$j,$i-$j,'UTF-8'),0,2,$align,false,$link);
                }
                else {
                    $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,$align,false,$link);
                }
            }
            else{
                if ($this->unifontSubset) {
                    $this->Cell($w,$h,mb_substr($s,$j,$sep-$j,'UTF-8'),0,2,$align,false,$link);
                }
                else {
                    $this->Cell($w,$h,substr($s,$j,$sep-$j),0,2,$align,false,$link);
                }
                $i = $sep+1;
            }
            $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);
            }
            $nl++;
        }
        else
        $i++;
    }
    // Last chunk
    if($i!=$j) {
        if ($this->unifontSubset) {
            $this->Cell($l,$h,mb_substr($s,$j,$i-$j,'UTF-8'),0,0,$align,false,$link);
        }
        else {
            $this->Cell($l,$h,substr($s,$j),0,0,$align,false,$link);
        }
    }
}

编写HTML

function WriteHTML($html, $h=4.5, $align='')   {
    // $html=utf8_decode($html);
    $a=preg_split('/<(.*)>/U',$html,-1,PREG_SPLIT_DELIM_CAPTURE);
    foreach($a as $i=>$e)
    {
        if($i%2==0)
        {
            //Texte
            if($this->HREF)
                $this->PutLink($this->HREF,$e);
            else
                $this->Write( $h, $e, '', $align);
        }
        else
        {
            //Balise
            if($e[0]=='/')
                $this->CloseTag(strtoupper(substr($e,1)));
            else
            {
                //Extraction des attributs
                $a2=explode(' ',$e);
                $tag=strtoupper(array_shift($a2));
                $prop=array();
                foreach($a2 as $v)
                {
                    if(preg_match('/([^=]*)=["\']?([^"\']*)/',$v,$a3))
                        $prop[strtoupper($a3[1])]=$a3[2];
                }
                $this->OpenTag($tag,$prop);
            }
        }
    }
}

script42

的其余部分一起为我工作

-4
投票

解决方案:

我认为你需要这个:“基于标签的格式”

在:fpdf.org/en/script/script23.php

© www.soinside.com 2019 - 2024. All rights reserved.