2017-02-08 62 views
8

我想畫PDF文件。以pdf文件形式提供

示例:打開PDF文件並獲取圓形,方形,文本等繪圖工具......使用這些工具將在PDF文件上繪製形狀。

我在谷歌搜索和找到像PDF.JS這樣的選項。但它沒有在覈心PHP或正常的MVC結構中實現。它在JS中實現。

任何pdf.js的替代方法在PDF文件中繪製形狀?

我在找示例視頻linked here

+2

問題要求我們推薦或找到一本書,工具,軟件庫,教程或其他非現場資源**,因爲它們傾向於吸引自以爲是的答案和垃圾郵件,所以它們都是* Over-topic *。相反,[描述問題](http://meta.stackoverflow.com/questions/254393/what-exactly-is-a-recommendation-question)以及到目前爲止已經做了什麼來解決它。 – Nytrix

+0

感謝您的編輯 –

+0

,您肯定無法在PHP中完成此操作,除非將這些註釋保存並加載到您的pdf閱讀器。另外,pdf.js只是一個PDF查看器。它可以顯示用pdf創建的註釋,但不能創建註釋。 – chitgoks

回答

4

去年,當我來到我研究了同樣的問題,一些調整,我設法使它工作調整後。所以這裏是關於如何設置和使用我的方法的詳細解釋。

我使用兩個庫的組合:

  • FPDF:(˚F稀土P ortable d ocument ˚F ORMAT),這使得用PHP生成

    PDF文件
  • FPDI:(˚F稀土P ortable d ocument mporter),使用現有的PDF並將其轉換爲模板,使用FPDF

首先,你需要下載兩個庫:FPDF發現here在下載部分和FPDI在this page。你會得到兩個文件夾。繼續並將它們添加到您的項目中。

這裏是我的目錄結構:

enter image description here

讓我們在index.php(或任何其他文件爲此事),並編輯PDF文件,我們將其命名sample.pdf。我從official documentation中發現了一些代碼,但實際上做了一些修改以簡化它。 您會看到我已將方法nextPage()添加到PDF類中,以使頁面之間的導航更容易。在一個框架,你可以簡單地輸出的PDF文件,也​​可以強制PDF文件下載到用戶的計算機:

<?php 
require_once('FPDF/fpdf.php'); 
require_once('FPDI/fpdi.php'); 

// path of PDF file 
$fullPathToFile = "sample.pdf"; 


class PDF extends FPDI { 

    var $fileIndex; 
    var $currentPage = 1; 

    function Header() { 

     global $fullPathToFile; 

     if (is_null($this->fileIndex)) { 

      $this->numPages = $this->setSourceFile($fullPathToFile); 
      $this->fileIndex = $this->importPage(1); 

     } $this->useTemplate($this->fileIndex, 0, 0,200); 

    } 

    function nextPage() { 

     if($this->currentPage != 1) { 
      $this->fileIndex = $this->importPage($this->currentPage); 
     } 
     $this->addPage(); 

     return ++$this->currentPage; 
    } 

} 

// initiate PDF 
$pdf = new PDF(); 

// go to first page 
$pdf->nextPage(); 

// add content to current page 
$pdf->SetFont("helvetica", "", 20); 
$pdf->SetTextColor(220, 20, 60); 
$pdf->Text(50, 20, "I should not be here!"); 

// move to next page and add content 
$pdf->nextPage(); 

$pdf->SetFont("arial", "", 15); 
$pdf->SetTextColor(65, 105, 225); 
$pdf->Text(50, 20, "Me neither!!!"); 

//show the PDF in page 
$pdf->Output(); 

Output()方法可以接收不同的參數。 Read here瞭解更多信息。

DEMO!

FPDF社區寫了幾個腳本,其中一個你可能感興趣的: 它的geometric figures FPDF插件(ID script69.php)。它允許您繪製線條,矩形,曲線,橢圓,圓形,多邊形等等。


這裏有一個獎勵你:

創建一個名爲draw.php新的文件,並把提供here的源代碼。我已經提供了源代碼(前三行不同於原始源代碼,以使其工作)

<?php 
require_once('FPDF/fpdf.php'); 
require_once('FPDI/fpdi.php'); 

class PDF_Draw extends FPDI { 
    // Sets line style 
    // Parameters: 
    // - style: Line style. Array with keys among the following: 
    // . width: Width of the line in user units 
    // . cap: Type of cap to put on the line (butt, round, square). The difference between 'square' and 'butt' is that 'square' projects a flat end past the end of the line. 
    // . join: miter, round or bevel 
    // . dash: Dash pattern. Is 0 (without dash) or array with series of length values, which are the lengths of the on and off dashes. 
    //   For example: (2) represents 2 on, 2 off, 2 on , 2 off ... 
    //      (2,1) is 2 on, 1 off, 2 on, 1 off.. etc 
    // . phase: Modifier of the dash pattern which is used to shift the point at which the pattern starts 
    // . color: Draw color. Array with components (red, green, blue) 
    function SetLineStyle($style) { 
     extract($style); 
     if (isset($width)) { 
      $width_prev = $this->LineWidth; 
      $this->SetLineWidth($width); 
      $this->LineWidth = $width_prev; 
     } 
     if (isset($cap)) { 
      $ca = array('butt' => 0, 'round'=> 1, 'square' => 2); 
      if (isset($ca[$cap])) 
       $this->_out($ca[$cap] . ' J'); 
     } 
     if (isset($join)) { 
      $ja = array('miter' => 0, 'round' => 1, 'bevel' => 2); 
      if (isset($ja[$join])) 
       $this->_out($ja[$join] . ' j'); 
     } 
     if (isset($dash)) { 
      $dash_string = ''; 
      if ($dash) { 
       $tab = explode(',', $dash); 
       $dash_string = ''; 
       foreach ($tab as $i => $v) { 
        if ($i > 0) 
         $dash_string .= ' '; 
        $dash_string .= sprintf('%.2F', $v); 
       } 
      } 
      if (!isset($phase) || !$dash) 
       $phase = 0; 
      $this->_out(sprintf('[%s] %.2F d', $dash_string, $phase)); 
     } 
     if (isset($color)) { 
      list($r, $g, $b) = $color; 
      $this->SetDrawColor($r, $g, $b); 
     } 
    } 

    // Draws a line 
    // Parameters: 
    // - x1, y1: Start point 
    // - x2, y2: End point 
    // - style: Line style. Array like for SetLineStyle 
    function Line($x1, $y1, $x2, $y2, $style = null) { 
     if ($style) 
      $this->SetLineStyle($style); 
     parent::Line($x1, $y1, $x2, $y2); 
    } 

    // Draws a rectangle 
    // Parameters: 
    // - x, y: Top left corner 
    // - w, h: Width and height 
    // - style: Style of rectangle (draw and/or fill: D, F, DF, FD) 
    // - border_style: Border style of rectangle. Array with some of this index 
    // . all: Line style of all borders. Array like for SetLineStyle 
    // . L: Line style of left border. null (no border) or array like for SetLineStyle 
    // . T: Line style of top border. null (no border) or array like for SetLineStyle 
    // . R: Line style of right border. null (no border) or array like for SetLineStyle 
    // . B: Line style of bottom border. null (no border) or array like for SetLineStyle 
    // - fill_color: Fill color. Array with components (red, green, blue) 
    function Rect($x, $y, $w, $h, $style = '', $border_style = null, $fill_color = null) { 
     if (!(false === strpos($style, 'F')) && $fill_color) { 
      list($r, $g, $b) = $fill_color; 
      $this->SetFillColor($r, $g, $b); 
     } 
     switch ($style) { 
      case 'F': 
       $border_style = null; 
       parent::Rect($x, $y, $w, $h, $style); 
       break; 
      case 'DF': case 'FD': 
       if (!$border_style || isset($border_style['all'])) { 
        if (isset($border_style['all'])) { 
         $this->SetLineStyle($border_style['all']); 
         $border_style = null; 
        } 
       } else 
        $style = 'F'; 
       parent::Rect($x, $y, $w, $h, $style); 
       break; 
      default: 
       if (!$border_style || isset($border_style['all'])) { 
        if (isset($border_style['all']) && $border_style['all']) { 
         $this->SetLineStyle($border_style['all']); 
         $border_style = null; 
        } 
        parent::Rect($x, $y, $w, $h, $style); 
       } 
       break; 
     } 
     if ($border_style) { 
      if (isset($border_style['L']) && $border_style['L']) 
       $this->Line($x, $y, $x, $y + $h, $border_style['L']); 
      if (isset($border_style['T']) && $border_style['T']) 
       $this->Line($x, $y, $x + $w, $y, $border_style['T']); 
      if (isset($border_style['R']) && $border_style['R']) 
       $this->Line($x + $w, $y, $x + $w, $y + $h, $border_style['R']); 
      if (isset($border_style['B']) && $border_style['B']) 
       $this->Line($x, $y + $h, $x + $w, $y + $h, $border_style['B']); 
     } 
    } 

    // Draws a Bézier curve (the Bézier curve is tangent to the line between the control points at either end of the curve) 
    // Parameters: 
    // - x0, y0: Start point 
    // - x1, y1: Control point 1 
    // - x2, y2: Control point 2 
    // - x3, y3: End point 
    // - style: Style of rectangule (draw and/or fill: D, F, DF, FD) 
    // - line_style: Line style for curve. Array like for SetLineStyle 
    // - fill_color: Fill color. Array with components (red, green, blue) 
    function Curve($x0, $y0, $x1, $y1, $x2, $y2, $x3, $y3, $style = '', $line_style = null, $fill_color = null) { 
     if (!(false === strpos($style, 'F')) && $fill_color) { 
      list($r, $g, $b) = $fill_color; 
      $this->SetFillColor($r, $g, $b); 
     } 
     switch ($style) { 
      case 'F': 
       $op = 'f'; 
       $line_style = null; 
       break; 
      case 'FD': case 'DF': 
       $op = 'B'; 
       break; 
      default: 
       $op = 'S'; 
       break; 
     } 
     if ($line_style) 
      $this->SetLineStyle($line_style); 

     $this->_Point($x0, $y0); 
     $this->_Curve($x1, $y1, $x2, $y2, $x3, $y3); 
     $this->_out($op); 
    } 

    // Draws an ellipse 
    // Parameters: 
    // - x0, y0: Center point 
    // - rx, ry: Horizontal and vertical radius (if ry = 0, draws a circle) 
    // - angle: Orientation angle (anti-clockwise) 
    // - astart: Start angle 
    // - afinish: Finish angle 
    // - style: Style of ellipse (draw and/or fill: D, F, DF, FD, C (D + close)) 
    // - line_style: Line style for ellipse. Array like for SetLineStyle 
    // - fill_color: Fill color. Array with components (red, green, blue) 
    // - nSeg: Ellipse is made up of nSeg Bézier curves 
    function Ellipse($x0, $y0, $rx, $ry = 0, $angle = 0, $astart = 0, $afinish = 360, $style = '', $line_style = null, $fill_color = null, $nSeg = 8) { 
     if ($rx) { 
      if (!(false === strpos($style, 'F')) && $fill_color) { 
       list($r, $g, $b) = $fill_color; 
       $this->SetFillColor($r, $g, $b); 
      } 
      switch ($style) { 
       case 'F': 
        $op = 'f'; 
        $line_style = null; 
        break; 
       case 'FD': case 'DF': 
        $op = 'B'; 
        break; 
       case 'C': 
        $op = 's'; // small 's' means closing the path as well 
        break; 
       default: 
        $op = 'S'; 
        break; 
      } 
      if ($line_style) 
       $this->SetLineStyle($line_style); 
      if (!$ry) 
       $ry = $rx; 
      $rx *= $this->k; 
      $ry *= $this->k; 
      if ($nSeg < 2) 
       $nSeg = 2; 

      $astart = deg2rad((float) $astart); 
      $afinish = deg2rad((float) $afinish); 
      $totalAngle = $afinish - $astart; 

      $dt = $totalAngle/$nSeg; 
      $dtm = $dt/3; 

      $x0 *= $this->k; 
      $y0 = ($this->h - $y0) * $this->k; 
      if ($angle != 0) { 
       $a = -deg2rad((float) $angle); 
       $this->_out(sprintf('q %.2F %.2F %.2F %.2F %.2F %.2F cm', cos($a), -1 * sin($a), sin($a), cos($a), $x0, $y0)); 
       $x0 = 0; 
       $y0 = 0; 
      } 

      $t1 = $astart; 
      $a0 = $x0 + ($rx * cos($t1)); 
      $b0 = $y0 + ($ry * sin($t1)); 
      $c0 = -$rx * sin($t1); 
      $d0 = $ry * cos($t1); 
      $this->_Point($a0/$this->k, $this->h - ($b0/$this->k)); 
      for ($i = 1; $i <= $nSeg; $i++) { 
       // Draw this bit of the total curve 
       $t1 = ($i * $dt) + $astart; 
       $a1 = $x0 + ($rx * cos($t1)); 
       $b1 = $y0 + ($ry * sin($t1)); 
       $c1 = -$rx * sin($t1); 
       $d1 = $ry * cos($t1); 
       $this->_Curve(($a0 + ($c0 * $dtm))/$this->k, 
          $this->h - (($b0 + ($d0 * $dtm))/$this->k), 
          ($a1 - ($c1 * $dtm))/$this->k, 
          $this->h - (($b1 - ($d1 * $dtm))/$this->k), 
          $a1/$this->k, 
          $this->h - ($b1/$this->k)); 
       $a0 = $a1; 
       $b0 = $b1; 
       $c0 = $c1; 
       $d0 = $d1; 
      } 
      $this->_out($op); 
      if ($angle !=0) 
       $this->_out('Q'); 
     } 
    } 

    // Draws a circle 
    // Parameters: 
    // - x0, y0: Center point 
    // - r: Radius 
    // - astart: Start angle 
    // - afinish: Finish angle 
    // - style: Style of circle (draw and/or fill) (D, F, DF, FD, C (D + close)) 
    // - line_style: Line style for circle. Array like for SetLineStyle 
    // - fill_color: Fill color. Array with components (red, green, blue) 
    // - nSeg: Ellipse is made up of nSeg Bézier curves 
    function Circle($x0, $y0, $r, $astart = 0, $afinish = 360, $style = '', $line_style = null, $fill_color = null, $nSeg = 8) { 
     $this->Ellipse($x0, $y0, $r, 0, 0, $astart, $afinish, $style, $line_style, $fill_color, $nSeg); 
    } 

    // Draws a polygon 
    // Parameters: 
    // - p: Points. Array with values x0, y0, x1, y1,..., x(np-1), y(np - 1) 
    // - style: Style of polygon (draw and/or fill) (D, F, DF, FD) 
    // - line_style: Line style. Array with one of this index 
    // . all: Line style of all lines. Array like for SetLineStyle 
    // . 0..np-1: Line style of each line. Item is 0 (not line) or like for SetLineStyle 
    // - fill_color: Fill color. Array with components (red, green, blue) 
    function Polygon($p, $style = '', $line_style = null, $fill_color = null) { 
     $np = count($p)/2; 
     if (!(false === strpos($style, 'F')) && $fill_color) { 
      list($r, $g, $b) = $fill_color; 
      $this->SetFillColor($r, $g, $b); 
     } 
     switch ($style) { 
      case 'F': 
       $line_style = null; 
       $op = 'f'; 
       break; 
      case 'FD': case 'DF': 
       $op = 'B'; 
       break; 
      default: 
       $op = 'S'; 
       break; 
     } 
     $draw = true; 
     if ($line_style) 
      if (isset($line_style['all'])) 
       $this->SetLineStyle($line_style['all']); 
      else { // 0 .. (np - 1), op = {B, S} 
       $draw = false; 
       if ('B' == $op) { 
        $op = 'f'; 
        $this->_Point($p[0], $p[1]); 
        for ($i = 2; $i < ($np * 2); $i = $i + 2) 
         $this->_Line($p[$i], $p[$i + 1]); 
        $this->_Line($p[0], $p[1]); 
        $this->_out($op); 
       } 
       $p[$np * 2] = $p[0]; 
       $p[($np * 2) + 1] = $p[1]; 
       for ($i = 0; $i < $np; $i++) 
        if (!empty($line_style[$i])) 
         $this->Line($p[$i * 2], $p[($i * 2) + 1], $p[($i * 2) + 2], $p[($i * 2) + 3], $line_style[$i]); 
      } 

     if ($draw) { 
      $this->_Point($p[0], $p[1]); 
      for ($i = 2; $i < ($np * 2); $i = $i + 2) 
       $this->_Line($p[$i], $p[$i + 1]); 
      $this->_Line($p[0], $p[1]); 
      $this->_out($op); 
     } 
    } 

    // Draws a regular polygon 
    // Parameters: 
    // - x0, y0: Center point 
    // - r: Radius of circumscribed circle 
    // - ns: Number of sides 
    // - angle: Orientation angle (anti-clockwise) 
    // - circle: Draw circumscribed circle or not 
    // - style: Style of polygon (draw and/or fill) (D, F, DF, FD) 
    // - line_style: Line style. Array with one of this index 
    // . all: Line style of all lines. Array like for SetLineStyle 
    // . 0..ns-1: Line style of each line. Item is 0 (not line) or like for SetLineStyle 
    // - fill_color: Fill color. Array with components (red, green, blue) 
    // - circle_style: Style of circumscribed circle (draw and/or fill) (D, F, DF, FD) (if draw) 
    // - circle_line_style: Line style for circumscribed circle. Array like for SetLineStyle (if draw) 
    // - circle_fill_color: Fill color for circumscribed circle. Array with components (red, green, blue) (if draw fill circle) 
    function RegularPolygon($x0, $y0, $r, $ns, $angle = 0, $circle = false, $style = '', $line_style = null, $fill_color = null, $circle_style = '', $circle_line_style = null, $circle_fill_color = null) { 
     if ($ns < 3) 
      $ns = 3; 
     if ($circle) 
      $this->Circle($x0, $y0, $r, 0, 360, $circle_style, $circle_line_style, $circle_fill_color); 
     $p = null; 
     for ($i = 0; $i < $ns; $i++) { 
      $a = $angle + ($i * 360/$ns); 
      $a_rad = deg2rad((float) $a); 
      $p[] = $x0 + ($r * sin($a_rad)); 
      $p[] = $y0 + ($r * cos($a_rad)); 
     } 
     $this->Polygon($p, $style, $line_style, $fill_color); 
    } 

    // Draws a star polygon 
    // Parameters: 
    // - x0, y0: Center point 
    // - r: Radius of circumscribed circle 
    // - nv: Number of vertices 
    // - ng: Number of gaps (ng % nv = 1 => regular polygon) 
    // - angle: Orientation angle (anti-clockwise) 
    // - circle: Draw circumscribed circle or not 
    // - style: Style of polygon (draw and/or fill) (D, F, DF, FD) 
    // - line_style: Line style. Array with one of this index 
    // . all: Line style of all lines. Array like for SetLineStyle 
    // . 0..n-1: Line style of each line. Item is 0 (not line) or like for SetLineStyle 
    // - fill_color: Fill color. Array with components (red, green, blue) 
    // - circle_style: Style of circumscribed circle (draw and/or fill) (D, F, DF, FD) (if draw) 
    // - circle_line_style: Line style for circumscribed circle. Array like for SetLineStyle (if draw) 
    // - circle_fill_color: Fill color for circumscribed circle. Array with components (red, green, blue) (if draw fill circle) 
    function StarPolygon($x0, $y0, $r, $nv, $ng, $angle = 0, $circle = false, $style = '', $line_style = null, $fill_color = null, $circle_style = '', $circle_line_style = null, $circle_fill_color = null) { 
     if ($nv < 2) 
      $nv = 2; 
     if ($circle) 
      $this->Circle($x0, $y0, $r, 0, 360, $circle_style, $circle_line_style, $circle_fill_color); 
     $p2 = null; 
     $visited = null; 
     for ($i = 0; $i < $nv; $i++) { 
      $a = $angle + ($i * 360/$nv); 
      $a_rad = deg2rad((float) $a); 
      $p2[] = $x0 + ($r * sin($a_rad)); 
      $p2[] = $y0 + ($r * cos($a_rad)); 
      $visited[] = false; 
     } 
     $p = null; 
     $i = 0; 
     do { 
      $p[] = $p2[$i * 2]; 
      $p[] = $p2[($i * 2) + 1]; 
      $visited[$i] = true; 
      $i += $ng; 
      $i %= $nv; 
     } while (!$visited[$i]); 
     $this->Polygon($p, $style, $line_style, $fill_color); 
    } 

    // Draws a rounded rectangle 
    // Parameters: 
    // - x, y: Top left corner 
    // - w, h: Width and height 
    // - r: Radius of the rounded corners 
    // - round_corner: Draws rounded corner or not. String with a 0 (not rounded i-corner) or 1 (rounded i-corner) in i-position. Positions are, in order and begin to 0: top left, top right, bottom right and bottom left 
    // - style: Style of rectangle (draw and/or fill) (D, F, DF, FD) 
    // - border_style: Border style of rectangle. Array like for SetLineStyle 
    // - fill_color: Fill color. Array with components (red, green, blue) 
    function RoundedRect($x, $y, $w, $h, $r, $round_corner = '1111', $style = '', $border_style = null, $fill_color = null) { 
     if ('0000' == $round_corner) // Not rounded 
      $this->Rect($x, $y, $w, $h, $style, $border_style, $fill_color); 
     else { // Rounded 
      if (!(false === strpos($style, 'F')) && $fill_color) { 
       list($red, $g, $b) = $fill_color; 
       $this->SetFillColor($red, $g, $b); 
      } 
      switch ($style) { 
       case 'F': 
        $border_style = null; 
        $op = 'f'; 
        break; 
       case 'FD': case 'DF': 
        $op = 'B'; 
        break; 
       default: 
        $op = 'S'; 
        break; 
      } 
      if ($border_style) 
       $this->SetLineStyle($border_style); 

      $MyArc = 4/3 * (sqrt(2) - 1); 

      $this->_Point($x + $r, $y); 
      $xc = $x + $w - $r; 
      $yc = $y + $r; 
      $this->_Line($xc, $y); 
      if ($round_corner[0]) 
       $this->_Curve($xc + ($r * $MyArc), $yc - $r, $xc + $r, $yc - ($r * $MyArc), $xc + $r, $yc); 
      else 
       $this->_Line($x + $w, $y); 

      $xc = $x + $w - $r ; 
      $yc = $y + $h - $r; 
      $this->_Line($x + $w, $yc); 

      if ($round_corner[1]) 
       $this->_Curve($xc + $r, $yc + ($r * $MyArc), $xc + ($r * $MyArc), $yc + $r, $xc, $yc + $r); 
      else 
       $this->_Line($x + $w, $y + $h); 

      $xc = $x + $r; 
      $yc = $y + $h - $r; 
      $this->_Line($xc, $y + $h); 
      if ($round_corner[2]) 
       $this->_Curve($xc - ($r * $MyArc), $yc + $r, $xc - $r, $yc + ($r * $MyArc), $xc - $r, $yc); 
      else 
       $this->_Line($x, $y + $h); 

      $xc = $x + $r; 
      $yc = $y + $r; 
      $this->_Line($x, $yc); 
      if ($round_corner[3]) 
       $this->_Curve($xc - $r, $yc - ($r * $MyArc), $xc - ($r * $MyArc), $yc - $r, $xc, $yc - $r); 
      else { 
       $this->_Line($x, $y); 
       $this->_Line($x + $r, $y); 
      } 
      $this->_out($op); 
     } 
    } 

    /* PRIVATE METHODS */ 

    // Sets a draw point 
    // Parameters: 
    // - x, y: Point 
    function _Point($x, $y) { 
     $this->_out(sprintf('%.2F %.2F m', $x * $this->k, ($this->h - $y) * $this->k)); 
    } 

    // Draws a line from last draw point 
    // Parameters: 
    // - x, y: End point 
    function _Line($x, $y) { 
     $this->_out(sprintf('%.2F %.2F l', $x * $this->k, ($this->h - $y) * $this->k)); 
    } 

    // Draws a Bézier curve from last draw point 
    // Parameters: 
    // - x1, y1: Control point 1 
    // - x2, y2: Control point 2 
    // - x3, y3: End point 
    function _Curve($x1, $y1, $x2, $y2, $x3, $y3) { 
     $this->_out(sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c', $x1 * $this->k, ($this->h - $y1) * $this->k, $x2 * $this->k, ($this->h - $y2) * $this->k, $x3 * $this->k, ($this->h - $y3) * $this->k)); 
    } 

} 

?> 

不要忘記在頁面的頂部添加require_once('FPDF/fpdf.php');require_once('FPDI/fpdi.php');假設你有這樣的目錄結構:在index.php與代碼

enter image description here

然後,而不是擴展類FPDI我們可以直接擴展PDF_Draw。這樣,我們添加代碼前面仍然工作,但現在我們可以用新的方法,如Line()Curve()Rect()等等

以下是完整的index.php代碼:

<?php 
require_once('draw.php'); 

// path of PDF file 
$fullPathToFile = "sample.pdf"; 

class PDF extends PDF_Draw { 

    . 
    . 
    . 

} 

// initiate PDF 
$pdf = new PDF(); 

// go to first page 
$pdf->nextPage(); 

// add content to current page 
$pdf->SetFont("helvetica", "", 20); 
$pdf->SetTextColor(220, 20, 60); 
$pdf->Text(50, 20, "I should not be here!"); 

// move to next page and add content 
$pdf->nextPage(); 

$pdf->SetFont("arial", "", 15); 

$style = array('width' => 0.5, 'cap' => 'butt', 'join' => 'miter', 'dash' => '10,20,5,10', 'phase' => 10, 'color' => array(255, 0, 0)); 
$style2 = array('width' => 0.5, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(255, 0, 0)); 
$style3 = array('width' => 1, 'cap' => 'round', 'join' => 'round', 'dash' => '2,10', 'color' => array(255, 0, 0)); 
$style4 = array('L' => 0, 
       'T' => array('width' => 0.25, 'cap' => 'butt', 'join' => 'miter', 'dash' => '20,10', 'phase' => 10, 'color' => array(100, 100, 255)), 
       'R' => array('width' => 0.50, 'cap' => 'round', 'join' => 'miter', 'dash' => 0, 'color' => array(50, 50, 127)), 
       'B' => array('width' => 0.75, 'cap' => 'square', 'join' => 'miter', 'dash' => '30,10,5,10')); 
$style5 = array('width' => 0.25, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0)); 
$style6 = array('width' => 0.5, 'cap' => 'butt', 'join' => 'miter', 'dash' => '10,10', 'color' => array(0, 255, 0)); 
$style7 = array('width' => 0.5, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(200, 200, 0)); 

// Line 
$pdf->Text(5, 7, 'Line'); 
$pdf->Line(5, 10, 80, 30, $style); 

// Rect 
$pdf->Text(100, 7, 'Rectangle'); 
$pdf->Rect(100, 10, 40, 20, 'DF', $style4, array(220, 220, 200)); 

// Curve 
$pdf->Text(5, 37, 'Curve'); 
$pdf->Curve(5, 40, 30, 55, 70, 45, 60, 75, null, $style6); 

// Circle and ellipse 
$pdf->Text(5, 82, 'Circle and ellipse'); 
$pdf->SetLineStyle($style5); 
$pdf->Circle(25,105,20); 

// Polygon 
$pdf->Text(5, 132, 'Polygon'); 
$pdf->SetLineStyle(array('width' => 0.5, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0))); 
$pdf->Polygon(array(5,135,45,135,15,165)); 

