pdf_margins 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 ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ M2NiOWYxMjI0NzQ3ZmMxY2VjYTE3NGIzYTdjOTUyODgxZGMwZWI4ZA==
5
+ data.tar.gz: !binary |-
6
+ OWE2NTdkODkxNzc5OTI2NGMwZDMyMjc4NzM1MGJlODFlNmE0OWFkYg==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ ODY4NjBlYTRjOTA1NGY2MWU5YTdjMjAxNmU4Mzg1ZjNmYzFhODgwZDkyMDJl
10
+ MDgwZmFmYTc1YTI1N2RkOTZjMzNlNmU2ODBiMGIyZjlhMmJkZTA4NmU1YmVh
11
+ ZDg3ZDliMzkwNGM4NzQ1OWMyM2U3NGVhMDdhNGZmZDQ1ZGNkYmI=
12
+ data.tar.gz: !binary |-
13
+ OTM4YzMxYzdhNjZmY2FkOGQ0MTZhMGI5NGVmZDM3ZWQwNzI0NzQ0Y2FkZjVk
14
+ NzY4NjQ3NmJmY2VlNGViMjc4MDFiNzUzY2FkOTViZDc1MmVlZDI4YWMwYWI1
15
+ NjU4OWUxZGFiYjUwNDRlZGM2OWRmMTlmNDUwY2U2NWYyMzM5YWU=
data/README.md ADDED
@@ -0,0 +1,19 @@
1
+ pdf/margins
2
+ ==
3
+
4
+ Simple Ruby library to check a PDF for clear margin areas, by rendering to
5
+ a CMYK bitmap, ensuring that the pixel area defined by each margin is empty.
6
+ It's pretty slow, but this is a lot easier than attempting to work out which
7
+ object in a PDF is rendering into the margin area.
8
+
9
+ Depends on RMagick, and thus requires a Ruby interpreter that supports
10
+ C extensions, such as MRI.
11
+
12
+ Written by [Tom Taylor](http://scraplab.net), [Newspaper Club](http://www.newspaperclub.com).
13
+
14
+ Example
15
+ --
16
+
17
+ # measurements in mm, ordered top, right, bottom, left (same as CSS)
18
+ checker = PDF::Margins::Checker.new('example.pdf', 10, 10, 10, 10)
19
+ puts checker.issues.inspect
data/Rakefile ADDED
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env rake
2
+
3
+ begin
4
+ require 'bundler/setup'
5
+ rescue LoadError
6
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
7
+ end
8
+
9
+ Bundler::GemHelper.install_tasks
10
+
11
+ require 'rake/testtask'
12
+
13
+ Rake::TestTask.new(:test) do |t|
14
+ t.libs << 'lib'
15
+ t.libs << 'test'
16
+ t.pattern = 'test/**/*_test.rb'
17
+ t.verbose = false
18
+ end
19
+
20
+ task :default => :test
@@ -0,0 +1,102 @@
1
+ require 'pdf/margins/issue'
2
+ require 'RMagick'
3
+
4
+ module PDF
5
+ module Margins
6
+ class Checker
7
+
8
+ MM_TO_PTS = 2.83464567
9
+ DEFAULT_RESOLUTION = 72
10
+ # If we find that we need higher resolution for better precision then we
11
+ # can adjust the SCALE_MULTIPLIER at the cost of speed.
12
+ SCALE_MULTIPLIER = 1
13
+ RESOLUTION = DEFAULT_RESOLUTION * SCALE_MULTIPLIER
14
+
15
+ attr_reader :file, :top_margin, :right_margin, :bottom_margin, :left_margin
16
+
17
+ # Dimensions are in mm, to be converted to PDF points later.
18
+ def initialize(file, top_margin, right_margin, bottom_margin, left_margin)
19
+ @file = file
20
+ @top_margin = top_margin
21
+ @right_margin = right_margin
22
+ @bottom_margin = bottom_margin
23
+ @left_margin = left_margin
24
+ end
25
+
26
+ def issues
27
+ image_list = Magick::Image.read(file) do
28
+ # Force CMYK colorspace, because ImageMagick autodetects PDF colorspace
29
+ # depending on the contents of the file. By forcing the colorspace we
30
+ # ensure that the subsequent checks in the `dirty_pixels?` method work.
31
+ self.colorspace = Magick::CMYKColorspace
32
+ self.density = RESOLUTION
33
+ self.antialias = false
34
+ end
35
+
36
+ image_list.each_with_index.map do |image, index|
37
+
38
+ page_number = index + 1
39
+ [].tap do |page_issues|
40
+ if dirty_pixels?(top_pixels(image, top_margin))
41
+ page_issues << Issue.new(page_number, :top)
42
+ end
43
+
44
+ if dirty_pixels?(bottom_pixels(image, bottom_margin))
45
+ page_issues << Issue.new(page_number, :bottom)
46
+ end
47
+
48
+ # Newspaper Club assumes that pages are two up, printed as spreads,
49
+ # so we only check right margins on odd numbered pages, and left
50
+ # margins on even numbered pages. This should probably be
51
+ # a configurable option for other types of printing.
52
+ if page_number % 2 == 0
53
+ if dirty_pixels?(left_pixels(image, left_margin))
54
+ page_issues << Issue.new(page_number, :left)
55
+ end
56
+ else
57
+ if dirty_pixels?(right_pixels(image, right_margin))
58
+ page_issues << Issue.new(page_number, :right)
59
+ end
60
+ end
61
+ end
62
+ end.flatten
63
+ end
64
+
65
+ private
66
+
67
+ def mm_to_pixels(mm)
68
+ (mm * MM_TO_PTS * SCALE_MULTIPLIER).floor
69
+ end
70
+
71
+ def top_pixels(image, mm)
72
+ width_px = mm_to_pixels(mm)
73
+ image.get_pixels(0, 0, image.columns, width_px)
74
+ end
75
+
76
+ def left_pixels(image, mm)
77
+ width_px = mm_to_pixels(mm)
78
+ image.get_pixels(0, 0, width_px, image.rows)
79
+ end
80
+
81
+ def right_pixels(image, mm)
82
+ width_px = mm_to_pixels(mm)
83
+ x = image.columns - width_px
84
+ image.get_pixels(x, 0, width_px, image.rows)
85
+ end
86
+
87
+ def bottom_pixels(image, mm)
88
+ width_px = mm_to_pixels(mm)
89
+ y = image.rows - width_px
90
+ image.get_pixels(0, y, image.columns, width_px)
91
+ end
92
+
93
+ def dirty_pixels?(pixels)
94
+ pixels.any? do |p|
95
+ (p.cyan | p.magenta | p.yellow | p.black) > 0
96
+ end
97
+ end
98
+
99
+ end
100
+ end
101
+ end
102
+
@@ -0,0 +1,5 @@
1
+ module PDF
2
+ module Margins
3
+ class Issue < Struct.new(:page, :side); end
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module PDF
2
+ module Margins
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1 @@
1
+ require 'pdf/margins/checker'
@@ -0,0 +1,35 @@
1
+ require 'test_helper'
2
+
3
+ class CheckerTest < Test::Unit::TestCase
4
+
5
+ test "PDF with clear margins" do
6
+ checker = PDF::Margins::Checker.new(pdf_path('clear-margins.pdf'), 10, 10, 10, 10)
7
+ assert_equal [], checker.issues
8
+ end
9
+
10
+ test "PDF with dirty left margin on page 1" do
11
+ checker = PDF::Margins::Checker.new(pdf_path('left-margin-only.pdf'), 10, 10, 10, 10)
12
+ assert_equal [], checker.issues
13
+ end
14
+
15
+ test "PDF with dirty left margin on page 2" do
16
+ checker = PDF::Margins::Checker.new(pdf_path('p2-left-margin-only.pdf'), 10, 10, 10, 10)
17
+ assert_equal [PDF::Margins::Issue.new(2, :left)], checker.issues
18
+ end
19
+
20
+ test "PDF with dirty right margin on page 1" do
21
+ checker = PDF::Margins::Checker.new(pdf_path('right-margin-only.pdf'), 10, 10, 10, 10)
22
+ assert_equal [PDF::Margins::Issue.new(1, :right)], checker.issues
23
+ end
24
+
25
+ test "PDF with dirty top margin on page 1" do
26
+ checker = PDF::Margins::Checker.new(pdf_path('top-margin-only.pdf'), 10, 10, 10, 10)
27
+ assert_equal [PDF::Margins::Issue.new(1, :top)], checker.issues
28
+ end
29
+
30
+ test "PDF with dirty bottom margin on page 1" do
31
+ checker = PDF::Margins::Checker.new(pdf_path('bottom-margin-only.pdf'), 10, 10, 10, 10)
32
+ assert_equal [PDF::Margins::Issue.new(1, :bottom)], checker.issues
33
+ end
34
+
35
+ end
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,10 @@
1
+ require 'test/unit'
2
+ require 'pdf/margins'
3
+
4
+ class Test::Unit::TestCase
5
+
6
+ def pdf_path(filename)
7
+ File.join(File.dirname(__FILE__), 'pdfs', filename)
8
+ end
9
+
10
+ end
metadata ADDED
@@ -0,0 +1,108 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pdf_margins
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Tom Taylor
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-05-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rmagick
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: 2.13.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 2.13.2
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: test-unit
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description:
56
+ email:
57
+ - tom@newspaperclub.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - lib/pdf/margins/checker.rb
63
+ - lib/pdf/margins/issue.rb
64
+ - lib/pdf/margins/version.rb
65
+ - lib/pdf/margins.rb
66
+ - Rakefile
67
+ - README.md
68
+ - test/checker_test.rb
69
+ - test/pdfs/bottom-margin-only.pdf
70
+ - test/pdfs/clear-margins.pdf
71
+ - test/pdfs/left-margin-only.pdf
72
+ - test/pdfs/p2-left-margin-only.pdf
73
+ - test/pdfs/right-margin-only.pdf
74
+ - test/pdfs/top-margin-only.pdf
75
+ - test/test_helper.rb
76
+ homepage: http://www.newspaperclub.com
77
+ licenses:
78
+ - MIT
79
+ metadata: {}
80
+ post_install_message:
81
+ rdoc_options: []
82
+ require_paths:
83
+ - lib
84
+ required_ruby_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ! '>='
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ required_rubygems_version: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ requirements: []
95
+ rubyforge_project:
96
+ rubygems_version: 2.0.3
97
+ signing_key:
98
+ specification_version: 4
99
+ summary: Simple library to checks whether the margins are clear in a PDF
100
+ test_files:
101
+ - test/checker_test.rb
102
+ - test/pdfs/bottom-margin-only.pdf
103
+ - test/pdfs/clear-margins.pdf
104
+ - test/pdfs/left-margin-only.pdf
105
+ - test/pdfs/p2-left-margin-only.pdf
106
+ - test/pdfs/right-margin-only.pdf
107
+ - test/pdfs/top-margin-only.pdf
108
+ - test/test_helper.rb