fpdf
PHP powered
home was ist fpdf? downloads & add-ons dokumentation faq forum impressum links kontakt
 

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.

Download

ZIP
 






 
         
         
 
 
fpdf.de © Copyright 2004-2006 carrib internet solutions - Beachten Sie bitte die Nutzungsbedingungen
Eine Verwendung der auf fpdf.de befindlichen Inhalte (Texte, Grafiken) ist nur mit Zustimmung des Betreibers zulässig.