podoff 1.2.4 → 1.3.0

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.
Files changed (6) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -0
  3. data/LICENSE.txt +1 -1
  4. data/README.md +31 -5
  5. data/lib/podoff.rb +96 -17
  6. metadata +3 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 01c13867339ca5cedc0ff2682a70a94686aa04a1fc642fa9479d491accdc93fc
4
- data.tar.gz: e340f680e7c5c76d783b09abdb1872707a6fca4b4ba972ccb882aed1b82ff2a8
3
+ metadata.gz: d1ef5ecc8cb922c5bd2725af0c936c9eb3291a353a05b2e927e103147e0da499
4
+ data.tar.gz: e800a9be42f5c3c9ba12097d8c4edfad1a6e8722ae56887710c7939e65616095
5
5
  SHA512:
6
- metadata.gz: 8445ecd4ba92939e54662f32144cfedb3796b21c197db2a4efdf5f36925851c02a82eaa76a502f5b135ddc016a2f98559bd361a96f196fd531957b812d9406b0
7
- data.tar.gz: 5c19354e0060eacbcf9402972ed3e7d3eeaf3db264d87c894484fb8105128212495a7283c2e675032db99db04e389cbba526fc775670a1934519a662bddb0809
6
+ metadata.gz: 2f9ab0d2349c2059c7c8d43695d4db10452cd0b4c2e86628852c5f858e8e6da918e93f3a57f200a9d0f88118ad328bf540d4233d1dff07a5407e4c9afc1ab17a
7
+ data.tar.gz: 31ce324bce4473a96d8aa07737c1d1938df45af31987f05504f9809b248cbb517e37cdc6f3e7cec8dd4d7164aaafa734a6798ec1f2d915bb5551a552d7f609cb
data/CHANGELOG.md CHANGED
@@ -2,6 +2,12 @@
2
2
  # CHANGELOG.md
3
3
 
4
4
 
5
+ ## podoff 1.3.0 released 2020-03-30
6
+
7
+ * Introduce Podoff::Stream#line
8
+ * Introduce Podoff::Stream#rectangle
9
+
10
+
5
11
  ## podoff 1.2.4 released 2019-03-12
6
12
 
7
13
  * Let Stream#bt/#text accept a nil string
data/LICENSE.txt CHANGED
@@ -1,5 +1,5 @@
1
1
 
2
- Copyright (c) 2015-2019, John Mettraux, jmettraux@gmail.com
2
+ Copyright (c) 2015-2020, John Mettraux, jmettraux@gmail.com
3
3
 
4
4
  Permission is hereby granted, free of charge, to any person obtaining a copy
5
5
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -237,7 +237,7 @@ class Podoff::Obj
237
237
 
238
238
  ### Podoff::Stream
239
239
 
240
- TODO
240
+ Here are the methods used to write to streams.
241
241
 
242
242
  ```ruby
243
243
  class Podoff::Stream
@@ -245,18 +245,44 @@ class Podoff::Stream
245
245
  # set the current font and font size for the stream
246
246
  #
247
247
  def tf(font_name, font_size)
248
- alias :font :tf
248
+ alias font tf
249
249
 
250
250
  # set the current color for the stream
251
251
  #
252
252
  def rg(red, green, blue)
253
- alias :rgb :rg
254
- alias :color :rg
253
+ def rg(string) # like '#fffff' or 'white'
254
+ alias rgb rg
255
+ alias color rg
255
256
 
256
257
  # write a piece of text at a given position
257
258
  #
258
259
  def bt(x, y, text)
259
- alias :text :bt
260
+ def bt(x, y, text, rgb: 'blue')
261
+ alias text bt
262
+
263
+ # draw a rectangle
264
+ #
265
+ def re(x, y, *a)
266
+ alias rect re
267
+ alias rectangle re
268
+ #
269
+ st.re(10, 20, 30, 40, rgb: [ 0.0, 0.0, 0.0 ])
270
+ st.rect(11, 21, w: 31, h: 41, rgb: [ 0.1, 0.1, 0.1 ])
271
+ st.rectangle(12, 22, 32, 42, rgb: [ 0.2, 0.2, 0.2 ])
272
+ # ...
273
+
274
+ # draw a line
275
+ #
276
+ def line(x0, y0, x1, y1, *a)
277
+ #
278
+ st.line(1, 1, 2, 2)
279
+ st.line(1, 1, 2, 2, 3, 3)
280
+ st.line([ 1, 1 ], [ 2, 2 ], [ 3, 3 ])
281
+ st.line([ 1, 1 ], [ 2, 2 ], [ 3, 3 ], rgb: [ 0.5, 0.5, 0.5 ])
282
+ st.line(1, 1, 2, 2, rgb: [ 0.7, 0.7, 0.7 ])
283
+ # ...
284
+ st.line(1, 1, 2, 2, rgb: [ 0.7, 0.7, 0.7 ], width: 0.3)
285
+ # ...
260
286
  ```
261
287
 
262
288
 
data/lib/podoff.rb CHANGED
@@ -6,7 +6,7 @@ require 'stringio'
6
6
 
7
7
  module Podoff
8
8
 
9
- VERSION = '1.2.4'
9
+ VERSION = '1.3.0'
10
10
 
11
11
  def self.load(path, encoding)
12
12
 
@@ -437,7 +437,7 @@ module Podoff
437
437
 
438
438
  add_to_attribute(:contents, re)
439
439
  end
440
- alias :insert_content :insert_contents
440
+ alias insert_content insert_contents
441
441
 
442
442
  def to_s
443
443
 
@@ -509,33 +509,81 @@ module Podoff
509
509
 