// Regular polygon 
$pdf->Text(5, 172, 'Regular polygon'); 
$pdf->SetLineStyle($style5); 
$pdf->RegularPolygon(20, 190, 15, 6, 0, 1, 'F'); 

// Star polygon 
$pdf->Text(5, 212, 'Star polygon'); 
$pdf->SetLineStyle($style5); 
$pdf->StarPolygon(20, 230, 15, 20, 3, 0, 1, 'F'); 

// Rounded rectangle 
$pdf->Text(5, 252, 'Rounded rectangle'); 
$pdf->SetLineStyle(array('width' => 0.5, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0))); 
$pdf->RoundedRect(5, 255, 40, 30, 3.50, '1111', 'DF'); 

$pdf->SetTextColor(65, 105, 225); 
$pdf->Text(50, 20, "Me neither!!!"); 

//show the PDF in page 
$pdf->Output(); 

DEMO!

而且我還擊中了SO的30k字符限制。我希望這對你有所幫助!

+0

我已經更新了我的答案,並附上了使用PHP將圖紙添加到現有PDF的完整指南 – Ivan

4

TCPDF (tcpdf.org)似乎處理PDF graphics methods

參考examples/example_012.php

// create new PDF document 
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); 

// Line 
$pdf->Text(5, 4, 'Line examples'); 
$pdf->Line(5, 10, 80, 30, $style); 
$pdf->Line(5, 10, 5, 30, $style2); 
$pdf->Line(5, 10, 80, 10, $style3); 
// Rect 
$pdf->Text(100, 4, 'Rectangle examples'); 
$pdf->Rect(100, 10, 40, 20, 'DF', $style4, array(220, 220, 200)); 
$pdf->Rect(145, 10, 40, 20, 'D', array('all' => $style3)); 

而且其GitHub project tecnickcom/tcpdf顯示爲100%PHP。
但是,this search顯示它可以創建和修改一個新的PDF文檔。它可能無法打開和修改現有的。

1

http://www.fpdf.org 如果你想使用x, y coordinates fpdf以及tcpdf能對您有用畫畫。

global $title; 
    // Calculate width 
    $w = $this->GetStringWidth($title)+6; 
    $this->SetX((210-$w)/2); 
    // Colors of frame, background and text 
    $this->SetDrawColor(0,80,180); 
    $this->SetFillColor(230,230,0); 
    $this->SetTextColor(220,50,50); 
    // Thickness of frame (1 mm) 
    $this->SetLineWidth(1); 
    // Title 
    $this->Cell($w,9,$title,1,1,'C',true); 
    // Line break 
    $this->Ln(10); 
}