summaryrefslogtreecommitdiffstats
path: root/vendor/plugins/rfpdf/lib/fpdf/fpdf_eps.rb
blob: c6a224310b5a671eeb35a1846329c7fac13b1a27 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# Information
# 
# PDF_EPS class from Valentin Schmidt ported to ruby by Thiago Jackiw (tjackiw@gmail.com) 
# working for Mingle LLC (www.mingle.com)
# Release Date: July 13th, 2006
# 
# Description
# 
# This script allows to embed vector-based Adobe Illustrator (AI) or AI-compatible EPS files. 
# Only vector drawing is supported, not text or bitmap. Although the script was successfully 
# tested with various AI format versions, best results are probably achieved with files that 
# were exported in the AI3 format (tested with Illustrator CS2, Freehand MX and Photoshop CS2).
# 
# ImageEps(string file, float x, float y [, float w [, float h [, string link [, boolean useBoundingBox]]]])
# 
# Same parameters as for regular FPDF::Image() method, with an additional one:
# 
# useBoundingBox: specifies whether to position the bounding box (true) or the complete canvas (false) 
# at location (x,y). Default value is true.
#
# First added to the Ruby FPDF distribution in 1.53c
#
# Usage is as follows:
#
# require 'fpdf'
# require 'fpdf_eps'
# pdf = FPDF.new
# pdf.extend(PDF_EPS)
# pdf.ImageEps(...)
#
# This allows it to be combined with other extensions, such as the bookmark
# module.

module PDF_EPS
    def ImageEps(file, x, y, w=0, h=0, link='', use_bounding_box=true)
        data = nil
        if File.exists?(file)
            File.open(file, 'rb') do |f|
                data = f.read()
            end
        else
            Error('EPS file not found: '+file)
        end
        
        # Find BoundingBox param
        regs = data.scan(/%%BoundingBox: [^\r\n]*/m)
        regs << regs[0].gsub(/%%BoundingBox: /, '')
        if regs.size > 1
            tmp = regs[1].to_s.split(' ')
            @x1 = tmp[0].to_i
            @y1 = tmp[1].to_i
            @x2 = tmp[2].to_i
            @y2 = tmp[3].to_i
        else
            Error('No BoundingBox found in EPS file: '+file)
        end
        f_start = data.index('%%EndSetup')
        f_start = data.index('%%EndProlog') if f_start === false
        f_start = data.index('%%BoundingBox') if f_start === false
        
        data = data.slice(f_start, data.length)
        
        f_end = data.index('%%PageTrailer')
        f_end = data.index('showpage') if f_end === false
        data = data.slice(0, f_end) if f_end
        
        # save the current graphic state
        out('q')
        
        k = @k
        
        # Translate
        if use_bounding_box
            dx = x*k-@x1
            dy = @hPt-@y2-y*k
        else
            dx = x*k
            dy = -y*k
        end
        tm = [1,0,0,1,dx,dy]
        out(sprintf('%.3f %.3f %.3f %.3f %.3f %.3f cm',
            tm[0], tm[1], tm[2], tm[3], tm[4], tm[5]))
        
        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
            end
        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
            end
        end
        
        if !scale_x.nil?
            # Scale
            tm = [scale_x,0,0,scale_y,0,@hPt*(1-scale_y)]
            out(sprintf('%.3f %.3f %.3f %.3f %.3f %.3f cm',
                tm[0], tm[1], tm[2], tm[3], tm[4], tm[5]))
        end
        
        data.split(/\r\n|[\r\n]/).each do |line|
            next if line == '' || line[0,1] == '%'
            len = line.length
            # next if (len > 2 && line[len-2,len] != ' ')
            cmd = line[len-2,len].strip
            case cmd
                when 'm', 'l', 'v', 'y', 'c', 'k', 'K', 'g', 'G', 's', 'S', 'J', 'j', 'w', 'M', 'd':
                    out(line)
                
                when 'L':
                    line[len-1,len]='l'
                    out(line)
                
                when 'C':
                    line[len-1,len]='c'
                    out(line)
                
                when 'f', 'F':
                    out('f*')
                
                when 'b', 'B':
                    out(cmd + '*')
            end
        end
        
        # restore previous graphic state
        out('Q')
        Link(x,y,w,h,link) if link
    end
end