我'使用php和reportico开发一个基于Web的报告应用程序。我想用波斯语(波斯语)制作报告,所以我需要改变PDF文件的方向(从左到右,到左到右)。有没有在FPDF中支持,或者在reportico中解决它的任何解决方案?
答案 0 :(得分:1)
请参阅此网址,我认为非常有用。
http://www.fpdf.de/downloads/addons/31/
或尝试一下。
说明:此扩展程序允许打印旋转和剪切(即斜体扭曲)文本。
TextWithDirection(float x,float y,string txt [,string direction])
x:横坐标
y:纵向
txt:文字字符串
方向:以下值之一(默认为R):
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();
?>
答案 1 :(得分: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);
}
}
}