510
510
  @font = "/#{n} #{font_size} Tf "
511
511
  end
512
- alias :font :tf
512
+ alias font tf
513
513
 
514
- def rg(red, green, blue)
514
+ def rg(*a)
515
515
 
516
- @color = "#{red} #{green} #{blue} rg "
516
+ @color = to_rg(a)
517
517
  end
518
- alias :color :rg
519
- alias :rgb :rg
518
+ alias color rg
519
+ alias rgb rg
520
520
 
521
- def bt(x, y, text)
521
+ def bt(x, y, text, opts={})
522
522
 
523
523
  return unless text
524
524
 
525
- @content.write "\n" if @content.size > 0
526
- @content.write "BT "
527
- @content.write @font if @font
528
- @content.write @color if @color
529
- @content.write "#{x} #{y} Td (#{escape(text)}) Tj"
530
- @content.write " ET"
525
+ rgb = opts[:rgb]
526
+
527
+ @content << "\n" if @content.size > 0
528
+ @content << 'BT '
529
+ @content << @font if @font
530
+ if rgb
531
+ @content << to_rg(rgb)
532
+ elsif @color
533
+ @content << @color
534
+ end
535
+ @content << "#{x} #{y} Td (#{escape(text)}) Tj"
536
+ @content << ' ET'
531
537
  end
532
- alias :text :bt
538
+ alias text bt
533
539
 
534
540
  def write(text)
535
541
 
536
542
  @content.write(text)
537
543
  end
538
544
 
545
+ #def re(x, y, w, h, opts={})
546
+ #def re([ x, y ], [ w, h ], opts={})
547
+ #def re([ x, y ], opts)
548
+ #
549
+ def re(x, *a)
550
+
551
+ a = [ x, a ].flatten
552
+ opts = a.last.is_a?(Hash) ? a.pop : {}
553
+ x = a.shift; y = a.shift
554
+
555
+ rgb = opts[:rgb]
556
+ w = opts[:width] || opts[:w] || a[0]
557
+ h = opts[:height] || opts[:h] || a[1]
558
+
559
+ @content << "\n" if @content.size > 0
560
+ @content << to_rg(rgb) if rgb
561
+ @content << lineup(x, y, w, h) << ' re f'
562
+ end
563
+ alias rect re
564
+ alias rectangle re
565
+
566
+ #def line(x0, y0, x1, y1, x2, y2, ..., opts={})
567
+ #def line([ x0, y0 ], [ x1, y1 ], [ x2, y2 ], ..., opts={})
568
+ #
569
+ def line(x0, y0, *a)
570
+
571
+ a = [ x0, y0, a ].flatten
572
+ opts = a.last.is_a?(Hash) ? a.pop : {}
573
+ x0, y0, *xys = a
574
+
575
+ rgb = opts[:rgb] || opts[:rg]
576
+ w = opts[:width] || opts[:w]
577
+
578
+ @content << "\n" if @content.size > 0
579
+ @content << w.to_s << ' w ' if w
580
+ @content << to_rg(rgb) if rgb
581
+ @content << lineup(x0, y0) << ' m '
582
+ xys.each_slice(2) { |x, y|
583
+ @content << lineup(x, y, 'l ') }
584
+ @content << 'h S'
585
+ end
586
+
539
587
  def to_s
540
588
 
541
589
  s = @content.string
@@ -552,9 +600,40 @@ module Podoff
552
600
 
553
601
  protected
554
602
 
555
- def escape(s)
603
+ def escape(s); s.gsub(/\(/, '\(').gsub(/\)/, '\)'); end
604
+ def lineup(*a); a.flatten.collect(&:to_s).join(' '); end
605
+
606
+ COLORS = {
607
+ 'black' => [ 0.0, 0.0, 0.0 ],
608
+ 'white' => [ 1.0, 1.0, 1.0 ],
609
+ 'red' => [ 1.0, 0.0, 0.0 ],
610
+ 'green' => [ 0.0, 1.0, 0.0 ],
611
+ 'blue' => [ 0.0, 0.0, 1.0 ] }
612
+
613
+ def to_rg(a)
614
+
615
+ a = a[0].to_s if a.length == 1
616
+
617
+ lineup(
618
+ if a.is_a?(Array) && a.length == 3
619
+ a
620
+ elsif a.is_a?(String) && a.match(/^#?([0-9a-z]{3}|[0-9a-z]{6})$/i)
621
+ hex_to_rgb(a)
622
+ else
623
+ COLORS[a] || COLORS['red'] # else, stand out in RED
624
+ end,
625
+ 'rg ')
626
+ end
627
+
628
+ def hex_to_rgb(s)
629
+
630
+ s = s[1..-1] if s[0, 1] == '#'
556
631
 
557
- s.gsub(/\(/, '\(').gsub(/\)/, '\)')
632
+ s.chars
633
+ .each_slice(
634
+ s.length == 6 ? 2 : 1)
635
+ .collect { |x|
636
+ sprintf('%0.4f', (x.join.to_i(16) / 255.0)).gsub(/0+$/, '0') }
558
637
  end
559
638
  end
560
639
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: podoff
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.4
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Mettraux
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-03-12 00:00:00.000000000 Z
11
+ date: 2020-03-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -56,8 +56,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
56
56
  - !ruby/object:Gem::Version
57
57
  version: '0'
58
58
  requirements: []
59
- rubyforge_project:
60
- rubygems_version: 2.7.6
59
+ rubygems_version: 3.0.3
61
60
  signing_key:
62
61
  specification_version: 4
63
62
  summary: a tool to deface PDF documents