EPS / AI

Informations

Author: Valentin Schmidt
License: Freeware
Version: 1.3

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.3
* Date:     2006-07-28
* Author:   Valentin Schmidt
*
* Last Changes:
* - handle binary bytes in front of PS code (which before caused troubles for ereg)
* - 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);

    
# strip binary bytes in front of PS-header
    
$start strpos($data'%!PS-Adobe');
    if (
$start>0$data substr($data$start);

    
# 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($data0$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>&& $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<br>"; #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($file1024);
            }
            
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'1570180);
$pdf->MultiCell(0,8str_repeat('Hello World! '230));


// PAGE 2: EPS, WITH LINK
$pdf->AddPage();
$pdf->ImageEps('bug.eps'30,201500$lnk1);


// PAGE 3: AI
$pdf->AddPage();
$pdf->SetLink($lnk1);
$pdf->ImageEps('tiger.ai'1050190);


$pdf->Output();
?>

View the result here.

Download

ZIP