prawn-pdfimage 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README.markdown +49 -0
- data/Rakefile +7 -0
- data/lib/prawn-pdfimage.rb +122 -0
- metadata +109 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 780170bcc691bd1849d090a2dd267484ce5d8614
|
4
|
+
data.tar.gz: ba40f161d698ea03de36ab598e8d2f30f74f901d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 193f130eb069f5b6678b624e28bb31f9b974a1704e3c0f29200283ce2225d10999c062712a9e9b45da5439e779f556cccf66cfb037cb54c3bfc0cb6b9d47f7e2
|
7
|
+
data.tar.gz: 281fbd70b1f88235a2845b7ca3f1db64afa5a8aed4a2fe262362f73df1018b67d7b7ec4831ac3bd346214ece6266c24a3265120a68500dbc86d122b748237b63
|
data/README.markdown
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
# prawn-pdfimage
|
2
|
+
|
3
|
+
Adds support for a [prawn](https://github.com/prawnpdf/prawn) to use
|
4
|
+
a PDF that contains an image as an image.
|
5
|
+
|
6
|
+
|
7
|
+
## Usage
|
8
|
+
|
9
|
+
**Gemfile**
|
10
|
+
```ruby
|
11
|
+
gem 'prawn-pdfimage'
|
12
|
+
```
|
13
|
+
|
14
|
+
**Your code**
|
15
|
+
```ruby
|
16
|
+
require 'prawn'
|
17
|
+
require 'prawn-pdfimage'
|
18
|
+
|
19
|
+
Prawn::Document.generate('output.pdf') do |pdf|
|
20
|
+
pdf.image 'image.pdf'
|
21
|
+
end
|
22
|
+
```
|
23
|
+
|
24
|
+
|
25
|
+
## Limitations
|
26
|
+
The current code will add the first xobject on the first page as the image to
|
27
|
+
the Prawn document. For the common case (someone exporting an image as a PDF)
|
28
|
+
this works just fine. If you need more control over which object is inserted
|
29
|
+
into your Prawn document, PRs are welcome.
|
30
|
+
|
31
|
+
|
32
|
+
## Found a bug?
|
33
|
+
Open a [github issue](https://github.com/packetmonkey/prawn-pdfimage/issues)
|
34
|
+
|
35
|
+
|
36
|
+
## Contributing & Development
|
37
|
+
1. Fork the project.
|
38
|
+
2. Make your feature addition or bug fix. All specs should pass.
|
39
|
+
3. Add specs for your changes.
|
40
|
+
4. Commit
|
41
|
+
5. Send a pull request. Bonus points for topic branches.
|
42
|
+
|
43
|
+
|
44
|
+
## Licence
|
45
|
+
prawn-pdfimage is released under the [MIT Licence](http://choosealicense.com/licenses/mit/)
|
46
|
+
|
47
|
+
|
48
|
+
## Authors
|
49
|
+
prawn-pdfimage is written and maintained by Evan Sharp.
|
data/Rakefile
ADDED
@@ -0,0 +1,122 @@
|
|
1
|
+
require 'prawn'
|
2
|
+
require 'pdf-reader'
|
3
|
+
|
4
|
+
# Implements support for pulling an image out of an existing PDF and adds
|
5
|
+
# that image to a prawn document.
|
6
|
+
#
|
7
|
+
# In this file, the pdf_* prefix refers to the PDF that contains the image
|
8
|
+
# we are adding to our document, prawn_* refers to the objects we are creating
|
9
|
+
# to be added to our prawn document.
|
10
|
+
class PrawnPDFImage < Prawn::Images::Image
|
11
|
+
def self.can_render?(image_blob)
|
12
|
+
image_blob.unpack('C5') == [37, 80, 68, 70, 45]
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize(image_blob)
|
16
|
+
self.image_blob = image_blob
|
17
|
+
self.reader = ::PDF::Reader.new StringIO.new(image_blob)
|
18
|
+
end
|
19
|
+
|
20
|
+
def build_pdf_object(document)
|
21
|
+
self.document = document
|
22
|
+
|
23
|
+
prawn_image_reference
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
attr_accessor :image_blob, :reader, :document
|
29
|
+
|
30
|
+
def prawn_image_reference
|
31
|
+
document.ref!(prawn_image_reference_options).tap do |ref|
|
32
|
+
ref << pdf_image_data
|
33
|
+
ref.stream.filters << { pdf_image_filter => nil }
|
34
|
+
ref.data[:SMask] = prawn_soft_mask if pdf_soft_mask
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def prawn_image_reference_options
|
39
|
+
{
|
40
|
+
Type: :XObject,
|
41
|
+
Subtype: :Image,
|
42
|
+
ColorSpace: pdf_image_colorspace,
|
43
|
+
Height: pdf_image_height,
|
44
|
+
Width: pdf_image_width,
|
45
|
+
BitsPerComponent: pdf_image_bits_per_component
|
46
|
+
}
|
47
|
+
end
|
48
|
+
|
49
|
+
def prawn_soft_mask
|
50
|
+
document.ref!(prawn_soft_mask_options).tap do |ref|
|
51
|
+
ref.stream << pdf_soft_mask.unfiltered_data
|
52
|
+
ref.stream.filters << { FlateDecode: nil }
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def prawn_soft_mask_options
|
57
|
+
{
|
58
|
+
Type: :XObject,
|
59
|
+
Subtype: :Image,
|
60
|
+
Width: pdf_image_width,
|
61
|
+
Height: pdf_image_height,
|
62
|
+
BitsPerComponent: pdf_image_bits_per_component,
|
63
|
+
ColorSpace: :DeviceGray
|
64
|
+
}
|
65
|
+
end
|
66
|
+
|
67
|
+
def pdf_soft_mask
|
68
|
+
pdf_image_stream.hash[:SMask]
|
69
|
+
end
|
70
|
+
|
71
|
+
def pdf_image_filter
|
72
|
+
pdf_image_stream.hash[:Filter]
|
73
|
+
end
|
74
|
+
|
75
|
+
# In my tests all the PDF color spaces where contained in an ICCBased
|
76
|
+
# PDF reference to a dictionary with an Alternate key.
|
77
|
+
#
|
78
|
+
# If images are not displaying correctly this is the first place to start
|
79
|
+
# looking.
|
80
|
+
def pdf_image_colorspace
|
81
|
+
cs = pdf_image_stream.hash[:ColorSpace]
|
82
|
+
|
83
|
+
if cs.is_a? Symbol
|
84
|
+
cs
|
85
|
+
else
|
86
|
+
return cs[1].hash[:Alternate]
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def pdf_image_data
|
91
|
+
pdf_image_stream.unfiltered_data
|
92
|
+
end
|
93
|
+
|
94
|
+
def pdf_image_bits_per_component
|
95
|
+
pdf_image_stream.hash[:BitsPerComponent]
|
96
|
+
end
|
97
|
+
|
98
|
+
def pdf_image_height
|
99
|
+
pdf_image_stream.hash[:Height]
|
100
|
+
end
|
101
|
+
|
102
|
+
def pdf_image_width
|
103
|
+
pdf_image_stream.hash[:Width]
|
104
|
+
end
|
105
|
+
|
106
|
+
def pdf_image_stream
|
107
|
+
page.xobjects.first[1]
|
108
|
+
end
|
109
|
+
|
110
|
+
def page
|
111
|
+
reader.page 1
|
112
|
+
end
|
113
|
+
|
114
|
+
# These methods are to conform to the API expected by Prawn Images and
|
115
|
+
# are not used internally.
|
116
|
+
attr_accessor :scaled_width, :scaled_height
|
117
|
+
|
118
|
+
alias_method :width, :pdf_image_width
|
119
|
+
alias_method :height, :pdf_image_height
|
120
|
+
end
|
121
|
+
|
122
|
+
Prawn.image_handler.register PrawnPDFImage
|
metadata
ADDED
@@ -0,0 +1,109 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: prawn-pdfimage
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Evan Sharp
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-08-12 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: prawn
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.15'
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '3.0'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0.15'
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '3.0'
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: pdf-reader
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - '='
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: 1.3.3
|
40
|
+
type: :runtime
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - '='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 1.3.3
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rspec
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: rubocop
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
description:
|
76
|
+
email:
|
77
|
+
executables: []
|
78
|
+
extensions: []
|
79
|
+
extra_rdoc_files: []
|
80
|
+
files:
|
81
|
+
- README.markdown
|
82
|
+
- Rakefile
|
83
|
+
- lib/prawn-pdfimage.rb
|
84
|
+
homepage:
|
85
|
+
licenses:
|
86
|
+
- MIT
|
87
|
+
metadata: {}
|
88
|
+
post_install_message:
|
89
|
+
rdoc_options: []
|
90
|
+
require_paths:
|
91
|
+
- lib
|
92
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
98
|
+
requirements:
|
99
|
+
- - ">="
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
requirements: []
|
103
|
+
rubyforge_project:
|
104
|
+
rubygems_version: 2.4.5
|
105
|
+
signing_key:
|
106
|
+
specification_version: 4
|
107
|
+
summary: Add PDF 'images' as images in prawn documents
|
108
|
+
test_files: []
|
109
|
+
has_rdoc:
|