2

我正在使用 php 和 reportico 开发一个基于 Web 的报告应用程序。我想用波斯语(波斯语)制作报告,所以我需要更改 PDF 文件的方向(从左到右,到右到左)。是FPDF中对此有任何支持,或者在reportico中有任何解决方案吗?

4

2 回答 2

1

看到这个 URL 我认为它很有帮助。

http://www.fpdf.de/downloads/addons/31/

或者试试看。

描述:此扩展允许打印旋转和剪切(即像斜体一样扭曲)文本。

TextWithDirection(float x, float y, string txt [, string direction])

x:横坐标

y:纵坐标

txt:文本字符串

方向:以下值之一(默认为 R):

  • R(右):从左到右
  • U(上):从下到上
  • D(下):从上到下
  • L(左):从右到左

TextWithRotation(float x, float y, string txt, float txt_angle [, float font_angle])

x:横坐标

y:纵坐标

txt:文本字符串

txt_angle:文字的角度

font_angle:剪切角(默认为0)

资源

 <?php
require('fpdf.php');

class RPDF extends FPDF {

function TextWithDirection($x, $y, $txt, $direction='R')
{
    $txt=str_replace(')', '\\)', str_replace('(', '\\(', str_replace('\\', '\\\\', $txt)));
    if ($direction=='R')
        $s=sprintf('BT %.2f %.2f %.2f %.2f %.2f %.2f Tm (%s) Tj ET', 1, 0, 0, 1, $x*$this->k, ($this->h-$y)*$this->k, $txt);
    elseif ($direction=='L')
        $s=sprintf('BT %.2f %.2f %.2f %.2f %.2f %.2f Tm (%s) Tj ET', -1, 0, 0, -1, $x*$this->k, ($this->h-$y)*$this->k, $txt);
    elseif ($direction=='U')
        $s=sprintf('BT %.2f %.2f %.2f %.2f %.2f %.2f Tm (%s) Tj ET', 0, 1, -1, 0, $x*$this->k, ($this->h-$y)*$this->k, $txt);
    elseif ($direction=='D')
        $s=sprintf('BT %.2f %.2f %.2f %.2f %.2f %.2f Tm (%s) Tj ET', 0, -1, 1, 0, $x*$this->k, ($this->h-$y)*$this->k, $txt);
    else
        $s=sprintf('BT %.2f %.2f Td (%s) Tj ET', $x*$this->k, ($this->h-$y)*$this->k, $txt);
    if ($this->ColorFlag)
        $s='q '.$this->TextColor.' '.$s.' Q';
    $this->_out($s);
}

function TextWithRotation($x, $y, $txt, $txt_angle, $font_angle=0)
{
    $txt=str_replace(')', '\\)', str_replace('(', '\\(', str_replace('\\', '\\\\', $txt)));

    $font_angle+=90+$txt_angle;
    $txt_angle*=M_PI/180;
    $font_angle*=M_PI/180;

    $txt_dx=cos($txt_angle);
    $txt_dy=sin($txt_angle);
    $font_dx=cos($font_angle);
    $font_dy=sin($font_angle);

    $s=sprintf('BT %.2f %.2f %.2f %.2f %.2f %.2f Tm (%s) Tj ET',
             $txt_dx, $txt_dy, $font_dx, $font_dy,
             $x*$this->k, ($this->h-$y)*$this->k, $txt);
    if ($this->ColorFlag)
        $s='q '.$this->TextColor.' '.$s.' Q';
    $this->_out($s);
}

}

?> 

例子

 <?php
define('FPDF_FONTPATH', 'font/');
require('rpdf.php');

$pdf=new RPDF();
$pdf->Open();
$pdf->AddPage();
$pdf->SetFont('Arial', '', 40);
$pdf->TextWithRotation(50, 65, 'Hello', 45, -45);
$pdf->SetFontSize(30);
$pdf->TextWithDirection(110, 50, 'world!', 'L');
$pdf->TextWithDirection(110, 50, 'world!', 'U');
$pdf->TextWithDirection(110, 50, 'world!', 'R');
$pdf->TextWithDirection(110, 50, 'world!', 'D');
$pdf->Output();
?> 

输出:- http://www.fpdf.org/en/script/ex31.pdf

于 2012-09-02T07:23:49.537 回答
0

它可能不是提供的最佳解决方案,但您始终可以更改方法本身,因为它使用Cell方法(支持对齐),您只需在方法上执行 $align 参数,然后更改所有行正在打印文本。

(有六个地方必须更换,最后一部分有点棘手)

另外请考虑我刚刚进行了更改并且您可能需要修复一些错误,但这是Write方法最终的样子,

function Write($h, $txt, $link='', $align='L')
{
    // Output text in flowing mode
    $cw = &$this->CurrentFont['cw'];
    $w = $this->w-$this->rMargin-$this->x;

    $wmax = ($w-2*$this->cMargin);
    $s = str_replace("\r",'',$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,0,$link);
            }
            else {
                $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,$align,0,$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,0,$link);
                }
                else {
                    $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,$align,0,$link);
                }
            }
            else
            {
                if ($this->unifontSubset) {
                    $this->Cell($w,$h,mb_substr($s,$j,$sep-$j,'UTF-8'),0,2,$align,0,$link);
                }
                else {
                    $this->Cell($w,$h,substr($s,$j,$sep-$j),0,2,$align,0,$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($w, $h,mb_substr($s,$j,$i-$j,'UTF-8'),0,0,$align,0,$link);
            // $this->Cell($l, $h,mb_substr($s,$j,$i-$j,'UTF-8'),0,0,'',0,$link);
        }
        else {
            $this->Cell($w, $h,substr($s,$j),0,0,$align,0,$link);
            // $this->Cell($l, $h,substr($s,$j),0,0,'',0,$link);
        }
    }
}
于 2013-10-15T10:23:06.530 回答