 |
Downloads > Add-On |
 |
|
 |
| |
|
|
|
|
| |
EPS / AI
Informations
Author: Valentin Schmidt
License: Freeware
Version: 1.2
Description
This script allows to embed vector-based Adobe Illustrator (AI) or AI compatible EPS files.
Only vector drawings are supported, no Text or Bitmaps.
Although the script was succesfully tested with various AI format versions, best results are propably achieved by using files that were exported in the AI3 format (tested with Illustrator CS2, Freehand MX and Photoshop CS2).
function ImageEps(string file, float x, float y [, float w [, float h [, string link [, boolean useBoundingBox]]]])
Same parameters as for original Image()-method, with one additional parameter:
useBoundingBox: Specifies whether to position the bounding box (true) or the complete canvas (false) at location (x, y) (optional, default=true).
Source
<?php
/*******************************************************************************
* Software: FPDF_EPS
* Version: 1.2
* Date: 2006-07-21
* Author: Valentin Schmidt
*
* Last Changes:
* - fixed positioning and BoundingBox handling code (was totally screwed)
* - fix for BoundingBox detection without space after : (now Corel-compatible)
* - added some dirty code to handle compound paths
* - support for custom colors (x operator)
*******************************************************************************/
require('../fpdf.php');
class PDF_EPS extends FPDF{
function PDF_EPS($orientation='P', $unit='mm', $format='A4'){
parent::FPDF($orientation, $unit, $format);
}
function ImageEps ($file, $x, $y, $w=0, $h=0, $link='', $useBoundingBox=true){
$data = file_get_contents($file);
if ($data===false) $this->Error('EPS file not found: '.$file);
# find BoundingBox params
ereg ("%%BoundingBox:([^\r\n]+)", $data, $regs);
if (count($regs)>1){
list($x1, $y1, $x2, $y2) = explode(' ', trim($regs[1]));
}
else $this->Error('No BoundingBox found in EPS file: '.$file);
$start = strpos($data, '%%EndSetup');
if ($start===false) $start = strpos($data, '%%EndProlog');
if ($start===false) $start = strpos($data, '%%BoundingBox');
$data = substr($data, $start);
$end = strpos($data, '%%PageTrailer');
if ($end===false) $end = strpos($data, 'showpage');
if ($end) $data = substr($data, 0, $end);
# save the current graphic state
$this->_out('q');
$k = $this->k;
if ($useBoundingBox){
$dx = $x*$k-$x1;
$dy = $y*$k-$y1;
}else{
$dx = $x*$k;
$dy = $y*$k;
}
# translate
$this->_out(sprintf('%.3f %.3f %.3f %.3f %.3f %.3f cm', 1, 0, 0, 1, $dx, $dy+($this->hPt - 2*$y*$k - ($y2-$y1))));
if ($w>0){
$scale_x = $w/(($x2-$x1)/$k);
if ($h>0){
$scale_y = $h/(($y2-$y1)/$k);
}else{
$scale_y = $scale_x;
$h = ($y2-$y1)/$k * $scale_y;
}
}else{
if ($h>0){
$scale_y = $h/(($y2-$y1)/$k);
$scale_x = $scale_y;
$w = ($x2-$x1)/$k * $scale_x;
}else{
$w = ($x2-$x1)/$k;
$h = ($y2-$y1)/$k;
}
}
# scale
if (isset($scale_x))
$this->_out(sprintf('%.3f %.3f %.3f %.3f %.3f %.3f cm', $scale_x, 0, 0, $scale_y, $x1*(1-$scale_x), $y2*(1-$scale_y)));
# handle pc/unix/mac line endings
$lines = split ("\r\n|[\r\n]", $data);
$u=0;
$cnt = count($lines);
for ($i=0;$i<$cnt;$i++){
$line = $lines[$i];
if ($line=='' || $line{0}=='%') continue;
$len = strlen($line);
if ($len>2 && $line{$len-2}!=' ') continue;
$cmd = $line{$len-1};
switch ($cmd){
case 'm':
case 'l':
case 'v':
case 'y':
case 'c':
case 'k':
case 'K':
case 'g':
case 'G':
case 's':
case 'S':
case 'J':
case 'j':
case 'w':
case 'M':
case 'd' :
case 'n' :
case 'v' :
$this->_out($line);
break;
case 'x': # custom colors
list($c, $m, $y, $k) = explode(' ', $line);
$this->_out("$c $m $y $k k");
break;
case 'Y':
$line{$len-1}='y';
$this->_out($line);
break;
case 'N':
$line{$len-1}='n';
$this->_out($line);
break;
case 'V':
$line{$len-1}='v';
$this->_out($line);
break;
case 'L':
$line{$len-1}='l';
$this->_out($line);
break;
case 'C':
$line{$len-1}='c';
$this->_out($line);
break;
case 'b':
case 'B':
$this->_out($cmd . '*');
break;
case 'f':
case 'F':
if ($u>0){
$isU = false;
$max = min($i+5, $cnt);
for ($j=$i+1;$j<$max;$j++)
$isU = ($isU || ($lines[$j]=='U' || $lines[$j]=='*U'));
if ($isU) $this->_out("f*");
}else
$this->_out("f*");
break;
case 'u':
if ($line{0}=='*') $u++;
break;
case 'U':
if ($line{0}=='*') $u--;
break;
#default: echo "$cmd "; #just for debugging
}
}
# restore previous graphic state
$this->_out('Q');
if ($link)
$this->Link($x, $y, $w, $h, $link);
}
}# END CLASS
# for backward compatibility
if (!function_exists('file_get_contents')){
function file_get_contents($filename, $use_include_path = 0){
$file = @fopen($filename, 'rb', $use_include_path);
if ($file){
if ($fsize = @filesize($filename))
$data = fread($file, $fsize);
else {
$data = '';
while (!feof($file)) $data .= fread($file, 1024);
}
fclose($file);
return $data;
}else
return false;
}
}
?>
|
Example
<?php
require('fpdf_eps.php');
$pdf=new PDF_EPS();
$pdf->SetAutoPageBreak(false);
$pdf->SetFont('Arial', '', 12);
$lnk1 = $pdf->AddLink();
// PAGE 1: AI
$pdf->AddPage();
$pdf->ImageEps('pelican.ai', 15, 70, 180);
// PAGE 2: EPS, WITH LINK
$pdf->AddPage();
$pdf->ImageEps('bug.eps', 30, 20, 150, 0, $lnk1);
// PAGE 3: AI
$pdf->AddPage();
$pdf->SetLink($lnk1);
$pdf->ImageEps('tiger.ai', 10, 50, 190);
$pdf->Output();
?>
|
View the result here.
DownloadZIP
| |