exiftool_vendored 10.04.0 → 10.23.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.

Potentially problematic release.


This version of exiftool_vendored might be problematic. Click here for more details.

Files changed (1225) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Image-ExifTool-10.23/Changes +7480 -0
  3. data/bin/Image-ExifTool-10.23/MANIFEST +977 -0
  4. data/bin/Image-ExifTool-10.23/META.yml +28 -0
  5. data/bin/Image-ExifTool-10.23/Makefile.PL +46 -0
  6. data/bin/Image-ExifTool-10.23/README +236 -0
  7. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/arg_files/exif2iptc.args +0 -0
  8. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/arg_files/exif2xmp.args +0 -0
  9. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/arg_files/gps2xmp.args +0 -0
  10. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/arg_files/iptc2exif.args +0 -0
  11. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/arg_files/iptc2xmp.args +0 -0
  12. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/arg_files/iptcCore.args +0 -0
  13. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/arg_files/pdf2xmp.args +0 -0
  14. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/arg_files/xmp2exif.args +0 -0
  15. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/arg_files/xmp2gps.args +0 -0
  16. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/arg_files/xmp2iptc.args +0 -0
  17. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/arg_files/xmp2pdf.args +0 -0
  18. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/config_files/convert_regions.config +0 -0
  19. data/bin/Image-ExifTool-10.23/config_files/example.config +343 -0
  20. data/bin/Image-ExifTool-10.23/config_files/gps2utm.config +256 -0
  21. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/config_files/photoshop_paths.config +0 -0
  22. data/bin/Image-ExifTool-10.23/config_files/picasa_faces.config +382 -0
  23. data/bin/Image-ExifTool-10.23/exiftool +6311 -0
  24. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/fmt_files/gpx.fmt +0 -0
  25. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/fmt_files/gpx_wpt.fmt +0 -0
  26. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/fmt_files/kml.fmt +0 -0
  27. data/bin/Image-ExifTool-10.23/html/ExifTool.html +2093 -0
  28. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/MIE1.1-20070121.pdf +0 -0
  29. data/bin/Image-ExifTool-10.23/html/Shift.html +173 -0
  30. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/AFCP.html +0 -0
  31. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/AIFF.html +0 -0
  32. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/APE.html +0 -0
  33. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/APP12.html +0 -0
  34. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/ASF.html +0 -0
  35. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Apple.html +0 -0
  36. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Audible.html +0 -0
  37. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/BMP.html +0 -0
  38. data/bin/Image-ExifTool-10.23/html/TagNames/BPG.html +118 -0
  39. data/bin/Image-ExifTool-10.23/html/TagNames/Canon.html +9534 -0
  40. data/bin/Image-ExifTool-10.23/html/TagNames/CanonCustom.html +2141 -0
  41. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/CanonRaw.html +0 -0
  42. data/bin/Image-ExifTool-10.23/html/TagNames/CanonVRD.html +2020 -0
  43. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Casio.html +0 -0
  44. data/bin/Image-ExifTool-10.23/html/TagNames/Composite.html +736 -0
  45. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/DICOM.html +0 -0
  46. data/bin/Image-ExifTool-10.23/html/TagNames/DNG.html +293 -0
  47. data/bin/Image-ExifTool-10.23/html/TagNames/DPX.html +229 -0
  48. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/DV.html +0 -0
  49. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/DarwinCore.html +0 -0
  50. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/DjVu.html +0 -0
  51. data/bin/Image-ExifTool-10.23/html/TagNames/EXE.html +741 -0
  52. data/bin/Image-ExifTool-10.23/html/TagNames/EXIF.html +3394 -0
  53. data/bin/Image-ExifTool-10.23/html/TagNames/Extra.html +469 -0
  54. data/bin/Image-ExifTool-10.23/html/TagNames/FLAC.html +183 -0
  55. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/FLIR.html +0 -0
  56. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Flash.html +0 -0
  57. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/FlashPix.html +0 -0
  58. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Font.html +0 -0
  59. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/FotoStation.html +0 -0
  60. data/bin/Image-ExifTool-10.23/html/TagNames/FujiFilm.html +824 -0
  61. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/GE.html +0 -0
  62. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/GIF.html +0 -0
  63. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/GIMP.html +0 -0
  64. data/bin/Image-ExifTool-10.23/html/TagNames/GPS.html +230 -0
  65. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/GeoTiff.html +0 -0
  66. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/H264.html +0 -0
  67. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/HP.html +0 -0
  68. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/HTML.html +0 -0
  69. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/ICC_Profile.html +0 -0
  70. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/ID3.html +0 -0
  71. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/IPTC.html +0 -0
  72. data/bin/Image-ExifTool-10.23/html/TagNames/ISO.html +159 -0
  73. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/ITC.html +0 -0
  74. data/bin/Image-ExifTool-10.23/html/TagNames/JFIF.html +62 -0
  75. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/JPEG.html +0 -0
  76. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/JVC.html +0 -0
  77. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Jpeg2000.html +0 -0
  78. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Kodak.html +0 -0
  79. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/KyoceraRaw.html +0 -0
  80. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/LNK.html +0 -0
  81. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Leaf.html +0 -0
  82. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Lytro.html +0 -0
  83. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/M2TS.html +0 -0
  84. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/MIE.html +0 -0
  85. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/MIFF.html +0 -0
  86. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/MNG.html +0 -0
  87. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/MOI.html +0 -0
  88. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/MPC.html +0 -0
  89. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/MPEG.html +0 -0
  90. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/MPF.html +0 -0
  91. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/MWG.html +0 -0
  92. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/MXF.html +0 -0
  93. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Matroska.html +0 -0
  94. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Microsoft.html +0 -0
  95. data/bin/Image-ExifTool-10.23/html/TagNames/Minolta.html +2625 -0
  96. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/MinoltaRaw.html +0 -0
  97. data/bin/Image-ExifTool-10.23/html/TagNames/Motorola.html +32 -0
  98. data/bin/Image-ExifTool-10.23/html/TagNames/Nikon.html +5907 -0
  99. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/NikonCapture.html +0 -0
  100. data/bin/Image-ExifTool-10.23/html/TagNames/NikonCustom.html +6590 -0
  101. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Nintendo.html +0 -0
  102. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/OOXML.html +0 -0
  103. data/bin/Image-ExifTool-10.23/html/TagNames/Ogg.html +49 -0
  104. data/bin/Image-ExifTool-10.23/html/TagNames/Olympus.html +3649 -0
  105. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/OpenEXR.html +0 -0
  106. data/bin/Image-ExifTool-10.23/html/TagNames/Opus.html +62 -0
  107. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/PDF.html +0 -0
  108. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/PGF.html +0 -0
  109. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/PICT.html +0 -0
  110. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/PLIST.html +0 -0
  111. data/bin/Image-ExifTool-10.23/html/TagNames/PLUS.html +2613 -0
  112. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/PNG.html +0 -0
  113. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/PSP.html +0 -0
  114. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Palm.html +0 -0
  115. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Panasonic.html +0 -0
  116. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/PanasonicRaw.html +0 -0
  117. data/bin/Image-ExifTool-10.23/html/TagNames/Pentax.html +4770 -0
  118. data/bin/Image-ExifTool-10.23/html/TagNames/PhaseOne.html +253 -0
  119. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/PhotoCD.html +0 -0
  120. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/PhotoMechanic.html +0 -0
  121. data/bin/Image-ExifTool-10.23/html/TagNames/Photoshop.html +739 -0
  122. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/PostScript.html +0 -0
  123. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/PrintIM.html +0 -0
  124. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Qualcomm.html +0 -0
  125. data/bin/Image-ExifTool-10.23/html/TagNames/QuickTime.html +6060 -0
  126. data/bin/Image-ExifTool-10.23/html/TagNames/RIFF.html +1382 -0
  127. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/RSRC.html +0 -0
  128. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/RTF.html +0 -0
  129. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Radiance.html +0 -0
  130. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Rawzor.html +0 -0
  131. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Real.html +0 -0
  132. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Reconyx.html +0 -0
  133. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Ricoh.html +0 -0
  134. data/bin/Image-ExifTool-10.23/html/TagNames/Samsung.html +616 -0
  135. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Sanyo.html +0 -0
  136. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Scalado.html +0 -0
  137. data/bin/Image-ExifTool-10.23/html/TagNames/Shortcuts.html +279 -0
  138. data/bin/Image-ExifTool-10.23/html/TagNames/Sigma.html +528 -0
  139. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/SigmaRaw.html +0 -0
  140. data/bin/Image-ExifTool-10.23/html/TagNames/Sony.html +10264 -0
  141. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/SonyIDC.html +0 -0
  142. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Stim.html +0 -0
  143. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Theora.html +0 -0
  144. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Torrent.html +0 -0
  145. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Unknown.html +0 -0
  146. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/VCard.html +0 -0
  147. data/bin/Image-ExifTool-10.23/html/TagNames/Vorbis.html +243 -0
  148. data/bin/Image-ExifTool-10.23/html/TagNames/XMP.html +8945 -0
  149. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/ZIP.html +0 -0
  150. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/iWork.html +0 -0
  151. data/bin/Image-ExifTool-10.23/html/TagNames/index.html +217 -0
  152. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/style.css +0 -0
  153. data/bin/Image-ExifTool-10.23/html/ancient_history.html +8209 -0
  154. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/canon_raw.html +0 -0
  155. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/commentary.html +0 -0
  156. data/bin/Image-ExifTool-10.23/html/config.html +355 -0
  157. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/data_members.html +0 -0
  158. data/bin/Image-ExifTool-10.23/html/exiftool_pod.html +2535 -0
  159. data/bin/Image-ExifTool-10.23/html/faq.html +1566 -0
  160. data/bin/Image-ExifTool-10.23/html/filename.html +352 -0
  161. data/bin/Image-ExifTool-10.23/html/geotag.html +659 -0
  162. data/bin/Image-ExifTool-10.23/html/history.html +243 -0
  163. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/htmldump.html +0 -0
  164. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/idiosyncracies.html +0 -0
  165. data/bin/Image-ExifTool-10.23/html/index.html +1341 -0
  166. data/bin/Image-ExifTool-10.23/html/install.html +261 -0
  167. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/metafiles.html +0 -0
  168. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/overview.png +0 -0
  169. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/standards.html +0 -0
  170. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/struct.html +0 -0
  171. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/style.css +0 -0
  172. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/under.html +0 -0
  173. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/verbose.html +0 -0
  174. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/writing.html +0 -0
  175. data/bin/Image-ExifTool-10.23/lib/File/RandomAccess.pm +378 -0
  176. data/bin/Image-ExifTool-10.23/lib/File/RandomAccess.pod +231 -0
  177. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool.pm +7747 -0
  178. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool.pod +2542 -0
  179. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/AES.pm +501 -0
  180. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/AFCP.pm +286 -0
  181. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/AIFF.pm +289 -0
  182. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/APE.pm +282 -0
  183. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/APP12.pm +322 -0
  184. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/ASF.pm +885 -0
  185. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Apple.pm +129 -0
  186. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Audible.pm +317 -0
  187. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/BMP.pm +179 -0
  188. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/BPG.pm +251 -0
  189. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/BZZ.pm +472 -0
  190. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/BigTIFF.pm +282 -0
  191. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/BuildTagLookup.pm +2527 -0
  192. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Canon.pm +8734 -0
  193. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/CanonCustom.pm +2667 -0
  194. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/CanonRaw.pm +910 -0
  195. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/CanonVRD.pm +2273 -0
  196. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/CaptureOne.pm +235 -0
  197. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Casio.pm +2058 -0
  198. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Charset.pm +423 -0
  199. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/Arabic.pm +0 -0
  200. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/Baltic.pm +0 -0
  201. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/Cyrillic.pm +0 -0
  202. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/Greek.pm +0 -0
  203. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/Hebrew.pm +0 -0
  204. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/JIS.pm +0 -0
  205. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/Latin.pm +0 -0
  206. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/Latin2.pm +0 -0
  207. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacArabic.pm +0 -0
  208. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacChineseCN.pm +0 -0
  209. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacChineseTW.pm +0 -0
  210. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacCroatian.pm +0 -0
  211. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacCyrillic.pm +0 -0
  212. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacGreek.pm +0 -0
  213. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacHebrew.pm +0 -0
  214. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacIceland.pm +0 -0
  215. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacJapanese.pm +0 -0
  216. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacKorean.pm +0 -0
  217. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacLatin2.pm +0 -0
  218. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacRSymbol.pm +0 -0
  219. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacRoman.pm +0 -0
  220. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacRomanian.pm +0 -0
  221. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacThai.pm +0 -0
  222. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacTurkish.pm +0 -0
  223. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/PDFDoc.pm +0 -0
  224. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/ShiftJIS.pm +0 -0
  225. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/Symbol.pm +0 -0
  226. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/Thai.pm +0 -0
  227. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/Turkish.pm +0 -0
  228. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/Vietnam.pm +0 -0
  229. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/DICOM.pm +3874 -0
  230. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/DNG.pm +835 -0
  231. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/DPX.pm +182 -0
  232. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/DV.pm +319 -0
  233. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/DarwinCore.pm +322 -0
  234. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/DjVu.pm +376 -0
  235. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/EXE.pm +1401 -0
  236. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Exif.pm +5863 -0
  237. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/FLAC.pm +297 -0
  238. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/FLIR.pm +1533 -0
  239. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Fixup.pm +366 -0
  240. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Flash.pm +755 -0
  241. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/FlashPix.pm +1935 -0
  242. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Font.pm +647 -0
  243. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/FotoStation.pm +261 -0
  244. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/FujiFilm.pm +1232 -0
  245. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/GE.pm +81 -0
  246. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/GIF.pm +542 -0
  247. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/GIMP.pm +258 -0
  248. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/GPS.pm +558 -0
  249. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/GeoTiff.pm +2263 -0
  250. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Geotag.pm +1241 -0
  251. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/H264.pm +1110 -0
  252. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/HP.pm +263 -0
  253. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/HTML.pm +576 -0
  254. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/HtmlDump.pm +897 -0
  255. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/ICC_Profile.pm +1000 -0
  256. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/ID3.pm +1570 -0
  257. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/IPTC.pm +1264 -0
  258. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/ISO.pm +206 -0
  259. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/ITC.pm +215 -0
  260. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Import.pm +329 -0
  261. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/InDesign.pm +277 -0
  262. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/JPEG.pm +605 -0
  263. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/JPEGDigest.pm +2616 -0
  264. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/JVC.pm +130 -0
  265. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Jpeg2000.pm +882 -0
  266. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Kodak.pm +2096 -0
  267. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/KyoceraRaw.pm +173 -0
  268. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/LNK.pm +723 -0
  269. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/cs.pm +1588 -0
  270. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/de.pm +8692 -0
  271. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/en_ca.pm +934 -0
  272. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/en_gb.pm +977 -0
  273. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/es.pm +4019 -0
  274. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/fi.pm +2854 -0
  275. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/fr.pm +4758 -0
  276. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/it.pm +7918 -0
  277. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/ja.pm +5835 -0
  278. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/ko.pm +2330 -0
  279. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/nl.pm +3222 -0
  280. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/pl.pm +1276 -0
  281. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/ru.pm +768 -0
  282. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/sv.pm +638 -0
  283. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/tr.pm +544 -0
  284. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/zh_cn.pm +1330 -0
  285. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/zh_tw.pm +801 -0
  286. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Leaf.pm +516 -0
  287. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lytro.pm +217 -0
  288. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/M2TS.pm +729 -0
  289. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/MIE.pm +2564 -0
  290. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/MIEUnits.pod +377 -0
  291. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/MIFF.pm +279 -0
  292. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/MNG.pm +684 -0
  293. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/MOI.pm +158 -0
  294. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/MPC.pm +156 -0
  295. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/MPEG.pm +736 -0
  296. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/MPF.pm +292 -0
  297. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/MWG.pm +753 -0
  298. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/MXF.pm +3031 -0
  299. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/MakerNotes.pm +1736 -0
  300. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Matroska.pm +892 -0
  301. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Microsoft.pm +904 -0
  302. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Minolta.pm +2981 -0
  303. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/MinoltaRaw.pm +534 -0
  304. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Motorola.pm +62 -0
  305. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Nikon.pm +7970 -0
  306. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/NikonCapture.pm +940 -0
  307. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/NikonCustom.pm +7361 -0
  308. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Nintendo.pm +128 -0
  309. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/OOXML.pm +409 -0
  310. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Ogg.pm +240 -0
  311. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Olympus.pm +3985 -0
  312. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/OpenEXR.pm +323 -0
  313. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Opus.pm +98 -0
  314. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PDF.pm +2367 -0
  315. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PGF.pm +143 -0
  316. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PICT.pm +1260 -0
  317. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PLIST.pm +448 -0
  318. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PLUS.pm +2607 -0
  319. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PNG.pm +1227 -0
  320. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PPM.pm +169 -0
  321. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PSP.pm +306 -0
  322. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Palm.pm +403 -0
  323. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Panasonic.pm +2374 -0
  324. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PanasonicRaw.pm +643 -0
  325. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Pentax.pm +6063 -0
  326. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PhaseOne.pm +707 -0
  327. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PhotoCD.pm +507 -0
  328. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PhotoMechanic.pm +256 -0
  329. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Photoshop.pm +939 -0
  330. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PostScript.pm +699 -0
  331. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PrintIM.pm +125 -0
  332. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Qualcomm.pm +1344 -0
  333. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/QuickTime.pm +6601 -0
  334. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/README +994 -0
  335. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/RIFF.pm +1587 -0
  336. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/RSRC.pm +241 -0
  337. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/RTF.pm +383 -0
  338. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Radiance.pm +144 -0
  339. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Rawzor.pm +189 -0
  340. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Real.pm +739 -0
  341. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Reconyx.pm +190 -0
  342. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Ricoh.pm +1148 -0
  343. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Samsung.pm +1177 -0
  344. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Sanyo.pm +440 -0
  345. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Scalado.pm +141 -0
  346. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Shift.pl +596 -0
  347. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Shortcuts.pm +337 -0
  348. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Sigma.pm +754 -0
  349. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/SigmaRaw.pm +670 -0
  350. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Sony.pm +9623 -0
  351. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/SonyIDC.pm +332 -0
  352. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Stim.pm +196 -0
  353. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/TagInfoXML.pm +827 -0
  354. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/TagLookup.pm +9250 -0
  355. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/TagNames.pod +29842 -0
  356. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Theora.pm +145 -0
  357. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Torrent.pm +317 -0
  358. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Unknown.pm +66 -0
  359. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/VCard.pm +405 -0
  360. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Vorbis.pm +255 -0
  361. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/WriteCanonRaw.pl +637 -0
  362. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/WriteExif.pl +2466 -0
  363. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/WriteIPTC.pl +706 -0
  364. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/WritePDF.pl +771 -0
  365. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/WritePNG.pl +390 -0
  366. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/WritePhotoshop.pl +266 -0
  367. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/WritePostScript.pl +772 -0
  368. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/WriteQuickTime.pl +358 -0
  369. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/WriteXMP.pl +1380 -0
  370. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Writer.pl +6220 -0
  371. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/XMP.pm +4071 -0
  372. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/XMP2.pl +1284 -0
  373. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/XMPStruct.pl +843 -0
  374. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/ZIP.pm +667 -0
  375. data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/iWork.pm +223 -0
  376. data/bin/Image-ExifTool-10.23/perl-Image-ExifTool.spec +113 -0
  377. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/AFCP.t +0 -0
  378. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/AFCP_2.out +0 -0
  379. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/AFCP_3.out +0 -0
  380. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/AIFF.t +0 -0
  381. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/AIFF_2.out +0 -0
  382. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/APE.t +0 -0
  383. data/bin/Image-ExifTool-10.23/t/APE_2.out +30 -0
  384. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/APE_3.out +0 -0
  385. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ASF.t +0 -0
  386. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ASF_2.out +0 -0
  387. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Audible.t +0 -0
  388. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Audible_2.out +0 -0
  389. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/BMP.t +0 -0
  390. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/BMP_2.out +0 -0
  391. data/bin/Image-ExifTool-10.23/t/BPG.t +28 -0
  392. data/bin/Image-ExifTool-10.23/t/BPG_2.out +92 -0
  393. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/BigTIFF.t +0 -0
  394. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/BigTIFF_2.out +0 -0
  395. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Canon.t +0 -0
  396. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonRaw.t +0 -0
  397. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonRaw_2.out +0 -0
  398. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonRaw_4.out +0 -0
  399. data/bin/Image-ExifTool-10.23/t/CanonRaw_5.out +209 -0
  400. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonRaw_6.out +0 -0
  401. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonRaw_7.out +0 -0
  402. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD.t +0 -0
  403. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_11.out +0 -0
  404. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_12.out +0 -0
  405. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_13.out +0 -0
  406. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_14.out +0 -0
  407. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_15.out +0 -0
  408. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_16.out +0 -0
  409. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_17.out +0 -0
  410. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_18.out +0 -0
  411. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_19.out +0 -0
  412. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_2.out +0 -0
  413. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_20.out +0 -0
  414. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_21.out +0 -0
  415. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_3.out +0 -0
  416. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_4.out +0 -0
  417. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_5.out +0 -0
  418. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_6.out +0 -0
  419. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_7.out +0 -0
  420. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_8.out +0 -0
  421. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_9.out +0 -0
  422. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Canon_2.out +0 -0
  423. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Canon_3.out +0 -0
  424. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Casio.t +0 -0
  425. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Casio_2.out +0 -0
  426. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Casio_3.out +0 -0
  427. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Casio_4.out +0 -0
  428. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Casio_5.out +0 -0
  429. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Casio_6.out +0 -0
  430. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/DICOM.t +0 -0
  431. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/DICOM_2.out +0 -0
  432. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/DNG.t +0 -0
  433. data/bin/Image-ExifTool-10.23/t/DNG_2.out +329 -0
  434. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/DNG_3.out +0 -0
  435. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/DPX.t +0 -0
  436. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/DPX_2.out +0 -0
  437. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/DV.t +0 -0
  438. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/DV_2.out +0 -0
  439. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/DjVu.t +0 -0
  440. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/DjVu_2.out +0 -0
  441. data/bin/Image-ExifTool-10.23/t/EXE.t +31 -0
  442. data/bin/Image-ExifTool-10.23/t/EXE_2.out +34 -0
  443. data/bin/Image-ExifTool-10.23/t/EXE_3.out +10 -0
  444. data/bin/Image-ExifTool-10.23/t/EXE_4.out +8 -0
  445. data/bin/Image-ExifTool-10.23/t/EXE_5.out +9 -0
  446. data/bin/Image-ExifTool-10.23/t/EXE_6.out +8 -0
  447. data/bin/Image-ExifTool-10.23/t/EXE_7.out +10 -0
  448. data/bin/Image-ExifTool-10.23/t/ExifTool.t +328 -0
  449. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_16.out +0 -0
  450. data/bin/Image-ExifTool-10.23/t/ExifTool_17.out +598 -0
  451. data/bin/Image-ExifTool-10.23/t/ExifTool_2.out +427 -0
  452. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_20.out +0 -0
  453. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_21.out +0 -0
  454. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_22.out +0 -0
  455. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_23.out +0 -0
  456. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_24.out +0 -0
  457. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_25.out +0 -0
  458. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_26.out +0 -0
  459. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_27.out +0 -0
  460. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_28.out +0 -0
  461. data/bin/Image-ExifTool-10.23/t/ExifTool_29.out +426 -0
  462. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_3.out +0 -0
  463. data/bin/Image-ExifTool-10.23/t/ExifTool_30.out +2 -0
  464. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_4.out +0 -0
  465. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_5.out +0 -0
  466. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_6.out +0 -0
  467. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_7.out +0 -0
  468. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_8.out +0 -0
  469. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_9.out +0 -0
  470. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FLAC.t +0 -0
  471. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FLAC_2.out +0 -0
  472. data/bin/Image-ExifTool-10.23/t/FLAC_3.out +20 -0
  473. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FLIR.t +0 -0
  474. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FLIR_2.out +0 -0
  475. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FLIR_3.out +0 -0
  476. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Flash.t +0 -0
  477. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FlashPix.t +0 -0
  478. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FlashPix_2.out +0 -0
  479. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Flash_2.out +0 -0
  480. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Flash_3.out +0 -0
  481. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Font.t +0 -0
  482. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Font_2.out +0 -0
  483. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Font_3.out +0 -0
  484. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Font_4.out +0 -0
  485. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Font_5.out +0 -0
  486. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Font_6.out +0 -0
  487. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Font_7.out +0 -0
  488. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FotoStation.t +0 -0
  489. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FotoStation_2.out +0 -0
  490. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FotoStation_3.out +0 -0
  491. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FujiFilm.t +0 -0
  492. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FujiFilm_2.out +0 -0
  493. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FujiFilm_3.out +0 -0
  494. data/bin/Image-ExifTool-10.23/t/FujiFilm_4.out +143 -0
  495. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FujiFilm_5.out +0 -0
  496. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GE.t +0 -0
  497. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GE_2.out +0 -0
  498. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GE_3.out +0 -0
  499. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GIF.t +0 -0
  500. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GIF_2.out +0 -0
  501. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GIF_3.out +0 -0
  502. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GIF_4.out +0 -0
  503. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GIMP.t +0 -0
  504. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GIMP_2.out +0 -0
  505. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GPS.t +0 -0
  506. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GPS_2.out +0 -0
  507. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GPS_3.out +0 -0
  508. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GeoTiff.t +0 -0
  509. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GeoTiff_2.out +0 -0
  510. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GeoTiff_3.out +0 -0
  511. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GeoTiff_4.out +0 -0
  512. data/bin/Image-ExifTool-10.23/t/Geotag.t +201 -0
  513. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Geotag_10.out +0 -0
  514. data/bin/Image-ExifTool-10.23/t/Geotag_11.out +3 -0
  515. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Geotag_2.out +0 -0
  516. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Geotag_3.out +0 -0
  517. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Geotag_5.out +0 -0
  518. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Geotag_6.out +0 -0
  519. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Geotag_7.out +0 -0
  520. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Geotag_8.out +0 -0
  521. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Geotag_9.out +0 -0
  522. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/HTML.t +0 -0
  523. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/HTML_2.out +0 -0
  524. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/IPTC.t +0 -0
  525. data/bin/Image-ExifTool-10.23/t/IPTC_2.out +69 -0
  526. data/bin/Image-ExifTool-10.23/t/IPTC_4.out +67 -0
  527. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/IPTC_5.out +0 -0
  528. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/IPTC_6.out +0 -0
  529. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/IPTC_7.out +0 -0
  530. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/IPTC_8.out +0 -0
  531. data/bin/Image-ExifTool-10.23/t/ISO.t +28 -0
  532. data/bin/Image-ExifTool-10.23/t/ISO_2.out +19 -0
  533. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ITC.t +0 -0
  534. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ITC_2.out +0 -0
  535. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/InDesign.t +0 -0
  536. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/InDesign_2.out +0 -0
  537. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/InDesign_3.out +0 -0
  538. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/InDesign_4.out +0 -0
  539. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/JVC.t +0 -0
  540. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/JVC_2.out +0 -0
  541. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/JVC_3.out +0 -0
  542. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Jpeg2000.t +0 -0
  543. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Jpeg2000_2.out +0 -0
  544. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Jpeg2000_3.out +0 -0
  545. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Jpeg2000_4.out +0 -0
  546. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Kodak.t +0 -0
  547. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Kodak_2.out +0 -0
  548. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Kodak_3.out +0 -0
  549. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/KyoceraRaw.t +0 -0
  550. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/KyoceraRaw_2.out +0 -0
  551. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/LNK.t +0 -0
  552. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/LNK_2.out +0 -0
  553. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang.t +0 -0
  554. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_1.out +0 -0
  555. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_10.out +0 -0
  556. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_11.out +0 -0
  557. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_12.out +0 -0
  558. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_13.out +0 -0
  559. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_14.out +0 -0
  560. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_15.out +0 -0
  561. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_16.out +0 -0
  562. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_17.out +0 -0
  563. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_18.out +0 -0
  564. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_2.out +0 -0
  565. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_3.out +0 -0
  566. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_4.out +0 -0
  567. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_5.out +0 -0
  568. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_6.out +0 -0
  569. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_7.out +0 -0
  570. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_8.out +0 -0
  571. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_9.out +0 -0
  572. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lytro.t +0 -0
  573. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lytro_2.out +0 -0
  574. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/M2TS.t +0 -0
  575. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/M2TS_2.out +0 -0
  576. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MIE.t +0 -0
  577. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MIE_2.out +0 -0
  578. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MIE_3.out +0 -0
  579. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MIE_5.out +0 -0
  580. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MIE_6.out +0 -0
  581. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MIFF.t +0 -0
  582. data/bin/Image-ExifTool-10.23/t/MIFF_2.out +114 -0
  583. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MOI.t +0 -0
  584. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MOI_2.out +0 -0
  585. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MP3.t +0 -0
  586. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MP3_2.out +0 -0
  587. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MWG.t +0 -0
  588. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MWG_2.out +0 -0
  589. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MWG_3.out +0 -0
  590. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MWG_4.out +0 -0
  591. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MWG_5.out +0 -0
  592. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MWG_6.out +0 -0
  593. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MXF.t +0 -0
  594. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MXF_2.out +0 -0
  595. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Matroska.t +0 -0
  596. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Matroska_2.out +0 -0
  597. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Minolta.t +0 -0
  598. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Minolta_2.out +0 -0
  599. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Minolta_3.out +0 -0
  600. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Minolta_4.out +0 -0
  601. data/bin/Image-ExifTool-10.23/t/Motorola.t +29 -0
  602. data/bin/Image-ExifTool-10.23/t/Motorola_2.out +97 -0
  603. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Nikon.t +0 -0
  604. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Nikon_2.out +0 -0
  605. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Nikon_3.out +0 -0
  606. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Nikon_4.out +0 -0
  607. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Nikon_5.out +0 -0
  608. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Nikon_7.out +0 -0
  609. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Nikon_8.out +0 -0
  610. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Olympus.t +0 -0
  611. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Olympus_2.out +0 -0
  612. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Olympus_3.out +0 -0
  613. data/bin/Image-ExifTool-10.23/t/Olympus_4.out +194 -0
  614. data/bin/Image-ExifTool-10.23/t/Olympus_5.out +266 -0
  615. data/bin/Image-ExifTool-10.23/t/Olympus_6.out +153 -0
  616. data/bin/Image-ExifTool-10.23/t/Olympus_7.out +483 -0
  617. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Olympus_8.out +0 -0
  618. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/OpenEXR.t +0 -0
  619. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/OpenEXR_2.out +0 -0
  620. data/bin/Image-ExifTool-10.23/t/Opus.t +27 -0
  621. data/bin/Image-ExifTool-10.23/t/Opus_2.out +26 -0
  622. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF.t +0 -0
  623. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_10.out +0 -0
  624. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_11.out +0 -0
  625. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_12.out +0 -0
  626. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_14.out +0 -0
  627. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_15.out +0 -0
  628. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_16.out +0 -0
  629. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_17.out +0 -0
  630. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_18.out +0 -0
  631. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_19.out +0 -0
  632. data/bin/Image-ExifTool-10.23/t/PDF_2.out +127 -0
  633. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_20.out +0 -0
  634. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_22.out +0 -0
  635. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_4.out +0 -0
  636. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_5.out +0 -0
  637. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_6.out +0 -0
  638. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_7.out +0 -0
  639. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_8.out +0 -0
  640. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_9.out +0 -0
  641. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PGF.t +0 -0
  642. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PGF_2.out +0 -0
  643. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PICT.t +0 -0
  644. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PICT_2.out +0 -0
  645. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PLIST.t +0 -0
  646. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PLIST_2.out +0 -0
  647. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PLIST_3.out +0 -0
  648. data/bin/Image-ExifTool-10.23/t/PLUS.t +45 -0
  649. data/bin/Image-ExifTool-10.23/t/PLUS_2.out +31 -0
  650. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PNG.t +0 -0
  651. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PNG_2.out +0 -0
  652. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PNG_3.out +0 -0
  653. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PNG_4.out +0 -0
  654. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PNG_5.out +0 -0
  655. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PPM.t +0 -0
  656. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PPM_2.out +0 -0
  657. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PPM_3.out +0 -0
  658. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PSP.t +0 -0
  659. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PSP_2.out +0 -0
  660. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Palm.t +0 -0
  661. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Palm_2.out +0 -0
  662. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Panasonic.t +0 -0
  663. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Panasonic_2.out +0 -0
  664. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Panasonic_3.out +0 -0
  665. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Panasonic_4.out +0 -0
  666. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Panasonic_5.out +0 -0
  667. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Pentax.t +0 -0
  668. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Pentax_2.out +0 -0
  669. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Pentax_3.out +0 -0
  670. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Pentax_4.out +0 -0
  671. data/bin/Image-ExifTool-10.23/t/PhaseOne.t +38 -0
  672. data/bin/Image-ExifTool-10.23/t/PhaseOne_2.out +99 -0
  673. data/bin/Image-ExifTool-10.23/t/PhaseOne_3.out +170 -0
  674. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PhotoCD.t +0 -0
  675. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PhotoCD_2.out +0 -0
  676. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PhotoMechanic.t +0 -0
  677. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PhotoMechanic_2.out +0 -0
  678. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PhotoMechanic_3.out +0 -0
  679. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Photoshop.t +0 -0
  680. data/bin/Image-ExifTool-10.23/t/Photoshop_2.out +109 -0
  681. data/bin/Image-ExifTool-10.23/t/Photoshop_3.out +117 -0
  682. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PostScript.t +0 -0
  683. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PostScript_2.out +0 -0
  684. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PostScript_3.out +0 -0
  685. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/QuickTime.t +0 -0
  686. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/QuickTime_2.out +0 -0
  687. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/QuickTime_3.out +0 -0
  688. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/QuickTime_4.out +0 -0
  689. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/QuickTime_5.out +0 -0
  690. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/RIFF.t +0 -0
  691. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/RIFF_2.out +0 -0
  692. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/RIFF_3.out +0 -0
  693. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/RIFF_4.out +0 -0
  694. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/RTF.t +0 -0
  695. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/RTF_2.out +0 -0
  696. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Radiance.t +0 -0
  697. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Radiance_2.out +0 -0
  698. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Real.t +0 -0
  699. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Real_2.out +0 -0
  700. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Real_3.out +0 -0
  701. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Real_4.out +0 -0
  702. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Ricoh.t +0 -0
  703. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Ricoh_2.out +0 -0
  704. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Ricoh_3.out +0 -0
  705. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Ricoh_4.out +0 -0
  706. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Sanyo.t +0 -0
  707. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Sanyo_2.out +0 -0
  708. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Sanyo_3.out +0 -0
  709. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Sigma.t +0 -0
  710. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Sigma_2.out +0 -0
  711. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Sigma_3.out +0 -0
  712. data/bin/Image-ExifTool-10.23/t/Sigma_4.out +65 -0
  713. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Sigma_5.out +0 -0
  714. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Sony.t +0 -0
  715. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Sony_2.out +0 -0
  716. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Sony_3.out +0 -0
  717. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Sony_5.out +0 -0
  718. data/bin/Image-ExifTool-10.23/t/TestLib.pm +431 -0
  719. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Torrent.t +0 -0
  720. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Torrent_2.out +0 -0
  721. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Unknown.t +0 -0
  722. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Unknown_2.out +0 -0
  723. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Unknown_3.out +0 -0
  724. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/VCard.t +0 -0
  725. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/VCard_2.out +0 -0
  726. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/VCard_3.out +0 -0
  727. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Vorbis.t +0 -0
  728. data/bin/Image-ExifTool-10.23/t/Vorbis_2.out +29 -0
  729. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer.t +0 -0
  730. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_10.out +0 -0
  731. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_11.out +0 -0
  732. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_13.out +0 -0
  733. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_14.out +0 -0
  734. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_15.out +0 -0
  735. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_16.out +0 -0
  736. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_17.out +0 -0
  737. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_18.out +0 -0
  738. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_19.out +0 -0
  739. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_2.out +0 -0
  740. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_22.out +0 -0
  741. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_24.out +0 -0
  742. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_25.out +0 -0
  743. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_26.out +0 -0
  744. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_27.out +0 -0
  745. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_28.out +0 -0
  746. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_29.out +0 -0
  747. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_30.out +0 -0
  748. data/bin/Image-ExifTool-10.23/t/Writer_31.out +108 -0
  749. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_32.out +0 -0
  750. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_33.out +0 -0
  751. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_34.out +0 -0
  752. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_35.out +0 -0
  753. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_36.out +0 -0
  754. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_37.out +0 -0
  755. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_38.out +0 -0
  756. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_39.out +0 -0
  757. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_4.out +0 -0
  758. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_40.out +0 -0
  759. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_41.out +0 -0
  760. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_42.out +0 -0
  761. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_43.out +0 -0
  762. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_44.out +0 -0
  763. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_45.out +0 -0
  764. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_46.out +0 -0
  765. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_47.out +0 -0
  766. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_48.out +0 -0
  767. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_50.out +0 -0
  768. data/bin/Image-ExifTool-10.23/t/Writer_51.out +414 -0
  769. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_52.out +0 -0
  770. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_53.out +0 -0
  771. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_54.out +0 -0
  772. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_55.out +0 -0
  773. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_56.out +0 -0
  774. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_6.out +0 -0
  775. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_7.out +0 -0
  776. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_9.out +0 -0
  777. data/bin/Image-ExifTool-10.23/t/XMP.t +570 -0
  778. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_10.out +0 -0
  779. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_11.out +0 -0
  780. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_12.out +0 -0
  781. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_13.out +0 -0
  782. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_14.out +0 -0
  783. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_15.out +0 -0
  784. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_16.out +0 -0
  785. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_17.out +0 -0
  786. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_18.out +0 -0
  787. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_19.out +0 -0
  788. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_2.out +0 -0
  789. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_20.out +0 -0
  790. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_21.out +0 -0
  791. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_22.out +0 -0
  792. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_23.out +0 -0
  793. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_24.out +0 -0
  794. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_25.out +0 -0
  795. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_26.out +0 -0
  796. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_27.out +0 -0
  797. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_28.out +0 -0
  798. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_29.out +0 -0
  799. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_3.out +0 -0
  800. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_30.out +0 -0
  801. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_31.out +0 -0
  802. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_32.out +0 -0
  803. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_34.out +0 -0
  804. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_36.out +0 -0
  805. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_37.out +0 -0
  806. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_39.out +0 -0
  807. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_40.out +0 -0
  808. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_41.out +0 -0
  809. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_42.out +0 -0
  810. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_43.out +0 -0
  811. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_44.out +0 -0
  812. data/bin/Image-ExifTool-10.23/t/XMP_45.out +23 -0
  813. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_5.out +0 -0
  814. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_6.out +0 -0
  815. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_7.out +0 -0
  816. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_8.out +0 -0
  817. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_9.out +0 -0
  818. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ZIP.t +0 -0
  819. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ZIP_2.out +0 -0
  820. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ZIP_3.out +0 -0
  821. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ZIP_4.out +0 -0
  822. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ZIP_5.out +0 -0
  823. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ZIP_6.out +0 -0
  824. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ZIP_7.out +0 -0
  825. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/AFCP.jpg +0 -0
  826. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/AIFF.aif +0 -0
  827. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/APE.ape +0 -0
  828. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/APE.mpc +0 -0
  829. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/ASF.wmv +0 -0
  830. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Audible.aa +0 -0
  831. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/BMP.bmp +0 -0
  832. data/bin/Image-ExifTool-10.23/t/images/BPG.bpg +0 -0
  833. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/BigTIFF.btf +0 -0
  834. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Canon.jpg +0 -0
  835. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Canon1DmkIII.jpg +0 -0
  836. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/CanonRaw.cr2 +0 -0
  837. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/CanonRaw.crw +0 -0
  838. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/CanonVRD.dr4 +0 -0
  839. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/CanonVRD.vrd +0 -0
  840. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/CaptureOne.eip +0 -0
  841. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Casio.jpg +0 -0
  842. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Casio2.jpg +0 -0
  843. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/CasioQVCI.jpg +0 -0
  844. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/DICOM.dcm +0 -0
  845. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/DNG.dng +0 -0
  846. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/DPX.dpx +0 -0
  847. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/DV.dv +0 -0
  848. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/DjVu.djvu +0 -0
  849. data/bin/Image-ExifTool-10.23/t/images/EXE.a +0 -0
  850. data/bin/Image-ExifTool-10.23/t/images/EXE.dylib +0 -0
  851. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/EXE.elf +0 -0
  852. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/EXE.exe +0 -0
  853. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/EXE.macho +0 -0
  854. data/bin/Image-ExifTool-10.23/t/images/EXE.so +0 -0
  855. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/ExifTool.jpg +0 -0
  856. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/ExifTool.tif +0 -0
  857. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/ExtendedXMP.jpg +0 -0
  858. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/FLAC.flac +0 -0
  859. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/FLAC.ogg +0 -0
  860. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/FLIR.fpf +0 -0
  861. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/FLIR.jpg +0 -0
  862. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Flash.flv +0 -0
  863. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Flash.swf +0 -0
  864. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/FlashPix.ppt +0 -0
  865. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Font.afm +0 -0
  866. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Font.dfont +0 -0
  867. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Font.pfa +0 -0
  868. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Font.pfb +0 -0
  869. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Font.pfm +0 -0
  870. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Font.ttf +0 -0
  871. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/FotoStation.jpg +0 -0
  872. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/FujiFilm.jpg +0 -0
  873. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/FujiFilm.raf +0 -0
  874. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/GE.jpg +0 -0
  875. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/GIF.gif +0 -0
  876. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/GIMP.xcf +0 -0
  877. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/GPS.jpg +0 -0
  878. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/GeoTiff.tif +0 -0
  879. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Geotag.gpx +0 -0
  880. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Geotag.igc +0 -0
  881. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Geotag.kml +0 -0
  882. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Geotag.log +0 -0
  883. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Geotag.xml +0 -0
  884. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Geotag2.log +0 -0
  885. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Geotag3.log +0 -0
  886. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/HTML.html +0 -0
  887. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/IPTC.jpg +0 -0
  888. data/bin/Image-ExifTool-10.23/t/images/ISO.iso +0 -0
  889. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/ITC.itc +0 -0
  890. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/InDesign.indd +0 -0
  891. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/JVC.jpg +0 -0
  892. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/JVC2.jpg +0 -0
  893. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Jpeg2000.j2c +0 -0
  894. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Jpeg2000.jp2 +0 -0
  895. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Kodak.jpg +0 -0
  896. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/KyoceraRaw.raw +0 -0
  897. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/LNK.lnk +0 -0
  898. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Lytro.lfp +0 -0
  899. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/M2TS.mts +0 -0
  900. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/MIE.mie +0 -0
  901. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/MIFF.miff +0 -0
  902. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/MOI.moi +0 -0
  903. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/MP3.mp3 +0 -0
  904. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/MWG.jpg +0 -0
  905. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/MXF.mxf +0 -0
  906. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Matroska.mkv +0 -0
  907. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Minolta.jpg +0 -0
  908. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Minolta.mrw +0 -0
  909. data/bin/Image-ExifTool-10.23/t/images/Motorola.jpg +0 -0
  910. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Nikon.jpg +0 -0
  911. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Nikon.nef +0 -0
  912. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/NikonD2Hs.jpg +0 -0
  913. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/NikonD70.jpg +0 -0
  914. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/OOXML.docx +0 -0
  915. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Olympus.dss +0 -0
  916. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Olympus.jpg +0 -0
  917. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Olympus2.jpg +0 -0
  918. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/OlympusE1.jpg +0 -0
  919. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/OpenDoc.ods +0 -0
  920. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/OpenEXR.exr +0 -0
  921. data/bin/Image-ExifTool-10.23/t/images/Opus.opus +0 -0
  922. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/PDF.pdf +0 -0
  923. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/PDF2.pdf +0 -0
  924. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/PGF.pgf +0 -0
  925. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/PICT.pict +0 -0
  926. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/PLIST-bin.plist +0 -0
  927. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/PLIST-xml.plist +0 -0
  928. data/bin/Image-ExifTool-10.23/t/images/PLUS.xmp +127 -0
  929. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/PNG.png +0 -0
  930. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/PPM.ppm +0 -0
  931. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/PSP.psp +0 -0
  932. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Palm.mobi +0 -0
  933. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Panasonic.jpg +0 -0
  934. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Panasonic.rw2 +0 -0
  935. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Pentax.avi +0 -0
  936. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Pentax.jpg +0 -0
  937. data/bin/Image-ExifTool-10.23/t/images/PhaseOne.iiq +0 -0
  938. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/PhotoCD.pcd +0 -0
  939. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/PhotoMechanic.jpg +0 -0
  940. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Photoshop.psd +0 -0
  941. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/PostScript.eps +0 -0
  942. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/QuickTime.m4a +0 -0
  943. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/QuickTime.mov +0 -0
  944. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/RIFF.avi +0 -0
  945. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/RIFF.wav +0 -0
  946. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/RIFF.webp +0 -0
  947. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/RTF.rtf +0 -0
  948. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Radiance.hdr +0 -0
  949. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Real.ra +0 -0
  950. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Real.ram +0 -0
  951. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Real.rm +0 -0
  952. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Ricoh.jpg +0 -0
  953. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Ricoh2.jpg +0 -0
  954. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Sanyo.jpg +0 -0
  955. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Sigma.jpg +0 -0
  956. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Sigma.x3f +0 -0
  957. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/SigmaDP2.x3f +0 -0
  958. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Sony.jpg +0 -0
  959. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Sony.pmp +0 -0
  960. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Torrent.torrent +0 -0
  961. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Unknown.jpg +0 -0
  962. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/VCard.ics +0 -0
  963. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/VCard.vcf +0 -0
  964. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Vorbis.ogg +0 -0
  965. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Writer.jpg +0 -0
  966. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/XMP.inx +0 -0
  967. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/XMP.jpg +0 -0
  968. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/XMP.svg +0 -0
  969. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/XMP.xml +0 -0
  970. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/XMP.xmp +0 -0
  971. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/XMP2.xmp +0 -0
  972. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/XMP3.xmp +0 -0
  973. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/XMP4.xmp +0 -0
  974. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/XMP5.xmp +0 -0
  975. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/XMP6.xmp +0 -0
  976. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/ZIP.gz +0 -0
  977. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/ZIP.zip +0 -0
  978. data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/iWork.numbers +0 -0
  979. data/lib/exiftool_vendored/version.rb +1 -1
  980. metadata +980 -941
  981. data/bin/Image-ExifTool-10.04/Changes +0 -7227
  982. data/bin/Image-ExifTool-10.04/MANIFEST +0 -937
  983. data/bin/Image-ExifTool-10.04/META.yml +0 -27
  984. data/bin/Image-ExifTool-10.04/Makefile.PL +0 -41
  985. data/bin/Image-ExifTool-10.04/README +0 -233
  986. data/bin/Image-ExifTool-10.04/config_files/example.config +0 -343
  987. data/bin/Image-ExifTool-10.04/config_files/picasa_faces.config +0 -370
  988. data/bin/Image-ExifTool-10.04/exiftool +0 -6260
  989. data/bin/Image-ExifTool-10.04/html/ExifTool.html +0 -2070
  990. data/bin/Image-ExifTool-10.04/html/Shift.html +0 -173
  991. data/bin/Image-ExifTool-10.04/html/TagNames/Canon.html +0 -9344
  992. data/bin/Image-ExifTool-10.04/html/TagNames/CanonCustom.html +0 -2081
  993. data/bin/Image-ExifTool-10.04/html/TagNames/CanonVRD.html +0 -1958
  994. data/bin/Image-ExifTool-10.04/html/TagNames/Composite.html +0 -705
  995. data/bin/Image-ExifTool-10.04/html/TagNames/DNG.html +0 -291
  996. data/bin/Image-ExifTool-10.04/html/TagNames/DPX.html +0 -224
  997. data/bin/Image-ExifTool-10.04/html/TagNames/EXE.html +0 -697
  998. data/bin/Image-ExifTool-10.04/html/TagNames/EXIF.html +0 -3383
  999. data/bin/Image-ExifTool-10.04/html/TagNames/Extra.html +0 -437
  1000. data/bin/Image-ExifTool-10.04/html/TagNames/FLAC.html +0 -183
  1001. data/bin/Image-ExifTool-10.04/html/TagNames/FujiFilm.html +0 -813
  1002. data/bin/Image-ExifTool-10.04/html/TagNames/GPS.html +0 -230
  1003. data/bin/Image-ExifTool-10.04/html/TagNames/JFIF.html +0 -61
  1004. data/bin/Image-ExifTool-10.04/html/TagNames/Minolta.html +0 -2614
  1005. data/bin/Image-ExifTool-10.04/html/TagNames/Nikon.html +0 -4836
  1006. data/bin/Image-ExifTool-10.04/html/TagNames/NikonCustom.html +0 -5633
  1007. data/bin/Image-ExifTool-10.04/html/TagNames/Ogg.html +0 -44
  1008. data/bin/Image-ExifTool-10.04/html/TagNames/Olympus.html +0 -3534
  1009. data/bin/Image-ExifTool-10.04/html/TagNames/Pentax.html +0 -4693
  1010. data/bin/Image-ExifTool-10.04/html/TagNames/PhaseOne.html +0 -253
  1011. data/bin/Image-ExifTool-10.04/html/TagNames/Photoshop.html +0 -575
  1012. data/bin/Image-ExifTool-10.04/html/TagNames/QuickTime.html +0 -6040
  1013. data/bin/Image-ExifTool-10.04/html/TagNames/RIFF.html +0 -1344
  1014. data/bin/Image-ExifTool-10.04/html/TagNames/Samsung.html +0 -604
  1015. data/bin/Image-ExifTool-10.04/html/TagNames/Shortcuts.html +0 -277
  1016. data/bin/Image-ExifTool-10.04/html/TagNames/Sigma.html +0 -469
  1017. data/bin/Image-ExifTool-10.04/html/TagNames/Sony.html +0 -8781
  1018. data/bin/Image-ExifTool-10.04/html/TagNames/Vorbis.html +0 -228
  1019. data/bin/Image-ExifTool-10.04/html/TagNames/XMP.html +0 -9175
  1020. data/bin/Image-ExifTool-10.04/html/TagNames/index.html +0 -211
  1021. data/bin/Image-ExifTool-10.04/html/ancient_history.html +0 -7903
  1022. data/bin/Image-ExifTool-10.04/html/config.html +0 -355
  1023. data/bin/Image-ExifTool-10.04/html/exiftool_pod.html +0 -2514
  1024. data/bin/Image-ExifTool-10.04/html/faq.html +0 -1534
  1025. data/bin/Image-ExifTool-10.04/html/filename.html +0 -352
  1026. data/bin/Image-ExifTool-10.04/html/geotag.html +0 -654
  1027. data/bin/Image-ExifTool-10.04/html/history.html +0 -263
  1028. data/bin/Image-ExifTool-10.04/html/index.html +0 -1331
  1029. data/bin/Image-ExifTool-10.04/html/install.html +0 -255
  1030. data/bin/Image-ExifTool-10.04/lib/File/RandomAccess.pm +0 -378
  1031. data/bin/Image-ExifTool-10.04/lib/File/RandomAccess.pod +0 -231
  1032. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool.pm +0 -7499
  1033. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool.pod +0 -2504
  1034. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/AES.pm +0 -501
  1035. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/AFCP.pm +0 -286
  1036. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/AIFF.pm +0 -289
  1037. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/APE.pm +0 -264
  1038. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/APP12.pm +0 -322
  1039. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/ASF.pm +0 -885
  1040. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Apple.pm +0 -128
  1041. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Audible.pm +0 -317
  1042. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/BMP.pm +0 -179
  1043. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/BZZ.pm +0 -472
  1044. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/BigTIFF.pm +0 -282
  1045. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/BuildTagLookup.pm +0 -2513
  1046. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Canon.pm +0 -8482
  1047. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/CanonCustom.pm +0 -2582
  1048. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/CanonRaw.pm +0 -910
  1049. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/CanonVRD.pm +0 -2240
  1050. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/CaptureOne.pm +0 -235
  1051. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Casio.pm +0 -2058
  1052. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Charset.pm +0 -396
  1053. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/DICOM.pm +0 -3874
  1054. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/DNG.pm +0 -835
  1055. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/DPX.pm +0 -181
  1056. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/DV.pm +0 -319
  1057. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/DarwinCore.pm +0 -322
  1058. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/DjVu.pm +0 -376
  1059. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/EXE.pm +0 -1253
  1060. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Exif.pm +0 -4687
  1061. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/FLAC.pm +0 -297
  1062. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/FLIR.pm +0 -1533
  1063. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Fixup.pm +0 -354
  1064. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Flash.pm +0 -755
  1065. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/FlashPix.pm +0 -1935
  1066. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Font.pm +0 -647
  1067. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/FotoStation.pm +0 -261
  1068. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/FujiFilm.pm +0 -1196
  1069. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/GE.pm +0 -81
  1070. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/GIF.pm +0 -542
  1071. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/GIMP.pm +0 -258
  1072. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/GPS.pm +0 -558
  1073. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/GeoTiff.pm +0 -2263
  1074. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Geotag.pm +0 -1221
  1075. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/H264.pm +0 -1112
  1076. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/HP.pm +0 -263
  1077. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/HTML.pm +0 -576
  1078. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/HtmlDump.pm +0 -895
  1079. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/ICC_Profile.pm +0 -1000
  1080. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/ID3.pm +0 -1569
  1081. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/IPTC.pm +0 -1264
  1082. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/ITC.pm +0 -215
  1083. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Import.pm +0 -329
  1084. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/InDesign.pm +0 -277
  1085. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/JPEG.pm +0 -605
  1086. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/JPEGDigest.pm +0 -2511
  1087. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/JVC.pm +0 -130
  1088. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Jpeg2000.pm +0 -882
  1089. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Kodak.pm +0 -2096
  1090. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/KyoceraRaw.pm +0 -173
  1091. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/LNK.pm +0 -723
  1092. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/cs.pm +0 -1588
  1093. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/de.pm +0 -8692
  1094. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/en_ca.pm +0 -848
  1095. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/en_gb.pm +0 -863
  1096. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/es.pm +0 -4019
  1097. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/fi.pm +0 -2854
  1098. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/fr.pm +0 -4758
  1099. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/it.pm +0 -7918
  1100. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/ja.pm +0 -5835
  1101. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/ko.pm +0 -2330
  1102. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/nl.pm +0 -3222
  1103. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/pl.pm +0 -1276
  1104. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/ru.pm +0 -768
  1105. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/sv.pm +0 -638
  1106. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/tr.pm +0 -544
  1107. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/zh_cn.pm +0 -1330
  1108. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/zh_tw.pm +0 -801
  1109. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Leaf.pm +0 -516
  1110. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lytro.pm +0 -217
  1111. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/M2TS.pm +0 -725
  1112. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/MIE.pm +0 -2564
  1113. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/MIEUnits.pod +0 -377
  1114. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/MIFF.pm +0 -279
  1115. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/MNG.pm +0 -684
  1116. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/MOI.pm +0 -158
  1117. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/MPC.pm +0 -156
  1118. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/MPEG.pm +0 -736
  1119. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/MPF.pm +0 -292
  1120. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/MWG.pm +0 -753
  1121. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/MXF.pm +0 -3031
  1122. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/MakerNotes.pm +0 -1725
  1123. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Matroska.pm +0 -892
  1124. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Microsoft.pm +0 -904
  1125. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Minolta.pm +0 -2961
  1126. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/MinoltaRaw.pm +0 -534
  1127. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Nikon.pm +0 -6751
  1128. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/NikonCapture.pm +0 -940
  1129. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/NikonCustom.pm +0 -6331
  1130. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Nintendo.pm +0 -128
  1131. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/OOXML.pm +0 -409
  1132. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Ogg.pm +0 -237
  1133. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Olympus.pm +0 -3797
  1134. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/OpenEXR.pm +0 -324
  1135. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PDF.pm +0 -2328
  1136. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PGF.pm +0 -143
  1137. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PICT.pm +0 -1260
  1138. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PLIST.pm +0 -453
  1139. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PNG.pm +0 -1227
  1140. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PPM.pm +0 -169
  1141. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PSP.pm +0 -306
  1142. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Palm.pm +0 -403
  1143. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Panasonic.pm +0 -2374
  1144. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PanasonicRaw.pm +0 -643
  1145. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Pentax.pm +0 -5973
  1146. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PhaseOne.pm +0 -551
  1147. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PhotoCD.pm +0 -507
  1148. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PhotoMechanic.pm +0 -256
  1149. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Photoshop.pm +0 -650
  1150. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PostScript.pm +0 -696
  1151. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PrintIM.pm +0 -125
  1152. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Qualcomm.pm +0 -1344
  1153. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/QuickTime.pm +0 -6576
  1154. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/README +0 -981
  1155. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/RIFF.pm +0 -1530
  1156. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/RSRC.pm +0 -241
  1157. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/RTF.pm +0 -383
  1158. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Radiance.pm +0 -144
  1159. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Rawzor.pm +0 -189
  1160. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Real.pm +0 -739
  1161. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Reconyx.pm +0 -190
  1162. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Ricoh.pm +0 -1148
  1163. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Samsung.pm +0 -1168
  1164. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Sanyo.pm +0 -440
  1165. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Scalado.pm +0 -141
  1166. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Shift.pl +0 -596
  1167. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Shortcuts.pm +0 -336
  1168. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Sigma.pm +0 -684
  1169. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/SigmaRaw.pm +0 -668
  1170. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Sony.pm +0 -9219
  1171. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/SonyIDC.pm +0 -331
  1172. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Stim.pm +0 -196
  1173. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/TagInfoXML.pm +0 -827
  1174. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/TagLookup.pm +0 -8948
  1175. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/TagNames.pod +0 -29199
  1176. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Theora.pm +0 -145
  1177. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Torrent.pm +0 -317
  1178. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Unknown.pm +0 -66
  1179. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/VCard.pm +0 -405
  1180. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Vorbis.pm +0 -238
  1181. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/WriteCanonRaw.pl +0 -637
  1182. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/WriteExif.pl +0 -3741
  1183. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/WriteIPTC.pl +0 -706
  1184. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/WritePDF.pl +0 -768
  1185. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/WritePNG.pl +0 -390
  1186. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/WritePhotoshop.pl +0 -266
  1187. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/WritePostScript.pl +0 -772
  1188. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/WriteQuickTime.pl +0 -358
  1189. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/WriteXMP.pl +0 -1367
  1190. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Writer.pl +0 -6165
  1191. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/XMP.pm +0 -4034
  1192. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/XMP2.pl +0 -1579
  1193. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/XMPStruct.pl +0 -828
  1194. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/ZIP.pm +0 -667
  1195. data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/iWork.pm +0 -223
  1196. data/bin/Image-ExifTool-10.04/perl-Image-ExifTool.spec +0 -112
  1197. data/bin/Image-ExifTool-10.04/t/APE_2.out +0 -29
  1198. data/bin/Image-ExifTool-10.04/t/CanonRaw_5.out +0 -209
  1199. data/bin/Image-ExifTool-10.04/t/DNG_2.out +0 -328
  1200. data/bin/Image-ExifTool-10.04/t/EXE.t +0 -31
  1201. data/bin/Image-ExifTool-10.04/t/EXE_2.out +0 -41
  1202. data/bin/Image-ExifTool-10.04/t/EXE_3.out +0 -16
  1203. data/bin/Image-ExifTool-10.04/t/EXE_4.out +0 -15
  1204. data/bin/Image-ExifTool-10.04/t/ExifTool.t +0 -304
  1205. data/bin/Image-ExifTool-10.04/t/ExifTool_17.out +0 -598
  1206. data/bin/Image-ExifTool-10.04/t/ExifTool_2.out +0 -418
  1207. data/bin/Image-ExifTool-10.04/t/FLAC_3.out +0 -20
  1208. data/bin/Image-ExifTool-10.04/t/FujiFilm_4.out +0 -141
  1209. data/bin/Image-ExifTool-10.04/t/Geotag.t +0 -185
  1210. data/bin/Image-ExifTool-10.04/t/IPTC_2.out +0 -60
  1211. data/bin/Image-ExifTool-10.04/t/IPTC_4.out +0 -58
  1212. data/bin/Image-ExifTool-10.04/t/MIFF_2.out +0 -110
  1213. data/bin/Image-ExifTool-10.04/t/Olympus_4.out +0 -194
  1214. data/bin/Image-ExifTool-10.04/t/Olympus_5.out +0 -266
  1215. data/bin/Image-ExifTool-10.04/t/Olympus_6.out +0 -153
  1216. data/bin/Image-ExifTool-10.04/t/Olympus_7.out +0 -483
  1217. data/bin/Image-ExifTool-10.04/t/PDF_2.out +0 -118
  1218. data/bin/Image-ExifTool-10.04/t/Photoshop_2.out +0 -98
  1219. data/bin/Image-ExifTool-10.04/t/Photoshop_3.out +0 -110
  1220. data/bin/Image-ExifTool-10.04/t/Sigma_4.out +0 -65
  1221. data/bin/Image-ExifTool-10.04/t/TestLib.pm +0 -427
  1222. data/bin/Image-ExifTool-10.04/t/Vorbis_2.out +0 -29
  1223. data/bin/Image-ExifTool-10.04/t/Writer_31.out +0 -99
  1224. data/bin/Image-ExifTool-10.04/t/Writer_51.out +0 -405
  1225. data/bin/Image-ExifTool-10.04/t/XMP.t +0 -557
@@ -1,324 +0,0 @@
1
- #------------------------------------------------------------------------------
2
- # File: OpenEXR.pm
3
- #
4
- # Description: Read OpenEXR meta information
5
- #
6
- # Revisions: 2011/12/10 - P. Harvey Created
7
- #
8
- # References: 1) http://www.openexr.com/
9
- #------------------------------------------------------------------------------
10
-
11
- package Image::ExifTool::OpenEXR;
12
-
13
- use strict;
14
- use vars qw($VERSION);
15
- use Image::ExifTool qw(:DataAccess :Utils);
16
-
17
- $VERSION = '1.01';
18
-
19
- # supported EXR value format types (other types are extracted as undef binary data)
20
- my %formatType = (
21
- box2f => 'float[4]',
22
- box2i => 'int32s[4]',
23
- chlist => 1,
24
- chromaticities => 'float[8]',
25
- compression => 'int8u',
26
- double => 'double',
27
- envmap => 'int8u',
28
- float => 'float',
29
- 'int' => 'int32s',
30
- keycode => 'int32s[7]',
31
- lineOrder => 'int8u',
32
- m33f => 'float[9]',
33
- m44f => 'float[16]',
34
- rational => 'rational64s',
35
- string => 'string', # incorrect in specification! (no leading int)
36
- stringvector => 1,
37
- tiledesc => 1,
38
- timecode => 'int32u[2]',
39
- v2f => 'float[2]',
40
- v2i => 'int32s[2]',
41
- v3f => 'float[3]',
42
- v3i => 'int32s[3]',
43
- );
44
-
45
- # OpenEXR tags
46
- %Image::ExifTool::OpenEXR::Main = (
47
- GROUPS => { 2 => 'Image' },
48
- NOTES => q{
49
- Information extracted from EXR images. See L<http://www.openexr.com/> for
50
- the official specification.
51
- },
52
- _ver => { Name => 'EXRVersion' },
53
- _lay => {
54
- Name => 'Layout',
55
- PrintHex => 1,
56
- PrintConv => { 0 => 'Scan Lines', 0x200 => 'Tiles' },
57
- },
58
- adoptedNeutral => { },
59
- altitude => {
60
- Name => 'GPSAltitude',
61
- Groups => { 2 => 'Location' },
62
- PrintConv => q{
63
- $val = int($val * 10) / 10;
64
- return ($val =~ s/^-// ? "$val m Below" : "$val m Above") . " Sea Level";
65
- },
66
- },
67
- aperture => { PrintConv => 'sprintf("%.1f",$val)' },
68
- channels => { },
69
- chromaticities => { },
70
- capDate => {
71
- Name => 'DateTimeOriginal',
72
- Groups => { 2 => 'Time' },
73
- PrintConv => '$self->ConvertDateTime($val)',
74
- },
75
- comments => { },
76
- compression => {
77
- PrintConvColumns => 2,
78
- PrintConv => {
79
- 0 => 'None',
80
- 1 => 'RLE',
81
- 2 => 'ZIPS',
82
- 3 => 'ZIP',
83
- 4 => 'PIZ',
84
- 5 => 'PXR24',
85
- 6 => 'B44',
86
- 7 => 'B44A',
87
- },
88
- },
89
- dataWindow => { },
90
- displayWindow => { },
91
- envmap => {
92
- Name => 'EnvironmentMap',
93
- PrintConv => {
94
- 0 => 'Latitude/Longitude',
95
- 1 => 'Cube',
96
- },
97
- },
98
- expTime => {
99
- Name => 'ExposureTime',
100
- PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
101
- },
102
- focus => {
103
- Name => 'FocusDistance',
104
- PrintConv => '"$val m"',
105
- },
106
- framesPerSecond => { },
107
- keyCode => { },
108
- isoSpeed => { Name => 'ISO' },
109
- latitude => {
110
- Name => 'GPSLatitude',
111
- Groups => { 2 => 'Location' },
112
- RawConv => 'require Image::ExifTool::GPS; $val', # to load Composite tags and routines
113
- PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")',
114
- },
115
- lineOrder => {
116
- PrintConv => {
117
- 0 => 'Increasing Y',
118
- 1 => 'Decreasing Y',
119
- 2 => 'Random Y',
120
- },
121
- },
122
- longitude => {
123
- Name => 'GPSLongitude',
124
- Groups => { 2 => 'Location' },
125
- RawConv => 'require Image::ExifTool::GPS; $val', # to load Composite tags and routines
126
- PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
127
- },
128
- lookModTransform => { },
129
- multiView => { },
130
- owner => { Groups => { 2 => 'Author' } },
131
- pixelAspectRatio => { },
132
- preview => { },
133
- renderingTransform => { },
134
- screenWindowCenter => { },
135
- screenWindowWidth => { },
136
- tiles => { },
137
- timeCode => { },
138
- utcOffset => {
139
- Name => 'TimeZone',
140
- Groups => { 2 => 'Time' },
141
- PrintConv => 'TimeZoneString($val / 60)',
142
- },
143
- whiteLuminance => { },
144
- worldToCamera => { },
145
- worldToNDC => { },
146
- wrapmodes => { Name => 'WrapModes' },
147
- xDensity => { Name => 'XResolution' },
148
- # also observed:
149
- # ilut
150
- );
151
-
152
- #------------------------------------------------------------------------------
153
- # Extract information from an OpenEXR file
154
- # Inputs: 0) ExifTool object reference, 1) DirInfo reference
155
- # Returns: 1 on success, 0 if this wasn't a valid OpenEXR file
156
- sub ProcessEXR($$)
157
- {
158
- my ($et, $dirInfo) = @_;
159
- my $raf = $$dirInfo{RAF};
160
- my $verbose = $et->Options('Verbose');
161
- my $binary = $et->Options('Binary') || $verbose;
162
- my ($buff, $buf2, $dim);
163
-
164
- # verify this is a valid RIFF file
165
- return 0 unless $raf->Read($buff, 8) == 8;
166
- return 0 unless $buff =~ /^\x76\x2f\x31\x01/s;
167
- $et->SetFileType();
168
- SetByteOrder('II');
169
- my $tagTablePtr = GetTagTable('Image::ExifTool::OpenEXR::Main');
170
-
171
- # extract information from header
172
- my $ver = unpack('x4V', $buff);
173
- $et->HandleTag($tagTablePtr, '_ver', $ver & 0xff);
174
- $et->HandleTag($tagTablePtr, '_lay', $ver & 0x200);
175
-
176
- # extract attributes
177
- for (;;) {
178
- $raf->Read($buff, 68) or last;
179
- last if $buff =~ /^\0/;
180
- unless ($buff =~ /^([^\0]{1,31})\0([^\0]{1,31})\0(.{4})/sg) {
181
- $et->Warn('EXR format error');
182
- last;
183
- }
184
- my ($tag, $type, $size) = ($1, $2, unpack('V', $3));
185
- unless ($raf->Seek(pos($buff) - length($buff), 1)) {
186
- $et->Warn('Seek error');
187
- last;
188
- }
189
- my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
190
- unless ($tagInfo) {
191
- my $name = ucfirst $tag;
192
- $name =~ tr/-_a-zA-Z0-9//dc;
193
- if (length $name <= 1) {
194
- if (length $name) {
195
- $name = "Tag$name";
196
- } else {
197
- $name = 'Invalid';
198
- }
199
- }
200
- $tagInfo = { Name => $name, WasAdded => 1 };
201
- AddTagToTable($tagTablePtr, $tag, $tagInfo);
202
- $et->VPrint(0, $$et{INDENT}, "[adding $tag]\n");
203
- }
204
- my ($val, $success);
205
- my $format = $formatType{$type};
206
- if ($format or $binary) {
207
- $raf->Read($buff, $size) == $size and $success = 1;
208
- if (not $format) {
209
- $val = \$buff; # treat as undef binary data
210
- } elsif ($format ne '1') {
211
- # handle formats which map nicely into ExifTool format codes
212
- if ($format =~ /^(\w+)\[?(\d*)/) {
213
- my ($fmt, $cnt) = ($1, $2);
214
- $cnt = $fmt eq 'string' ? $size : 1 unless $cnt;
215
- $val = ReadValue(\$buff, 0, $fmt, $cnt, $size);
216
- }
217
- # handle other format types
218
- } elsif ($type eq 'tiledesc') {
219
- if ($size >= 9) {
220
- my $x = Get32u(\$buff, 0);
221
- my $y = Get32u(\$buff, 4);
222
- my $mode = Get8u(\$buff, 8);
223
- my $lvl = { 0 => 'One Level', 1 => 'MIMAP Levels', 2 => 'RIPMAP Levels' }->{$mode & 0x0f};
224
- $lvl or $lvl = 'Unknown Levels (' . ($mode & 0xf) . ')';
225
- my $rnd = { 0 => 'Round Down', 1 => 'Round Up' }->{$mode >> 4};
226
- $rnd or $rnd = 'Unknown Rounding (' . ($mode >> 4) . ')';
227
- $val = "${x}x$y; $lvl; $rnd";
228
- }
229
- } elsif ($type eq 'chlist') {
230
- $val = [ ];
231
- while ($buff =~ /\G([^\0]{1,31})\0(.{16})/sg) {
232
- my ($str, $dat) = ($1, $2);
233
- my ($pix,$lin,$x,$y) = unpack('VCx3VV', $dat);
234
- $pix = { 0 => 'int8u', 1 => 'half', 2 => 'float' }->{$pix} || "unknown($pix)";
235
- push @$val, "$str $pix" . ($lin ? ' linear' : '') . " $x $y";
236
- }
237
- } elsif ($type eq 'stringvector') {
238
- $val = [ ];
239
- my $pos = 0;
240
- while ($pos + 4 <= length($buff)) {
241
- my $len = Get32u(\$buff, $pos);
242
- last if $pos + 4 + $len > length($buff);
243
- push @$val, substr($buff, $pos + 4, $len);
244
- $pos += 4 + $len;
245
- }
246
- } else {
247
- $val = \$buff; # (shouldn't happen)
248
- }
249
- } else {
250
- # avoid loading binary data
251
- $val = \ "Binary data $size bytes";
252
- $success = $raf->Seek($size, 1);
253
- }
254
- unless ($success) {
255
- $et->Warn('Truncated or corrupted EXR file');
256
- last;
257
- }
258
- $val = '<bad>' unless defined $val;
259
-
260
- # take image dimensions from dataWindow (with displayWindow as backup)
261
- if (($tag eq 'dataWindow' or (not $dim and $tag eq 'displayWindow')) and
262
- $val =~ /^(-?\d+) (-?\d+) (-?\d+) (-?\d+)$/)
263
- {
264
- $dim = [$3 - $1 + 1, $4 - $2 + 1];
265
- }
266
- if ($verbose) {
267
- my $dataPt = ref $val ? $val : \$val,
268
- $et->VerboseInfo($tag, $tagInfo,
269
- Table => $tagTablePtr,
270
- Value => $val,
271
- Size => $size,
272
- Format => $type,
273
- DataPt => \$buff,
274
- Addr => $raf->Tell() - $size,
275
- );
276
- }
277
- $et->FoundTag($tagInfo, $val);
278
- }
279
- if ($dim) {
280
- $et->FoundTag('ImageWidth', $$dim[0]);
281
- $et->FoundTag('ImageHeight', $$dim[1]);
282
- }
283
- return 1;
284
- }
285
-
286
- 1; # end
287
-
288
- __END__
289
-
290
- =head1 NAME
291
-
292
- Image::ExifTool::OpenEXR - Read OpenEXR meta information
293
-
294
- =head1 SYNOPSIS
295
-
296
- This module is used by Image::ExifTool
297
-
298
- =head1 DESCRIPTION
299
-
300
- This module contains definitions required by Image::ExifTool to extract meta
301
- information from OpenEXR images.
302
-
303
- =head1 AUTHOR
304
-
305
- Copyright 2003-2015, Phil Harvey (phil at owl.phy.queensu.ca)
306
-
307
- This library is free software; you can redistribute it and/or modify it
308
- under the same terms as Perl itself.
309
-
310
- =head1 REFERENCES
311
-
312
- =over 4
313
-
314
- =item L<http://www.openexr.com/documentation.html>
315
-
316
- =back
317
-
318
- =head1 SEE ALSO
319
-
320
- L<Image::ExifTool::TagNames/OpenEXR Tags>,
321
- L<Image::ExifTool(3pm)|Image::ExifTool>
322
-
323
- =cut
324
-
@@ -1,2328 +0,0 @@
1
- #------------------------------------------------------------------------------
2
- # File: PDF.pm
3
- #
4
- # Description: Read PDF meta information
5
- #
6
- # Revisions: 07/11/2005 - P. Harvey Created
7
- # 07/25/2005 - P. Harvey Add support for encrypted documents
8
- #
9
- # References: 1) http://www.adobe.com/devnet/pdf/pdf_reference.html
10
- # 2) http://search.cpan.org/dist/Crypt-RC4/
11
- # 3) http://www.adobe.com/devnet/acrobat/pdfs/PDF32000_2008.pdf
12
- # 4) http://www.adobe.com/content/dam/Adobe/en/devnet/pdf/pdfs/adobe_supplement_iso32000.pdf
13
- # 5) http://tools.ietf.org/search/rfc3454
14
- # 6) http://www.armware.dk/RFC/rfc/rfc4013.html
15
- #------------------------------------------------------------------------------
16
-
17
- package Image::ExifTool::PDF;
18
-
19
- use strict;
20
- use vars qw($VERSION $AUTOLOAD $lastFetched);
21
- use Image::ExifTool qw(:DataAccess :Utils);
22
- require Exporter;
23
-
24
- $VERSION = '1.38';
25
-
26
- sub FetchObject($$$$);
27
- sub ExtractObject($$;$$);
28
- sub ReadToNested($;$);
29
- sub ProcessDict($$$$;$$);
30
- sub ProcessAcroForm($$$$;$$);
31
- sub ReadPDFValue($);
32
- sub CheckPDF($$$);
33
-
34
- # $lastFetched - last fetched object reference (used for decryption)
35
- # (undefined if fetched object was already decrypted, eg. object from stream)
36
-
37
- my $cryptInfo; # encryption object reference (plus additional information)
38
- my $cryptString; # flag that strings are encrypted
39
- my $cryptStream; # flag that streams are encrypted
40
- my $lastOffset; # last fetched object offset
41
- my %streamObjs; # hash of stream objects
42
- my %fetched; # dicts fetched in verbose mode (to avoid cyclical recursion)
43
- my $pdfVer; # version of PDF file being processed
44
-
45
- # filters supported in DecodeStream()
46
- my %supportedFilter = (
47
- '/FlateDecode' => 1,
48
- '/Crypt' => 1,
49
- '/Identity' => 1, # (not filtered)
50
- '/DCTDecode' => 1, # (JPEG image - not filtered)
51
- '/JPXDecode' => 1, # (Jpeg2000 image - not filtered)
52
- '/LZWDecode' => 1, # (usually a bitmapped image)
53
- '/ASCIIHexDecode' => 1,
54
- # other standard filters that we currently don't support
55
- #'/JBIG2Decode' => 0, # (JBIG2 image format not supported)
56
- #'/CCITTFaxDecode' => 0,
57
- #'/RunLengthDecode' => 0,
58
- #'/ASCII85Decode' => 0,
59
- );
60
-
61
- # tags in main PDF directories
62
- %Image::ExifTool::PDF::Main = (
63
- GROUPS => { 2 => 'Document' },
64
- VARS => { CAPTURE => ['Main','Prev'] },
65
- Info => {
66
- SubDirectory => { TagTable => 'Image::ExifTool::PDF::Info' },
67
- # Adobe Acrobat 10.1.5 will create a duplicate Info dictionary with
68
- # a different object number when metadata is edited. This flag
69
- # is part of a patch to ignore this duplicate information (unless
70
- # the IgnoreMinorErrors option is used)
71
- IgnoreDuplicates => 1,
72
- },
73
- Root => {
74
- SubDirectory => { TagTable => 'Image::ExifTool::PDF::Root' },
75
- },
76
- Encrypt => {
77
- NoProcess => 1, # don't process normally (processed in advance)
78
- SubDirectory => { TagTable => 'Image::ExifTool::PDF::Encrypt' },
79
- },
80
- _linearized => {
81
- Name => 'Linearized',
82
- Notes => 'flag set if document is linearized for fast web display; not a real Tag ID',
83
- PrintConv => { 'true' => 'Yes', 'false' => 'No' },
84
- },
85
- );
86
-
87
- # tags in PDF Info dictionary
88
- %Image::ExifTool::PDF::Info = (
89
- GROUPS => { 2 => 'Document' },
90
- VARS => { CAPTURE => ['Info'] },
91
- EXTRACT_UNKNOWN => 1, # extract all unknown tags in this directory
92
- WRITE_PROC => \&Image::ExifTool::DummyWriteProc,
93
- CHECK_PROC => \&CheckPDF,
94
- WRITABLE => 'string',
95
- # set PRIORITY to 0 so most recent Info dictionary takes precedence
96
- # (Acrobat Pro bug? doesn't use same object/generation number for
97
- # new Info dictionary when doing incrmental update)
98
- PRIORITY => 0,
99
- NOTES => q{
100
- As well as the tags listed below, the PDF specification allows for
101
- user-defined tags to exist in the Info dictionary. These tags, which should
102
- have corresponding XMP-pdfx entries in the XMP of the PDF XML Metadata
103
- object, are also extracted by ExifTool.
104
-
105
- B<Writable> specifies the value format, and may be C<string>, C<date>,
106
- C<integer>, C<real>, C<boolean> or C<name> for PDF tags.
107
- },
108
- Title => { },
109
- Author => { Groups => { 2 => 'Author' } },
110
- Subject => { },
111
- Keywords => { List => 'string' }, # this is a string list
112
- Creator => { },
113
- Producer => { },
114
- CreationDate => {
115
- Name => 'CreateDate',
116
- Writable => 'date',
117
- Groups => { 2 => 'Time' },
118
- Shift => 'Time',
119
- PrintConv => '$self->ConvertDateTime($val)',
120
- PrintConvInv => '$self->InverseDateTime($val)',
121
- },
122
- ModDate => {
123
- Name => 'ModifyDate',
124
- Writable => 'date',
125
- Groups => { 2 => 'Time' },
126
- Shift => 'Time',
127
- PrintConv => '$self->ConvertDateTime($val)',
128
- PrintConvInv => '$self->InverseDateTime($val)',
129
- },
130
- Trapped => {
131
- Protected => 1,
132
- # remove leading '/' from '/True' or '/False'
133
- ValueConv => '$val=~s{^/}{}; $val',
134
- ValueConvInv => '"/$val"',
135
- },
136
- 'AAPL:Keywords' => { #PH
137
- Name => 'AppleKeywords',
138
- List => 'array', # this is an array of values
139
- Notes => q{
140
- keywords written by Apple utilities, although they seem to use PDF:Keywords
141
- when reading
142
- },
143
- },
144
- );
145
-
146
- # tags in the PDF Root document catalog
147
- %Image::ExifTool::PDF::Root = (
148
- GROUPS => { 2 => 'Document' },
149
- # note: can't capture previous versions of Root since they are not parsed
150
- VARS => { CAPTURE => ['Root'] },
151
- NOTES => 'This is the PDF document catalog.',
152
- MarkInfo => {
153
- SubDirectory => { TagTable => 'Image::ExifTool::PDF::MarkInfo' },
154
- },
155
- Metadata => {
156
- SubDirectory => { TagTable => 'Image::ExifTool::PDF::Metadata' },
157
- },
158
- Pages => {
159
- SubDirectory => { TagTable => 'Image::ExifTool::PDF::Pages' },
160
- },
161
- Perms => {
162
- SubDirectory => { TagTable => 'Image::ExifTool::PDF::Perms' },
163
- },
164
- AcroForm => {
165
- SubDirectory => { TagTable => 'Image::ExifTool::PDF::AcroForm' },
166
- },
167
- Lang => 'Language',
168
- PageLayout => { },
169
- PageMode => { },
170
- Version => 'PDFVersion',
171
- );
172
-
173
- # tags extracted from the PDF Encrypt dictionary
174
- %Image::ExifTool::PDF::Encrypt = (
175
- GROUPS => { 2 => 'Document' },
176
- NOTES => 'Tags extracted from the document Encrypt dictionary.',
177
- Filter => {
178
- Name => 'Encryption',
179
- Notes => q{
180
- extracted value is actually a combination of the Filter, SubFilter, V, R and
181
- Length information from the Encrypt dictionary
182
- },
183
- },
184
- P => {
185
- Name => 'UserAccess',
186
- ValueConv => '$val & 0x0f3c', # ignore reserved bits
187
- PrintConvColumns => 2,
188
- PrintConv => { BITMASK => {
189
- 2 => 'Print',
190
- 3 => 'Modify',
191
- 4 => 'Copy',
192
- 5 => 'Annotate',
193
- 8 => 'Fill forms',
194
- 9 => 'Extract',
195
- 10 => 'Assemble',
196
- 11 => 'Print high-res',
197
- }},
198
- },
199
- );
200
-
201
- # tags in PDF Pages dictionary
202
- %Image::ExifTool::PDF::Pages = (
203
- GROUPS => { 2 => 'Document' },
204
- Count => 'PageCount',
205
- Kids => {
206
- SubDirectory => { TagTable => 'Image::ExifTool::PDF::Kids' },
207
- },
208
- );
209
-
210
- # tags in PDF Perms dictionary
211
- %Image::ExifTool::PDF::Perms = (
212
- NOTES => 'Additional document permissions imposed by digital signatures.',
213
- DocMDP => {
214
- SubDirectory => { TagTable => 'Image::ExifTool::PDF::Signature' },
215
- },
216
- FieldMDP => {
217
- SubDirectory => { TagTable => 'Image::ExifTool::PDF::Signature' },
218
- },
219
- UR3 => {
220
- SubDirectory => { TagTable => 'Image::ExifTool::PDF::Signature' },
221
- },
222
- );
223
-
224
- # tags in PDF Perms dictionary
225
- %Image::ExifTool::PDF::AcroForm = (
226
- PROCESS_PROC => \&ProcessAcroForm,
227
- _has_xfa => {
228
- Name => 'HasXFA',
229
- Notes => q{
230
- this tag is defined if a document contains form fields, and is true if it
231
- uses XML Forms Architecture; not a real Tag ID
232
- },
233
- PrintConv => { 'true' => 'Yes', 'false' => 'No' },
234
- },
235
- );
236
-
237
- # tags in PDF Kids dictionary
238
- %Image::ExifTool::PDF::Kids = (
239
- Metadata => {
240
- SubDirectory => { TagTable => 'Image::ExifTool::PDF::Metadata' },
241
- },
242
- PieceInfo => {
243
- SubDirectory => { TagTable => 'Image::ExifTool::PDF::PieceInfo' },
244
- },
245
- Resources => {
246
- SubDirectory => { TagTable => 'Image::ExifTool::PDF::Resources' },
247
- },
248
- Kids => {
249
- Condition => '$self->Options("ExtractEmbedded")',
250
- SubDirectory => { TagTable => 'Image::ExifTool::PDF::Kids' },
251
- },
252
- );
253
-
254
- # tags in PDF Resources dictionary
255
- %Image::ExifTool::PDF::Resources = (
256
- ColorSpace => {
257
- SubDirectory => { TagTable => 'Image::ExifTool::PDF::ColorSpace' },
258
- },
259
- XObject => {
260
- Condition => '$self->Options("ExtractEmbedded")',
261
- SubDirectory => { TagTable => 'Image::ExifTool::PDF::XObject' },
262
- },
263
- Properties => {
264
- Condition => '$self->Options("ExtractEmbedded")',
265
- SubDirectory => { TagTable => 'Image::ExifTool::PDF::Properties' },
266
- },
267
- );
268
-
269
- # tags in PDF ColorSpace dictionary
270
- %Image::ExifTool::PDF::ColorSpace = (
271
- DefaultRGB => {
272
- SubDirectory => { TagTable => 'Image::ExifTool::PDF::DefaultRGB' },
273
- },
274
- Cs1 => {
275
- SubDirectory => { TagTable => 'Image::ExifTool::PDF::Cs1' },
276
- },
277
- );
278
-
279
- # tags in PDF DefaultRGB dictionary
280
- %Image::ExifTool::PDF::DefaultRGB = (
281
- ICCBased => {
282
- SubDirectory => { TagTable => 'Image::ExifTool::PDF::ICCBased' },
283
- },
284
- );
285
-
286
- # tags in PDF Cs1 dictionary
287
- %Image::ExifTool::PDF::Cs1 = (
288
- _stream => {
289
- SubDirectory => { TagTable => 'Image::ExifTool::ICC_Profile::Main' },
290
- },
291
- );
292
-
293
- # tags in PDF ICCBased dictionary
294
- %Image::ExifTool::PDF::ICCBased = (
295
- _stream => {
296
- SubDirectory => { TagTable => 'Image::ExifTool::ICC_Profile::Main' },
297
- },
298
- );
299
-
300
- # tags in PDF XObject dictionary (parsed only if ExtractEmbedded is enabled)
301
- %Image::ExifTool::PDF::XObject = (
302
- EXTRACT_UNKNOWN => 0, # extract known but numbered tags (Im1, Im2, etc)
303
- Im => {
304
- Notes => q{
305
- the ExtractEmbedded option enables information to be extracted from these
306
- embedded images
307
- },
308
- SubDirectory => { TagTable => 'Image::ExifTool::PDF::Im' },
309
- },
310
- );
311
-
312
- # tags in PDF Im# dictionary
313
- %Image::ExifTool::PDF::Im = (
314
- NOTES => q{
315
- Information extracted from embedded images with the ExtractEmbedded option.
316
- The EmbeddedImage and its metadata are extracted only for JPEG and Jpeg2000
317
- image formats.
318
- },
319
- Width => 'EmbeddedImageWidth',
320
- Height => 'EmbeddedImageHeight',
321
- Filter => { Name => 'EmbeddedImageFilter', List => 1 },
322
- ColorSpace => {
323
- Name => 'EmbeddedImageColorSpace',
324
- List => 1,
325
- RawConv => 'ref $val ? undef : $val', # (ignore color space data)
326
- },
327
- Image_stream => {
328
- Name => 'EmbeddedImage',
329
- Groups => { 2 => 'Preview' },
330
- Binary => 1,
331
- },
332
- );
333
-
334
- # tags in PDF Properties dictionary
335
- %Image::ExifTool::PDF::Properties = (
336
- EXTRACT_UNKNOWN => 0, # extract known but numbered tags (MC0, MC1, etc)
337
- MC => {
338
- Notes => q{
339
- the ExtractEmbedded option enables information to be extracted from these
340
- embedded metadata dictionaries
341
- },
342
- SubDirectory => { TagTable => 'Image::ExifTool::PDF::MC' },
343
- }
344
- );
345
-
346
- # tags in PDF MC# dictionary
347
- %Image::ExifTool::PDF::MC = (
348
- Metadata => {
349
- SubDirectory => { TagTable => 'Image::ExifTool::PDF::Metadata' },
350
- }
351
- );
352
-
353
- # tags in PDF PieceInfo dictionary
354
- %Image::ExifTool::PDF::PieceInfo = (
355
- AdobePhotoshop => {
356
- SubDirectory => { TagTable => 'Image::ExifTool::PDF::AdobePhotoshop' },
357
- },
358
- Illustrator => {
359
- # assume this is an illustrator file if it contains this directory
360
- # and doesn't have a ".PDF" extension
361
- Condition => q{
362
- $self->OverrideFileType("AI") unless $$self{FILE_EXT} and $$self{FILE_EXT} eq 'PDF';
363
- return 1;
364
- },
365
- SubDirectory => { TagTable => 'Image::ExifTool::PDF::Illustrator' },
366
- },
367
- );
368
-
369
- # tags in PDF AdobePhotoshop dictionary
370
- %Image::ExifTool::PDF::AdobePhotoshop = (
371
- Private => {
372
- SubDirectory => { TagTable => 'Image::ExifTool::PDF::Private' },
373
- },
374
- );
375
-
376
- # tags in PDF Illustrator dictionary
377
- %Image::ExifTool::PDF::Illustrator = (
378
- Private => {
379
- SubDirectory => { TagTable => 'Image::ExifTool::PDF::AIPrivate' },
380
- },
381
- );
382
-
383
- # tags in PDF Private dictionary
384
- %Image::ExifTool::PDF::Private = (
385
- ImageResources => {
386
- SubDirectory => { TagTable => 'Image::ExifTool::PDF::ImageResources' },
387
- },
388
- );
389
-
390
- # tags in PDF AI Private dictionary
391
- %Image::ExifTool::PDF::AIPrivate = (
392
- GROUPS => { 2 => 'Document' },
393
- EXTRACT_UNKNOWN => 0, # extract known but numbered tags
394
- AIMetaData => {
395
- SubDirectory => { TagTable => 'Image::ExifTool::PDF::AIMetaData' },
396
- },
397
- AIPrivateData => {
398
- Notes => q{
399
- the ExtractEmbedded option enables information to be extracted from embedded
400
- PostScript documents in the AIPrivateData# and AIPDFPrivateData# streams
401
- },
402
- JoinStreams => 1, # join streams from numbered tags and process as one
403
- SubDirectory => { TagTable => 'Image::ExifTool::PostScript::Main' },
404
- },
405
- AIPDFPrivateData => {
406
- JoinStreams => 1, # join streams from numbered tags and process as one
407
- SubDirectory => { TagTable => 'Image::ExifTool::PostScript::Main' },
408
- },
409
- RoundTripVersion => { },
410
- ContainerVersion => { },
411
- CreatorVersion => { },
412
- );
413
-
414
- # tags in PDF AIMetaData dictionary
415
- %Image::ExifTool::PDF::AIMetaData = (
416
- _stream => {
417
- SubDirectory => { TagTable => 'Image::ExifTool::PostScript::Main' },
418
- },
419
- );
420
-
421
- # tags in PDF ImageResources dictionary
422
- %Image::ExifTool::PDF::ImageResources = (
423
- _stream => {
424
- SubDirectory => { TagTable => 'Image::ExifTool::Photoshop::Main' },
425
- },
426
- );
427
-
428
- # tags in PDF MarkInfo dictionary
429
- %Image::ExifTool::PDF::MarkInfo = (
430
- GROUPS => { 2 => 'Document' },
431
- Marked => {
432
- Name => 'TaggedPDF',
433
- Notes => "not a Tagged PDF if this tag is missing",
434
- PrintConv => { 'true' => 'Yes', 'false' => 'No' },
435
- },
436
- );
437
-
438
- # tags in PDF Metadata dictionary
439
- %Image::ExifTool::PDF::Metadata = (
440
- GROUPS => { 2 => 'Document' },
441
- XML_stream => { # this is the stream for a Subtype /XML dictionary (not a real tag)
442
- Name => 'XMP',
443
- SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' },
444
- },
445
- );
446
-
447
- # tags in PDF signature directories (DocMDP, FieldMDP or UR3)
448
- %Image::ExifTool::PDF::Signature = (
449
- GROUPS => { 2 => 'Document' },
450
- ContactInfo => 'SignerContactInfo',
451
- Location => 'SigningLocation',
452
- M => {
453
- Name => 'SigningDate',
454
- Format => 'date',
455
- Groups => { 2 => 'Time' },
456
- PrintConv => '$self->ConvertDateTime($val)',
457
- },
458
- Name => 'SigningAuthority',
459
- Reason => 'SigningReason',
460
- Reference => {
461
- SubDirectory => { TagTable => 'Image::ExifTool::PDF::Reference' },
462
- },
463
- Prop_AuthTime => {
464
- Name => 'AuthenticationTime',
465
- PrintConv => 'ConvertTimeSpan($val) . " ago"',
466
- },
467
- Prop_AuthType => 'AuthenticationType',
468
- );
469
-
470
- # tags in PDF Reference dictionary
471
- %Image::ExifTool::PDF::Reference = (
472
- TransformParams => {
473
- SubDirectory => { TagTable => 'Image::ExifTool::PDF::TransformParams' },
474
- },
475
- );
476
-
477
- # tags in PDF TransformParams dictionary
478
- %Image::ExifTool::PDF::TransformParams = (
479
- GROUPS => { 2 => 'Document' },
480
- Annots => {
481
- Name => 'AnnotationUsageRights',
482
- Notes => q{
483
- possible values are Create, Delete, Modify, Copy, Import and Export;
484
- additional values for UR3 signatures are Online and SummaryView
485
- },
486
- List => 1,
487
- },
488
- Document => {
489
- Name => 'DocumentUsageRights',
490
- Notes => 'only possible value is FullSave',
491
- List => 1,
492
- },
493
- Form => {
494
- Name => 'FormUsageRights',
495
- Notes => q{
496
- possible values are FillIn, Import, Export, SubmitStandalone and
497
- SpawnTemplate; additional values for UR3 signatures are BarcodePlaintext and
498
- Online
499
- },
500
- List => 1,
501
- },
502
- FormEX => {
503
- Name => 'FormExtraUsageRights',
504
- Notes => 'UR signatures only; only possible value is BarcodePlaintext',
505
- List => 1,
506
- },
507
- Signature => {
508
- Name => 'SignatureUsageRights',
509
- Notes => 'only possible value is Modify',
510
- List => 1,
511
- },
512
- EF => {
513
- Name => 'EmbeddedFileUsageRights',
514
- Notes => 'possible values are Create, Delete, Modify and Import',
515
- List => 1,
516
- },
517
- Msg => 'UsageRightsMessage',
518
- P => {
519
- Name => 'ModificationPermissions',
520
- Notes => q{
521
- 1-3 for DocMDP signatures, default 2; true/false for UR3 signatures, default
522
- false
523
- },
524
- PrintConv => {
525
- 1 => 'No changes permitted',
526
- 2 => 'Fill forms, Create page templates, Sign',
527
- 3 => 'Fill forms, Create page templates, Sign, Create/Delete/Edit annotations',
528
- 'true' => 'Restrict all applications to reader permissions',
529
- 'false' => 'Do not restrict applications to reader permissions',
530
- },
531
- },
532
- Action => {
533
- Name => 'FieldPermissions',
534
- Notes => 'FieldMDP signatures only',
535
- PrintConv => {
536
- 'All' => 'Disallow changes to all form fields',
537
- 'Include' => 'Disallow changes to specified form fields',
538
- 'Exclude' => 'Allow changes to specified form fields',
539
- },
540
- },
541
- Fields => {
542
- Notes => 'FieldMDP signatures only',
543
- Name => 'FormFields',
544
- List => 1,
545
- },
546
- );
547
-
548
- # unknown tags for use in verbose option
549
- %Image::ExifTool::PDF::Unknown = (
550
- GROUPS => { 2 => 'Unknown' },
551
- );
552
-
553
- #------------------------------------------------------------------------------
554
- # AutoLoad our writer routines when necessary
555
- #
556
- sub AUTOLOAD
557
- {
558
- return Image::ExifTool::DoAutoLoad($AUTOLOAD, @_);
559
- }
560
-
561
- #------------------------------------------------------------------------------
562
- # Convert from PDF to EXIF-style date/time
563
- # Inputs: 0) PDF date/time string (D:YYYYmmddHHMMSS+HH'MM')
564
- # Returns: EXIF date string (YYYY:mm:dd HH:MM:SS+HH:MM)
565
- sub ConvertPDFDate($)
566
- {
567
- my $date = shift;
568
- # remove optional 'D:' prefix
569
- $date =~ s/^D://;
570
- # fill in default values if necessary
571
- # YYYYmmddHHMMSS
572
- my $default = '00000101000000';
573
- if (length $date < length $default) {
574
- $date .= substr($default, length $date);
575
- }
576
- $date =~ /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(.*)/ or return $date;
577
- $date = "$1:$2:$3 $4:$5:$6";
578
- if ($7) {
579
- my $tz = $7;
580
- if ($tz =~ /^\s*Z/i) {
581
- # ignore any "HH'mm'" after the Z (OS X 10.6 does this)
582
- $date .= 'Z';
583
- # tolerate some improper formatting in timezone specification
584
- } elsif ($tz =~ /^\s*([-+])\s*(\d+)[': ]+(\d*)/) {
585
- $date .= $1 . $2 . ':' . ($3 || '00');
586
- }
587
- }
588
- return $date;
589
- }
590
-
591
- #------------------------------------------------------------------------------
592
- # Locate any object in the XRef tables (including compressed objects)
593
- # Inputs: 0) XRef reference, 1) object reference string (or free object number)
594
- # Returns: offset to object in file or compressed object reference string,
595
- # 0 if object is free, or undefined on error
596
- sub LocateAnyObject($$)
597
- {
598
- my ($xref, $ref) = @_;
599
- return undef unless $xref;
600
- return $$xref{$ref} if exists $$xref{$ref};
601
- # get the object number
602
- return undef unless $ref =~ /^(\d+)/;
603
- my $objNum = $1;
604
- # return 0 if the object number has been reused (old object is free)
605
- return 0 if defined $$xref{$objNum};
606
- #
607
- # scan our XRef stream dictionaries for this object
608
- #
609
- return undef unless $$xref{dicts};
610
- my $dict;
611
- foreach $dict (@{$$xref{dicts}}) {
612
- # quick check to see if the object is in the range for this xref stream
613
- next if $objNum >= $$dict{Size};
614
- my $index = $$dict{Index};
615
- next if $objNum < $$index[0];
616
- # scan the tables for the specified object
617
- my $size = $$dict{_entry_size};
618
- my $num = scalar(@$index) / 2;
619
- my $tot = 0;
620
- my $i;
621
- for ($i=0; $i<$num; ++$i) {
622
- my $start = $$index[$i*2];
623
- my $count = $$index[$i*2+1];
624
- # table is in ascending order, so quit if we have passed the object
625
- last if $objNum < $start;
626
- if ($objNum < $start + $count) {
627
- my $offset = $size * ($objNum - $start + $tot);
628
- last if $offset + $size > length $$dict{_stream};
629
- my @c = unpack("x$offset C$size", $$dict{_stream});
630
- # extract values from this table entry
631
- # (can be 1, 2, 3, 4, etc.. bytes per value)
632
- my (@t, $j, $k);
633
- my $w = $$dict{W};
634
- for ($j=0; $j<3; ++$j) {
635
- # use default value if W entry is 0 (as per spec)
636
- # - 0th element defaults to 1, others default to 0
637
- $$w[$j] or $t[$j] = ($j ? 0 : 1), next;
638
- $t[$j] = shift(@c);
639
- for ($k=1; $k < $$w[$j]; ++$k) {
640
- $t[$j] = 256 * $t[$j] + shift(@c);
641
- }
642
- }
643
- # by default, use "o g R" as the xref key
644
- # (o = object number, g = generation number)
645
- my $ref2 = "$objNum $t[2] R";
646
- if ($t[0] == 1) {
647
- # normal object reference:
648
- # $t[1]=offset of object from start, $t[2]=generation number
649
- $$xref{$ref2} = $t[1];
650
- } elsif ($t[0] == 2) {
651
- # compressed object reference:
652
- # $t[1]=stream object number, $t[2]=index of object in stream
653
- $ref2 = "$objNum 0 R";
654
- $$xref{$ref2} = "I$t[2] $t[1] 0 R";
655
- } elsif ($t[0] == 0) {
656
- # free object:
657
- # $t[1]=next free object in linked list, $t[2]=generation number
658
- $$xref{$ref2} = 0;
659
- } else {
660
- # treat as a null object
661
- $$xref{$ref2} = undef;
662
- }
663
- $$xref{$objNum} = $t[1]; # remember offsets by object number too
664
- return $$xref{$ref} if $ref eq $ref2;
665
- return 0; # object is free or was reused
666
- }
667
- $tot += $count;
668
- }
669
- }
670
- return undef;
671
- }
672
-
673
- #------------------------------------------------------------------------------
674
- # Locate a regular object in the XRef tables (does not include compressed objects)
675
- # Inputs: 0) XRef reference, 1) object reference string (or free object number)
676
- # Returns: offset to object in file, 0 if object is free,
677
- # or undef on error or if object was compressed
678
- sub LocateObject($$)
679
- {
680
- my ($xref, $ref) = @_;
681
- my $offset = LocateAnyObject($xref, $ref);
682
- return undef if $offset and $offset =~ /^I/;
683
- return $offset;
684
- }
685
-
686
- #------------------------------------------------------------------------------
687
- # Fetch indirect object from file (from inside a stream if required)
688
- # Inputs: 0) ExifTool object reference, 1) object reference string,
689
- # 2) xref lookup, 3) object name (for warning messages)
690
- # Returns: object data or undefined on error
691
- # Notes: sets $lastFetched to the object reference, or undef if the object
692
- # was extracted from an encrypted stream
693
- sub FetchObject($$$$)
694
- {
695
- my ($et, $ref, $xref, $tag) = @_;
696
- $lastFetched = $ref; # save this for decoding if necessary
697
- my $offset = LocateAnyObject($xref, $ref);
698
- $lastOffset = $offset;
699
- unless ($offset) {
700
- $et->Warn("Bad $tag reference") unless defined $offset;
701
- return undef;
702
- }
703
- my ($data, $obj);
704
- if ($offset =~ s/^I(\d+) //) {
705
- my $index = $1; # object index in stream
706
- my ($objNum) = split ' ', $ref; # save original object number
707
- $ref = $offset; # now a reference to the containing stream object
708
- $obj = $streamObjs{$ref};
709
- unless ($obj) {
710
- # don't try to load the same object stream twice
711
- return undef if defined $obj;
712
- $streamObjs{$ref} = '';
713
- # load the parent object stream
714
- $obj = FetchObject($et, $ref, $xref, $tag);
715
- # make sure it contains everything we need
716
- return undef unless defined $obj and ref($obj) eq 'HASH';
717
- return undef unless $$obj{First} and $$obj{N};
718
- return undef unless DecodeStream($et, $obj);
719
- # add a special '_table' entry to this dictionary which contains
720
- # the list of object number/offset pairs from the stream header
721
- my $num = $$obj{N} * 2;
722
- my @table = split ' ', $$obj{_stream}, $num;
723
- return undef unless @table == $num;
724
- # remove everything before first object in stream
725
- $$obj{_stream} = substr($$obj{_stream}, $$obj{First});
726
- $table[$num-1] =~ s/^(\d+).*/$1/s; # trim excess from last number
727
- $$obj{_table} = \@table;
728
- # save the object stream so we don't have to re-load it later
729
- $streamObjs{$ref} = $obj;
730
- }
731
- # verify that we have the specified object
732
- my $i = 2 * $index;
733
- my $table = $$obj{_table};
734
- unless ($index < $$obj{N} and $$table[$i] == $objNum) {
735
- $et->Warn("Bad index for stream object $tag");
736
- return undef;
737
- }
738
- # extract the object at the specified index in the stream
739
- # (offsets in table are in sequential order, so we can subract from
740
- # the next offset to get the object length)
741
- $offset = $$table[$i + 1];
742
- my $len = ($$table[$i + 3] || length($$obj{_stream})) - $offset;
743
- $data = substr($$obj{_stream}, $offset, $len);
744
- # avoid re-decrypting data in already decrypted streams
745
- undef $lastFetched if $cryptStream;
746
- return ExtractObject($et, \$data);
747
- }
748
- my $raf = $$et{RAF};
749
- $raf->Seek($offset, 0) or $et->Warn("Bad $tag offset"), return undef;
750
- # verify that we are reading the expected object
751
- $raf->ReadLine($data) or $et->Warn("Error reading $tag data"), return undef;
752
- ($obj = $ref) =~ s/R/obj/;
753
- unless ($data =~ s/^$obj//) {
754
- $et->Warn("$tag object ($obj) not found at $offset");
755
- return undef;
756
- }
757
- return ExtractObject($et, \$data, $raf, $xref);
758
- }
759
-
760
- #------------------------------------------------------------------------------
761
- # Convert PDF value to something readable
762
- # Inputs: 0) PDF object data
763
- # Returns: converted object
764
- sub ReadPDFValue($)
765
- {
766
- my $str = shift;
767
- # decode all strings in an array
768
- if (ref $str eq 'ARRAY') {
769
- # create new list to not alter the original data when rewriting
770
- my ($val, @vals);
771
- foreach $val (@$str) {
772
- push @vals, ReadPDFValue($val);
773
- }
774
- return \@vals;
775
- }
776
- length $str or return $str;
777
- my $delim = substr($str, 0, 1);
778
- if ($delim eq '(') { # literal string
779
- $str = $1 if $str =~ /^.*?\((.*)\)/s; # remove brackets
780
- # decode escape sequences in literal strings
781
- while ($str =~ /\\(.)/sg) {
782
- my $n = pos($str) - 2;
783
- my $c = $1;
784
- my $r;
785
- if ($c =~ /[0-7]/) {
786
- # get up to 2 more octal digits
787
- $c .= $1 if $str =~ /\G([0-7]{1,2})/g;
788
- # convert octal escape code
789
- $r = chr(oct($c) & 0xff);
790
- } elsif ($c eq "\x0d") {
791
- # the string is continued if the line ends with '\'
792
- # (also remove "\x0d\x0a")
793
- $c .= $1 if $str =~ /\G(\x0a)/g;
794
- $r = '';
795
- } elsif ($c eq "\x0a") {
796
- $r = '';
797
- } else {
798
- # convert escaped characters
799
- ($r = $c) =~ tr/nrtbf/\n\r\t\b\f/;
800
- }
801
- substr($str, $n, length($c)+1) = $r;
802
- # continue search after this character
803
- pos($str) = $n + length($r);
804
- }
805
- Crypt(\$str, $lastFetched) if $cryptString;
806
- } elsif ($delim eq '<') { # hex string
807
- # decode hex data
808
- $str =~ tr/0-9A-Fa-f//dc;
809
- $str .= '0' if length($str) & 0x01; # (by the spec)
810
- $str = pack('H*', $str);
811
- Crypt(\$str, $lastFetched) if $cryptString;
812
- } elsif ($delim eq '/') { # name
813
- $str = substr($str, 1);
814
- # convert escape codes (PDF 1.2 or later)
815
- $str =~ s/#([0-9a-f]{2})/chr(hex($1))/sgei if $pdfVer >= 1.2;
816
- }
817
- return $str;
818
- }
819
-
820
- #------------------------------------------------------------------------------
821
- # Extract PDF object from combination of buffered data and file
822
- # Inputs: 0) ExifTool object reference, 1) data reference,
823
- # 2) optional raf reference, 3) optional xref table
824
- # Returns: converted PDF object or undef on error
825
- # a) dictionary object --> hash reference
826
- # b) array object --> array reference
827
- # c) indirect reference --> scalar reference
828
- # d) string, name, integer, boolean, null --> scalar value
829
- # - updates $$dataPt on return to contain unused data
830
- # - creates two bogus entries ('_stream' and '_tags') in dictionaries to represent
831
- # the stream data and a list of the tags (not including '_stream' and '_tags')
832
- # in their original order
833
- sub ExtractObject($$;$$)
834
- {
835
- my ($et, $dataPt, $raf, $xref) = @_;
836
- my (@tags, $data, $objData);
837
- my $dict = { };
838
- my $delim;
839
-
840
- for (;;) {
841
- if ($$dataPt =~ /^\s*(<{1,2}|\[|\()/s) {
842
- $delim = $1;
843
- $$dataPt =~ s/^\s+//; # remove leading white space
844
- $objData = ReadToNested($dataPt, $raf);
845
- return undef unless defined $objData;
846
- last;
847
- } elsif ($$dataPt =~ s{^\s*(\S[^[(/<>\s]*)\s*}{}s) {
848
- #
849
- # extract boolean, numerical, string, name, null object or indirect reference
850
- #
851
- $objData = $1;
852
- # look for an indirect reference
853
- if ($objData =~ /^\d+$/ and $$dataPt =~ s/^(\d+)\s+R//s) {
854
- $objData .= "$1 R";
855
- $objData = \$objData; # return scalar reference
856
- }
857
- return $objData; # return simple scalar or scalar reference
858
- }
859
- $raf and $raf->ReadLine($data) or return undef;
860
- $$dataPt .= $data;
861
- }
862
- #
863
- # return literal string or hex string without parsing
864
- #
865
- if ($delim eq '(' or $delim eq '<') {
866
- return $objData;
867
- #
868
- # extract array
869
- #
870
- } elsif ($delim eq '[') {
871
- $objData =~ /^.*?\[(.*)\]/s or return undef;
872
- my $data = $1; # brackets removed
873
- my @list;
874
- for (;;) {
875
- last unless $data =~ m{\s*(\S[^[(/<>\s]*)}sg;
876
- my $val = $1;
877
- if ($val =~ /^(<{1,2}|\[|\()/) {
878
- my $pos = pos($data) - length($val);
879
- # nested dict, array, literal string or hex string
880
- my $buff = substr($data, $pos);
881
- $val = ReadToNested(\$buff);
882
- last unless defined $val;
883
- pos($data) = $pos + length($val);
884
- $val = ExtractObject($et, \$val);
885
- } elsif ($val =~ /^\d/) {
886
- my $pos = pos($data);
887
- if ($data =~ /\G\s+(\d+)\s+R/g) {
888
- $val = \ "$val $1 R"; # make a reference
889
- } else {
890
- pos($data) = $pos;
891
- }
892
- }
893
- push @list, $val;
894
- }
895
- return \@list;
896
- }
897
- #
898
- # extract dictionary
899
- #
900
- # Note: entries are not necessarily separated by whitespace (doh!)
901
- # eg) "/Tag/Name", "/Tag(string)", "/Tag[array]", etc are legal!
902
- # Also, they may be separated by a comment (eg. "/Tag%comment\nValue"),
903
- # but comments have already been removed
904
- while ($objData =~ m{(\s*)/([^/[\]()<>{}\s]+)\s*(\S[^[(/<>\s]*)}sg) {
905
- my $tag = $2;
906
- my $val = $3;
907
- if ($val =~ /^(<{1,2}|\[|\()/) {
908
- # nested dict, array, literal string or hex string
909
- $objData = substr($objData, pos($objData)-length($val));
910
- $val = ReadToNested(\$objData, $raf);
911
- last unless defined $val;
912
- $val = ExtractObject($et, \$val);
913
- pos($objData) = 0;
914
- } elsif ($val =~ /^\d/) {
915
- my $pos = pos($objData);
916
- if ($objData =~ /\G\s+(\d+)\s+R/sg) {
917
- $val = \ "$val $1 R"; # make a reference
918
- } else {
919
- pos($objData) = $pos;
920
- }
921
- }
922
- if ($$dict{$tag}) {
923
- # duplicate dictionary entries are not allowed
924
- $et->Warn("Duplicate '$tag' entry in dictionary (ignored)");
925
- } else {
926
- # save the entry
927
- push @tags, $tag;
928
- $$dict{$tag} = $val;
929
- }
930
- }
931
- return undef unless @tags;
932
- $$dict{_tags} = \@tags;
933
- return $dict unless $raf; # direct objects can not have streams
934
- #
935
- # extract the stream object
936
- #
937
- # dictionary must specify stream Length
938
- my $length = $$dict{Length} or return $dict;
939
- if (ref $length) {
940
- $length = $$length;
941
- my $oldpos = $raf->Tell();
942
- # get the location of the object specifying the length
943
- # (compressed objects are not allowed)
944
- my $offset = LocateObject($xref, $length) or return $dict;
945
- $offset or $et->Warn('Bad Length object'), return $dict;
946
- $raf->Seek($offset, 0) or $et->Warn('Bad Length offset'), return $dict;
947
- # verify that we are reading the expected object
948
- $raf->ReadLine($data) or $et->Warn('Error reading Length data'), return $dict;
949
- $length =~ s/R/obj/;
950
- unless ($data =~ /^$length\s+(\d+)?/) {
951
- $et->Warn("Length object ($length) not found at $offset");
952
- return $dict;
953
- }
954
- if (defined $1) {
955
- $length = $1;
956
- } else {
957
- $raf->ReadLine($data) or $et->Warn('Error reading stream Length'), return $dict;
958
- $data =~ /^\s*(\d+)/ or $et->Warn('Stream length not found'), return $dict;
959
- $length = $1;
960
- }
961
- $raf->Seek($oldpos, 0); # restore position to start of stream
962
- }
963
- # extract the trailing stream data
964
- for (;;) {
965
- # find the stream token
966
- if ($$dataPt =~ /(\S+)/) {
967
- last unless $1 eq 'stream';
968
- # read an extra line because it may contain our \x0a
969
- $$dataPt .= $data if $raf->ReadLine($data);
970
- # remove our stream header
971
- $$dataPt =~ s/^\s*stream(\x0a|\x0d\x0a)//s;
972
- my $more = $length - length($$dataPt);
973
- if ($more > 0) {
974
- unless ($raf->Read($data, $more) == $more) {
975
- $et->Warn('Error reading stream data');
976
- $$dataPt = '';
977
- return $dict;
978
- }
979
- $$dict{_stream} = $$dataPt . $data;
980
- $$dataPt = '';
981
- } elsif ($more < 0) {
982
- $$dict{_stream} = substr($$dataPt, 0, $length);
983
- $$dataPt = substr($$dataPt, $length);
984
- } else {
985
- $$dict{_stream} = $$dataPt;
986
- $$dataPt = '';
987
- }
988
- last;
989
- }
990
- $raf->ReadLine($data) or last;
991
- $$dataPt .= $data;
992
- }
993
- return $dict;
994
- }
995
-
996
- #------------------------------------------------------------------------------
997
- # Read to nested delimiter
998
- # Inputs: 0) data reference, 1) optional raf reference
999
- # Returns: data up to and including matching delimiter (or undef on error)
1000
- # - updates data reference with trailing data
1001
- # - unescapes characters in literal strings
1002
- my %closingDelim = ( # lookup for matching delimiter
1003
- '(' => ')',
1004
- '[' => ']',
1005
- '<' => '>',
1006
- '<<' => '>>',
1007
- );
1008
- sub ReadToNested($;$)
1009
- {
1010
- my ($dataPt, $raf) = @_;
1011
- my @delim = (''); # closing delimiter list, most deeply nested first
1012
- pos($$dataPt) = 0; # begin at start of data
1013
- for (;;) {
1014
- unless ($$dataPt =~ /(\\*)(\(|\)|<{1,2}|>{1,2}|\[|\]|%)/g) {
1015
- # must read some more data
1016
- my $buff;
1017
- last unless $raf and $raf->ReadLine($buff);
1018
- $$dataPt .= $buff;
1019
- pos($$dataPt) = length($$dataPt) - length($buff);
1020
- next;
1021
- }
1022
- # are we in a literal string?
1023
- if ($delim[0] eq ')') {
1024
- # ignore escaped delimiters (preceded by odd number of \'s)
1025
- next if length($1) & 0x01;
1026
- # ignore all delimiters but unescaped braces
1027
- next unless $2 eq '(' or $2 eq ')';
1028
- } elsif ($2 eq '%') {
1029
- # ignore the comment
1030
- my $pos = pos($$dataPt) - 1;
1031
- # remove everything from '%' up to but not including newline
1032
- $$dataPt =~ /.*/g;
1033
- my $end = pos($$dataPt);
1034
- $$dataPt = substr($$dataPt, 0, $pos) . substr($$dataPt, $end);
1035
- pos($$dataPt) = $pos;
1036
- next;
1037
- }
1038
- if ($closingDelim{$2}) {
1039
- # push the corresponding closing delimiter
1040
- unshift @delim, $closingDelim{$2};
1041
- next;
1042
- }
1043
- unless ($2 eq $delim[0]) {
1044
- # handle the case where we find a ">>>" and interpret it
1045
- # as ">> >" instead of "> >>"
1046
- next unless $2 eq '>>' and $delim[0] eq '>';
1047
- pos($$dataPt) = pos($$dataPt) - 1;
1048
- }
1049
- shift @delim; # remove from nesting list
1050
- next if $delim[0]; # keep going if we have more nested delimiters
1051
- my $pos = pos($$dataPt);
1052
- my $buff = substr($$dataPt, 0, $pos);
1053
- $$dataPt = substr($$dataPt, $pos);
1054
- return $buff; # success!
1055
- }
1056
- return undef; # didn't find matching delimiter
1057
- }
1058
-
1059
- #------------------------------------------------------------------------------
1060
- # Decode LZW-encoded data (ref 1)
1061
- # Inputs: 0) data reference
1062
- # Returns: true on success and data is decoded, or false and data is untouched
1063
- sub DecodeLZW($)
1064
- {
1065
- my $dataPt = shift;
1066
- return 0 if length $$dataPt < 4;
1067
- my @lzw = (map(chr, 0..255), undef, undef); # LZW code table
1068
- my $mask = 0x01ff; # mask for least-significant 9 bits
1069
- my @dat = unpack 'n*', $$dataPt . "\0";
1070
- my $word = ($dat[0] << 16) | $dat[1];
1071
- my ($bit, $pos, $bits, $out) = (0, 2, 9, '');
1072
- my $lastVal;
1073
- for (;;) {
1074
- # bits are packed MSB first in PDF LZW (the PDF spec doesn't mention this)
1075
- my $shift = 32 - ($bit + $bits);
1076
- if ($shift < 0) {
1077
- return 0 if $pos >= @dat; # missing EOD marker
1078
- $word = (($word & 0xffff) << 16) | $dat[$pos++]; # read next word
1079
- $bit -= 16;
1080
- $shift += 16;
1081
- };
1082
- my $code = ($word >> $shift) & $mask;
1083
- $bit += $bits;
1084
- my $val = $lzw[$code];
1085
- if (defined $val) {
1086
- # store new code as previous sequence plus 1st char of new sequence
1087
- push @lzw, $lastVal . substr($val, 0, 1) if defined $lastVal;
1088
- } elsif ($code == @lzw) { # new code
1089
- return 0 unless defined $lastVal;
1090
- # we are using the code that we are about to generate, so the last
1091
- # character in the new sequence must be the same as the first
1092
- # character in the previous sequence (makes sense if you think about it)
1093
- $val = $lastVal . substr($lastVal, 0, 1);
1094
- push @lzw, $val;
1095
- } elsif ($code == 256) { # clear table
1096
- splice @lzw, 258;
1097
- $bits = 9;
1098
- $mask = 0x1ff;
1099
- undef $lastVal;
1100
- next;
1101
- } elsif ($code == 257) { # EOD marker
1102
- last; # all done!
1103
- } else {
1104
- return 0;
1105
- }
1106
- $out .= $val; # add this byte sequence to the output
1107
- # we added a new entry to the LZW table, so we must increase
1108
- # the bit width if necessary, up to a maximum of 12
1109
- @lzw >= $mask and $bits < 12 and ++$bits, $mask |= $mask << 1;
1110
- $lastVal = $val;
1111
- }
1112
- $$dataPt = $out; # return decompressed data
1113
- return 1;
1114
- }
1115
-
1116
- #------------------------------------------------------------------------------
1117
- # Decode filtered stream
1118
- # Inputs: 0) ExifTool object reference, 1) dictionary reference
1119
- # Returns: true if stream has been decoded OK
1120
- sub DecodeStream($$)
1121
- {
1122
- local $_;
1123
- my ($et, $dict) = @_;
1124
-
1125
- return 0 unless $$dict{_stream}; # no stream to decode
1126
-
1127
- # get list of filters
1128
- my (@filters, @decodeParms, $filter);
1129
- if (ref $$dict{Filter} eq 'ARRAY') {
1130
- @filters = @{$$dict{Filter}};
1131
- } elsif (defined $$dict{Filter}) {
1132
- @filters = ($$dict{Filter});
1133
- }
1134
- # be sure we can process all the filters before we take the time to do the decryption
1135
- foreach $filter (@filters) {
1136
- next if $supportedFilter{$filter};
1137
- $et->WarnOnce("Unsupported Filter $filter");
1138
- return 0;
1139
- }
1140
- # apply decryption first if required (and if the default encryption
1141
- # has not been overridden by a Crypt filter. Note: the Crypt filter
1142
- # must be first in the Filter array: ref 3, page 38)
1143
- unless (defined $$dict{_decrypted} or ($filters[0] and $filters[0] eq '/Crypt')) {
1144
- CryptStream($dict, $lastFetched);
1145
- }
1146
- return 1 unless $$dict{Filter}; # Filter entry is mandatory
1147
- return 0 if defined $$dict{_filtered}; # avoid double-filtering
1148
- $$dict{_filtered} = 1; # set flag to prevent double-filtering
1149
-
1150
- # get array of DecodeParms dictionaries
1151
- if (ref $$dict{DecodeParms} eq 'ARRAY') {
1152
- @decodeParms = @{$$dict{DecodeParms}};
1153
- } else {
1154
- @decodeParms = ($$dict{DecodeParms});
1155
- }
1156
-
1157
- foreach $filter (@filters) {
1158
- my $decodeParms = shift @decodeParms;
1159
-
1160
- if ($filter eq '/FlateDecode') {
1161
- # make sure we support the predictor (if used) before decoding
1162
- my $pre;
1163
- if (ref $decodeParms eq 'HASH') {
1164
- $pre = $$decodeParms{Predictor};
1165
- if ($pre and $pre ne '1' and $pre ne '12') {
1166
- $et->WarnOnce("FlateDecode Predictor $pre currently not supported");
1167
- return 0;
1168
- }
1169
- }
1170
- if (eval { require Compress::Zlib }) {
1171
- my $inflate = Compress::Zlib::inflateInit();
1172
- my ($buff, $stat);
1173
- $inflate and ($buff, $stat) = $inflate->inflate($$dict{_stream});
1174
- if ($inflate and $stat == Compress::Zlib::Z_STREAM_END()) {
1175
- $$dict{_stream} = $buff;
1176
- } else {
1177
- $et->Warn('Error inflating stream');
1178
- return 0;
1179
- }
1180
- } else {
1181
- $et->WarnOnce('Install Compress::Zlib to process filtered streams');
1182
- return 0;
1183
- }
1184
- next unless $pre and $pre eq '12'; # 12 = 'up' prediction
1185
-
1186
- # apply anti-predictor
1187
- my $cols = $$decodeParms{Columns};
1188
- unless ($cols) {
1189
- # currently only support 'up' prediction
1190
- $et->WarnOnce('No Columns for decoding stream');
1191
- return 0;
1192
- }
1193
- my @bytes = unpack('C*', $$dict{_stream});
1194
- my @pre = (0) x $cols; # initialize predictor array
1195
- my $buff = '';
1196
- while (@bytes > $cols) {
1197
- unless (($_ = shift @bytes) == 2) {
1198
- $et->WarnOnce("Unsupported PNG filter $_"); # (yes, PNG)
1199
- return 0;
1200
- }
1201
- foreach (@pre) {
1202
- $_ = ($_ + shift(@bytes)) & 0xff;
1203
- }
1204
- $buff .= pack('C*', @pre);
1205
- }
1206
- $$dict{_stream} = $buff;
1207
-
1208
- } elsif ($filter eq '/Crypt') {
1209
-
1210
- # (we shouldn't have to check the _decrypted flag since we
1211
- # already checked the _filtered flag, but what the heck...)
1212
- next if defined $$dict{_decrypted};
1213
- # assume Identity filter (the default) if DecodeParms are missing
1214
- next unless ref $decodeParms eq 'HASH';
1215
- my $name = $$decodeParms{Name};
1216
- next unless defined $name or $name eq 'Identity';
1217
- if ($name ne 'StdCF') {
1218
- $et->WarnOnce("Unsupported Crypt Filter $name");
1219
- return 0;
1220
- }
1221
- unless ($cryptInfo) {
1222
- $et->WarnOnce('Missing Encrypt StdCF entry');
1223
- return 0;
1224
- }
1225
- # decrypt the stream manually because we want to:
1226
- # 1) ignore $cryptStream (StmF) setting
1227
- # 2) ignore EncryptMetadata setting (I can't find mention of how to
1228
- # reconcile this in the spec., but this would make sense)
1229
- # 3) avoid adding the crypt key extension (ref 3, page 58, Algorithm 1b)
1230
- # 4) set _decrypted flag so we will recrypt according to StmF when
1231
- # writing (since we don't yet write Filter'd streams)
1232
- Crypt(\$$dict{_stream}, 'none');
1233
- $$dict{_decrypted} = ($cryptStream ? 1 : 0);
1234
-
1235
- } elsif ($filter eq '/LZWDecode') {
1236
-
1237
- # make sure we don't have any unsupported decoding parameters
1238
- if (ref $decodeParms eq 'HASH') {
1239
- if ($$decodeParms{Predictor}) {
1240
- $et->WarnOnce("LZWDecode Predictor $$decodeParms{Predictor} currently not supported");
1241
- return 0;
1242
- } elsif ($$decodeParms{EarlyChange}) {
1243
- $et->WarnOnce("LZWDecode EarlyChange currently not supported");
1244
- return 0;
1245
- }
1246
- }
1247
- unless (DecodeLZW(\$$dict{_stream})) {
1248
- $et->WarnOnce('LZW decompress error');
1249
- return 0;
1250
- }
1251
-
1252
- } elsif ($filter eq '/ASCIIHexDecode') {
1253
-
1254
- $$dict{_stream} =~ s/>.*//; # truncate at '>' (end of data mark)
1255
- $$dict{_stream} =~ tr/0-9a-zA-Z//d; # remove illegal characters
1256
- $$dict{_stream} = pack 'H*', $$dict{_stream};
1257
-
1258
- }
1259
- }
1260
- return 1;
1261
- }
1262
-
1263
- #------------------------------------------------------------------------------
1264
- # Initialize state for RC4 en/decryption (ref 2)
1265
- # Inputs: 0) RC4 key string
1266
- # Returns: RC4 key hash reference
1267
- sub RC4Init($)
1268
- {
1269
- my @key = unpack('C*', shift);
1270
- my @state = (0 .. 255);
1271
- my ($i, $j) = (0, 0);
1272
- while ($i < 256) {
1273
- my $st = $state[$i];
1274
- $j = ($j + $st + $key[$i % scalar(@key)]) & 0xff;
1275
- $state[$i++] = $state[$j];
1276
- $state[$j] = $st;
1277
- }
1278
- return { State => \@state, XY => [ 0, 0 ] };
1279
- }
1280
-
1281
- #------------------------------------------------------------------------------
1282
- # Apply RC4 en/decryption (ref 2)
1283
- # Inputs: 0) data reference, 1) RC4 key hash reference or RC4 key string
1284
- # - can call this method directly with a key string, or with with the key
1285
- # reference returned by RC4Init
1286
- # - RC4 is a symmetric algorithm, so encryption is the same as decryption
1287
- sub RC4Crypt($$)
1288
- {
1289
- my ($dataPt, $key) = @_;
1290
- $key = RC4Init($key) unless ref $key eq 'HASH';
1291
- my $state = $$key{State};
1292
- my ($x, $y) = @{$$key{XY}};
1293
-
1294
- my @data = unpack('C*', $$dataPt);
1295
- foreach (@data) {
1296
- $x = ($x + 1) & 0xff;
1297
- my $stx = $$state[$x];
1298
- $y = ($stx + $y) & 0xff;
1299
- my $sty = $$state[$x] = $$state[$y];
1300
- $$state[$y] = $stx;
1301
- $_ ^= $$state[($stx + $sty) & 0xff];
1302
- }
1303
- $$key{XY} = [ $x, $y ];
1304
- $$dataPt = pack('C*', @data);
1305
- }
1306
-
1307
- #------------------------------------------------------------------------------
1308
- # Update AES cipher with a bit of data
1309
- # Inputs: 0) data
1310
- # Returns: encrypted data
1311
- my $cipherMore;
1312
- sub CipherUpdate($)
1313
- {
1314
- my $dat = shift;
1315
- my $pos = 0;
1316
- $dat = $cipherMore . $dat if length $dat;
1317
- while ($pos + 16 <= length($dat)) {
1318
- substr($dat,$pos,16) = Image::ExifTool::AES::Cipher(substr($dat,$pos,16));
1319
- $pos += 16;
1320
- }
1321
- if ($pos < length $dat) {
1322
- $cipherMore = substr($dat,$pos);
1323
- $dat = substr($dat,0,$pos);
1324
- } else {
1325
- $cipherMore = '';
1326
- }
1327
- return $dat;
1328
- }
1329
-
1330
- #------------------------------------------------------------------------------
1331
- # Get encrypted hash
1332
- # Inputs: 0) Password, 1) salt, 2) vector, 3) encryption revision
1333
- # Returns: hash
1334
- sub GetHash($$$$)
1335
- {
1336
- my ($password, $salt, $vector, $rev) = @_;
1337
-
1338
- # return Rev 5 hash
1339
- return Digest::SHA::sha256($password, $salt, $vector) if $rev == 5;
1340
-
1341
- # compute Rev 6 hardened hash
1342
- # (ref http://code.google.com/p/origami-pdf/source/browse/lib/origami/encryption.rb)
1343
- my $blockSize = 32;
1344
- my $input = Digest::SHA::sha256($password, $salt, $vector) . ("\0" x 32);
1345
- my $key = substr($input, 0, 16);
1346
- my $iv = substr($input, 16, 16);
1347
- my $h;
1348
- my $x = '';
1349
- my $i = 0;
1350
- while ($i < 64 or $i < ord(substr($x,-1,1))+32) {
1351
-
1352
- my $block = substr($input, 0, $blockSize);
1353
- $x = '';
1354
- Image::ExifTool::AES::Crypt(\$x, $key, $iv, 1);
1355
- $cipherMore = '';
1356
-
1357
- my ($j, $digest);
1358
- for ($j=0; $j<64; ++$j) {
1359
- $x = '';
1360
- $x .= CipherUpdate($password) if length $password;
1361
- $x .= CipherUpdate($block);
1362
- $x .= CipherUpdate($vector) if length $vector;
1363
- if ($j == 0) {
1364
- my @a = unpack('C16', $x);
1365
- my $sum = 0;
1366
- $sum += $_ foreach @a;
1367
- # set SHA block size (32, 48 or 64 bytes = SHA-256, 384 or 512)
1368
- $blockSize = 32 + ($sum % 3) * 16;
1369
- $digest = Digest::SHA->new($blockSize * 8);
1370
- }
1371
- $digest->add($x);
1372
- }
1373
-
1374
- $h = $digest->digest();
1375
- $key = substr($h, 0, 16);
1376
- substr($input,0,16) = $h;
1377
- $iv = substr($h, 16, 16);
1378
- ++$i;
1379
- }
1380
- return substr($h, 0, 32);
1381
- }
1382
-
1383
- #------------------------------------------------------------------------------
1384
- # Initialize decryption
1385
- # Inputs: 0) ExifTool object reference, 1) Encrypt dictionary reference,
1386
- # 2) ID from file trailer dictionary
1387
- # Returns: error string or undef on success (and sets $cryptInfo)
1388
- sub DecryptInit($$$)
1389
- {
1390
- local $_;
1391
- my ($et, $encrypt, $id) = @_;
1392
-
1393
- undef $cryptInfo;
1394
- unless ($encrypt and ref $encrypt eq 'HASH') {
1395
- return 'Error loading Encrypt object';
1396
- }
1397
- my $filt = $$encrypt{Filter};
1398
- unless ($filt and $filt =~ s/^\///) {
1399
- return 'Encrypt dictionary has no Filter!';
1400
- }
1401
- # extract some interesting tags
1402
- my $ver = $$encrypt{V} || 0;
1403
- my $rev = $$encrypt{R} || 0;
1404
- my $enc = "$filt V$ver";
1405
- $enc .= ".$rev" if $filt eq 'Standard';
1406
- $enc .= " ($1)" if $$encrypt{SubFilter} and $$encrypt{SubFilter} =~ /^\/(.*)/;
1407
- $enc .= ' (' . ($$encrypt{Length} || 40) . '-bit)' if $filt eq 'Standard';
1408
- my $tagTablePtr = GetTagTable('Image::ExifTool::PDF::Encrypt');
1409
- $et->HandleTag($tagTablePtr, 'Filter', $enc);
1410
- if ($filt ne 'Standard') {
1411
- return "Encryption filter $filt currently not supported";
1412
- } elsif (not defined $$encrypt{R}) {
1413
- return 'Standard security handler missing revision';
1414
- }
1415
- unless ($$encrypt{O} and $$encrypt{P} and $$encrypt{U}) {
1416
- return 'Incomplete Encrypt specification';
1417
- }
1418
- if ("$ver.$rev" >= 5.6) {
1419
- # apologize for poor performance (AES is a pure Perl implementation)
1420
- $et->Warn('Decryption is very slow for encryption V5.6 or higher', 1);
1421
- }
1422
- $et->HandleTag($tagTablePtr, 'P', $$encrypt{P});
1423
-
1424
- my %parm; # optional parameters extracted from Encrypt dictionary
1425
-
1426
- if ($ver == 1 or $ver == 2) {
1427
- $cryptString = $cryptStream = 1;
1428
- } elsif ($ver == 4 or $ver == 5) {
1429
- # initialize our $cryptString and $cryptStream flags
1430
- foreach ('StrF', 'StmF') {
1431
- my $flagPt = $_ eq 'StrF' ? \$cryptString : \$cryptStream;
1432
- $$flagPt = $$encrypt{$_};
1433
- undef $$flagPt if $$flagPt and $$flagPt eq '/Identity';
1434
- return "Unsupported $_ encryption $$flagPt" if $$flagPt and $$flagPt ne '/StdCF';
1435
- }
1436
- if ($cryptString or $cryptStream) {
1437
- return 'Missing or invalid Encrypt StdCF entry' unless ref $$encrypt{CF} eq 'HASH' and
1438
- ref $$encrypt{CF}{StdCF} eq 'HASH' and $$encrypt{CF}{StdCF}{CFM};
1439
- my $cryptMeth = $$encrypt{CF}{StdCF}{CFM};
1440
- unless ($cryptMeth =~ /^\/(V2|AESV2|AESV3)$/) {
1441
- return "Unsupported encryption method $cryptMeth";
1442
- }
1443
- # set "_aesv2" or "_aesv3" flag in %$encrypt hash if AES encryption was used
1444
- $$encrypt{'_' . lc($1)} = 1 if $cryptMeth =~ /^\/(AESV2|AESV3)$/;
1445
- }
1446
- if ($ver == 5) {
1447
- # validate OE and UE entries
1448
- foreach ('OE', 'UE') {
1449
- return "Missing Encrypt $_ entry" unless $$encrypt{$_};
1450
- $parm{$_} = ReadPDFValue($$encrypt{$_});
1451
- return "Invalid Encrypt $_ entry" unless length $parm{$_} == 32;
1452
- }
1453
- require Image::ExifTool::AES; # will need this later
1454
- }
1455
- } else {
1456
- return "Encryption version $ver currently not supported";
1457
- }
1458
- $id or return "Can't decrypt (no document ID)";
1459
-
1460
- # make sure we have the necessary libraries available
1461
- if ($ver < 5) {
1462
- unless (eval { require Digest::MD5 }) {
1463
- return "Install Digest::MD5 to process encrypted PDF";
1464
- }
1465
- } else {
1466
- unless (eval { require Digest::SHA }) {
1467
- return "Install Digest::SHA to process AES-256 encrypted PDF";
1468
- }
1469
- }
1470
-
1471
- # calculate file-level en/decryption key
1472
- my $pad = "\x28\xBF\x4E\x5E\x4E\x75\x8A\x41\x64\x00\x4E\x56\xFF\xFA\x01\x08".
1473
- "\x2E\x2E\x00\xB6\xD0\x68\x3E\x80\x2F\x0C\xA9\xFE\x64\x53\x69\x7A";
1474
- my $o = ReadPDFValue($$encrypt{O});
1475
- my $u = ReadPDFValue($$encrypt{U});
1476
-
1477
- # set flag indicating whether metadata is encrypted
1478
- # (in version 4 and higher, metadata streams may not be encrypted)
1479
- if ($ver < 4 or not $$encrypt{EncryptMetadata} or $$encrypt{EncryptMetadata} !~ /false/i) {
1480
- $$encrypt{_meta} = 1;
1481
- }
1482
- # try no password first, then try provided password if available
1483
- my ($try, $key);
1484
- for ($try=0; ; ++$try) {
1485
- my $password;
1486
- if ($try == 0) {
1487
- $password = '';
1488
- } elsif ($try == 1) {
1489
- $password = $et->Options('Password');
1490
- return 'Document is password protected (use Password option)' unless defined $password;
1491
- # make sure there is no UTF-8 flag on the password
1492
- if ($] >= 5.006 and (eval { require Encode; Encode::is_utf8($password) } or $@)) {
1493
- # repack by hand if Encode isn't available
1494
- $password = $@ ? pack('C*',unpack($] < 5.010000 ? 'U0C*' : 'C0C*',$password)) : Encode::encode('utf8',$password);
1495
- }
1496
- } else {
1497
- return 'Incorrect password';
1498
- }
1499
- if ($ver < 5) {
1500
- if (length $password) {
1501
- # password must be encoding in PDFDocEncoding (ref iso32000)
1502
- $password = $et->Encode($password, 'PDFDoc');
1503
- # truncate or pad the password to exactly 32 bytes
1504
- if (length($password) > 32) {
1505
- $password = substr($password, 0, 32);
1506
- } elsif (length($password) < 32) {
1507
- $password .= substr($pad, 0, 32-length($password));
1508
- }
1509
- } else {
1510
- $password = $pad;
1511
- }
1512
- $key = $password . $o . pack('V', $$encrypt{P}) . $id;
1513
- my $rep = 1;
1514
- if ($rev == 3 or $rev == 4) {
1515
- # must add this if metadata not encrypted
1516
- $key .= "\xff\xff\xff\xff" unless $$encrypt{_meta};
1517
- $rep += 50; # repeat MD5 50 more times if revision is 3 or greater
1518
- }
1519
- my ($len, $i, $dat);
1520
- if ($ver == 1) {
1521
- $len = 5;
1522
- } else {
1523
- $len = $$encrypt{Length} || 40;
1524
- $len >= 40 or return 'Bad Encrypt Length';
1525
- $len = int($len / 8);
1526
- }
1527
- for ($i=0; $i<$rep; ++$i) {
1528
- $key = substr(Digest::MD5::md5($key), 0, $len);
1529
- }
1530
- # decrypt U to see if a user password is required
1531
- if ($rev >= 3) {
1532
- $dat = Digest::MD5::md5($pad . $id);
1533
- RC4Crypt(\$dat, $key);
1534
- for ($i=1; $i<=19; ++$i) {
1535
- my @key = unpack('C*', $key);
1536
- foreach (@key) { $_ ^= $i; }
1537
- RC4Crypt(\$dat, pack('C*', @key));
1538
- }
1539
- $dat .= substr($u, 16);
1540
- } else {
1541
- $dat = $pad;
1542
- RC4Crypt(\$dat, $key);
1543
- }
1544
- last if $dat eq $u; # all done if this was the correct key
1545
- } else {
1546
- return 'Invalid O or U Encrypt entries' if length($o) < 48 or length($u) < 48;
1547
- if (length $password) {
1548
- # Note: this should be good for passwords containing reasonable characters,
1549
- # but to be bullet-proof we need to apply the SASLprep (IETF RFC 4013) profile
1550
- # of stringprep (IETF RFC 3454) to the password before encoding in UTF-8
1551
- $password = $et->Encode($password, 'UTF8');
1552
- $password = substr($password, 0, 127) if length($password) > 127;
1553
- }
1554
- # test for the owner password
1555
- my $sha = GetHash($password, substr($o,32,8), substr($u,0,48), $rev);
1556
- if ($sha eq substr($o, 0, 32)) {
1557
- $key = GetHash($password, substr($o,40,8), substr($u,0,48), $rev);
1558
- my $dat = ("\0" x 16) . $parm{OE};
1559
- # decrypt with no padding
1560
- my $err = Image::ExifTool::AES::Crypt(\$dat, $key, 0, 1);
1561
- return $err if $err;
1562
- $key = $dat; # use this as the file decryption key
1563
- last;
1564
- }
1565
- # test for the user password
1566
- $sha = GetHash($password, substr($u,32,8), '', $rev);
1567
- if ($sha eq substr($u, 0, 32)) {
1568
- $key = GetHash($password, substr($u,40,8), '', $rev);
1569
- my $dat = ("\0" x 16) . $parm{UE};
1570
- my $err = Image::ExifTool::AES::Crypt(\$dat, $key, 0, 1);
1571
- return $err if $err;
1572
- $key = $dat; # use this as the file decryption key
1573
- last;
1574
- }
1575
- }
1576
- }
1577
- $$encrypt{_key} = $key; # save the file-level encryption key
1578
- $cryptInfo = $encrypt; # save reference to the file-level Encrypt object
1579
- return undef; # success!
1580
- }
1581
-
1582
- #------------------------------------------------------------------------------
1583
- # Decrypt/Encrypt data
1584
- # Inputs: 0) data ref
1585
- # 1) PDF object reference to use as crypt key extension (may be 'none' to
1586
- # avoid extending the encryption key, as for streams with Crypt Filter)
1587
- # 2) encrypt flag (false for decryption)
1588
- sub Crypt($$;$)
1589
- {
1590
- return unless $cryptInfo;
1591
- my ($dataPt, $keyExt, $encrypt) = @_;
1592
- # do not decrypt if the key extension object is undefined
1593
- # (this doubles as a flag to disable decryption/encryption)
1594
- return unless defined $keyExt;
1595
- my $key = $$cryptInfo{_key};
1596
- # apply the necessary crypt key extension
1597
- unless ($$cryptInfo{_aesv3}) {
1598
- unless ($keyExt eq 'none') {
1599
- # extend crypt key using object and generation number
1600
- unless ($keyExt =~ /^(I\d+ )?(\d+) (\d+)/) {
1601
- $$cryptInfo{_error} = 'Invalid object reference for encryption';
1602
- return;
1603
- }
1604
- $key .= substr(pack('V', $2), 0, 3) . substr(pack('V', $3), 0, 2);
1605
- }
1606
- # add AES-128 salt if necessary (this little gem is conveniently
1607
- # omitted from the Adobe PDF 1.6 documentation, causing me to
1608
- # waste 12 hours trying to figure out why this wasn't working --
1609
- # it appears in ISO32000 though, so I should have been using that)
1610
- $key .= 'sAlT' if $$cryptInfo{_aesv2};
1611
- my $len = length($key);
1612
- $key = Digest::MD5::md5($key); # get 16-byte MD5 digest
1613
- $key = substr($key, 0, $len) if $len < 16; # trim if necessary
1614
- }
1615
- # perform the decryption/encryption
1616
- if ($$cryptInfo{_aesv2} or $$cryptInfo{_aesv3}) {
1617
- require Image::ExifTool::AES;
1618
- my $err = Image::ExifTool::AES::Crypt($dataPt, $key, $encrypt);
1619
- $err and $$cryptInfo{_error} = $err;
1620
- } else {
1621
- RC4Crypt($dataPt, $key);
1622
- }
1623
- }
1624
-
1625
- #------------------------------------------------------------------------------
1626
- # Decrypt/Encrypt stream data
1627
- # Inputs: 0) dictionary ref, 1) PDF object reference to use as crypt key extension
1628
- sub CryptStream($$)
1629
- {
1630
- return unless $cryptStream;
1631
- my ($dict, $keyExt) = @_;
1632
- my $type = $$dict{Type} || '';
1633
- # XRef streams are not encrypted (ref 3, page 50),
1634
- # and Metadata may or may not be encrypted
1635
- if ($cryptInfo and $type ne '/XRef' and
1636
- ($$cryptInfo{_meta} or $type ne '/Metadata'))
1637
- {
1638
- Crypt(\$$dict{_stream}, $keyExt, $$dict{_decrypted});
1639
- # toggle _decrypted flag
1640
- $$dict{_decrypted} = ($$dict{_decrypted} ? undef : 1);
1641
- } else {
1642
- $$dict{_decrypted} = 0; # stream should never be encrypted
1643
- }
1644
- }
1645
-
1646
- #------------------------------------------------------------------------------
1647
- # Generate a new PDF tag (based on its ID) and add it to a tag table
1648
- # Inputs: 0) tag table ref, 1) tag ID
1649
- # Returns: tag info ref
1650
- sub NewPDFTag($$)
1651
- {
1652
- my ($tagTablePtr, $tag) = @_;
1653
- my $name = $tag;
1654
- # translate URL-like escape sequences
1655
- $name =~ s/#([0-9a-f]{2})/chr(hex($1))/ige;
1656
- $name =~ s/[^-\w]+/_/g; # translate invalid characters to an underline
1657
- $name =~ s/(^|_)([a-z])/\U$2/g; # start words with upper case
1658
- my $tagInfo = { Name => $name };
1659
- AddTagToTable($tagTablePtr, $tag, $tagInfo);
1660
- return $tagInfo;
1661
- }
1662
-
1663
- #------------------------------------------------------------------------------
1664
- # Process AcroForm dictionary to set HasXMLFormsArchitecture flag
1665
- # Inputs: Same as ProcessDict
1666
- sub ProcessAcroForm($$$$;$$)
1667
- {
1668
- my ($et, $tagTablePtr, $dict, $xref, $nesting, $type) = @_;
1669
- $et->HandleTag($tagTablePtr, '_has_xfa', $$dict{XFA} ? 'true' : 'false');
1670
- return ProcessDict($et, $tagTablePtr, $dict, $xref, $nesting, $type);
1671
- }
1672
-
1673
- #------------------------------------------------------------------------------
1674
- # Process PDF dictionary extract tag values
1675
- # Inputs: 0) ExifTool object reference, 1) tag table reference
1676
- # 2) dictionary reference, 3) cross-reference table reference,
1677
- # 4) nesting depth, 5) dictionary capture type
1678
- sub ProcessDict($$$$;$$)
1679
- {
1680
- my ($et, $tagTablePtr, $dict, $xref, $nesting, $type) = @_;
1681
- my $verbose = $et->Options('Verbose');
1682
- my $unknown = $$tagTablePtr{EXTRACT_UNKNOWN};
1683
- my $embedded = (defined $unknown and not $unknown and $et->Options('ExtractEmbedded'));
1684
- my @tags = @{$$dict{_tags}};
1685
- my ($next, %join);
1686
- my $index = 0;
1687
-
1688
- $nesting = ($nesting || 0) + 1;
1689
- if ($nesting > 50) {
1690
- $et->WarnOnce('Nesting too deep (directory ignored)');
1691
- return;
1692
- }
1693
- # save entire dictionary for rewriting if specified
1694
- if ($$et{PDF_CAPTURE} and $$tagTablePtr{VARS} and
1695
- $tagTablePtr->{VARS}->{CAPTURE})
1696
- {
1697
- my $name;
1698
- foreach $name (@{$tagTablePtr->{VARS}->{CAPTURE}}) {
1699
- next if $$et{PDF_CAPTURE}{$name};
1700
- # make sure we load the right type if indicated
1701
- next if $type and $type ne $name;
1702
- $$et{PDF_CAPTURE}{$name} = $dict;
1703
- last;
1704
- }
1705
- }
1706
- #
1707
- # extract information from all tags in the dictionary
1708
- #
1709
- for (;;) {
1710
- my ($tag, $isSubDoc);
1711
- if (@tags) {
1712
- $tag = shift @tags;
1713
- } elsif (defined $next and not $next) {
1714
- $tag = 'Next';
1715
- $next = 1;
1716
- } else {
1717
- last;
1718
- }
1719
- my $val = $$dict{$tag};
1720
- my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
1721
- if ($tagInfo) {
1722
- undef $tagInfo if $$tagInfo{NoProcess};
1723
- } elsif ($embedded and $tag =~ /^(.*?)(\d+)$/ and
1724
- $$tagTablePtr{$1} and (ref $val ne 'SCALAR' or not $fetched{$$val}))
1725
- {
1726
- my ($name, $num) = ($1, $2);
1727
- $tagInfo = $et->GetTagInfo($tagTablePtr, $name);
1728
- if (ref $tagInfo eq 'HASH' and $$tagInfo{JoinStreams}) {
1729
- $fetched{$$val} = 1;
1730
- my $obj = FetchObject($et, $$val, $xref, $tag);
1731
- $join{$name} = [] unless $join{$name};
1732
- next unless ref $obj eq 'HASH' and $$obj{_stream};
1733
- # save all the stream data to join later
1734
- DecodeStream($et, $obj);
1735
- $join{$name}->[$num] = $$obj{_stream};
1736
- undef $tagInfo; # don't process
1737
- } else {
1738
- $isSubDoc = 1; # treat as a sub-document
1739
- }
1740
- }
1741
- if ($verbose) {
1742
- my ($val2, $extra);
1743
- if (ref $val eq 'SCALAR') {
1744
- $extra = ", indirect object ($$val)";
1745
- if ($fetched{$$val}) {
1746
- $val2 = "ref($$val)";
1747
- } elsif ($tag eq 'Next' and not $next) {
1748
- # handle 'Next' links after all others
1749
- $next = 0;
1750
- next;
1751
- } else {
1752
- $fetched{$$val} = 1;
1753
- $val = FetchObject($et, $$val, $xref, $tag);
1754
- unless (defined $val) {
1755
- my $str;
1756
- if (defined $lastOffset) {
1757
- $val2 = '<free>';
1758
- $str = 'Object was freed';
1759
- } else {
1760
- $val2 = '<err>';
1761
- $str = 'Error reading object';
1762
- }
1763
- $et->VPrint(0, "$$et{INDENT}${str}:\n");
1764
- }
1765
- }
1766
- } elsif (ref $val eq 'HASH') {
1767
- $extra = ', direct dictionary';
1768
- } elsif (ref $val eq 'ARRAY') {
1769
- $extra = ', direct array of ' . scalar(@$val) . ' objects';
1770
- } else {
1771
- $extra = ', direct object';
1772
- }
1773
- my $isSubdir;
1774
- if (ref $val eq 'HASH') {
1775
- $isSubdir = 1;
1776
- } elsif (ref $val eq 'ARRAY') {
1777
- # recurse into objects in arrays only if they are lists of
1778
- # dictionaries or indirect objects which could be dictionaries
1779
- $isSubdir = 1 if @$val;
1780
- foreach (@$val) {
1781
- next if ref $_ eq 'HASH' or ref $_ eq 'SCALAR';
1782
- undef $isSubdir;
1783
- last;
1784
- }
1785
- }
1786
- if ($isSubdir) {
1787
- # create bogus subdirectory to recurse into this dict
1788
- $tagInfo or $tagInfo = {
1789
- Name => $tag,
1790
- SubDirectory => { TagTable => 'Image::ExifTool::PDF::Unknown' },
1791
- };
1792
- } else {
1793
- if (ref $val eq 'ARRAY') {
1794
- my @list = @$val;
1795
- foreach (@list) {
1796
- $_ = "ref($$_)" if ref $_ eq 'SCALAR';
1797
- $_ = '<undef>' unless defined $_;
1798
- }
1799
- $val2 = '[' . join(',',@list) . ']';
1800
- }
1801
- # generate tag info if we will use it later
1802
- if (not $tagInfo and defined $val and $unknown) {
1803
- $tagInfo = NewPDFTag($tagTablePtr, $tag);
1804
- }
1805
- }
1806
- $et->VerboseInfo($tag, $tagInfo,
1807
- Value => $val2 || $val,
1808
- Extra => $extra,
1809
- Index => $index++,
1810
- );
1811
- next unless defined $val;
1812
- }
1813
- unless ($tagInfo) {
1814
- # add any tag found in Info dictionary to table
1815
- next unless $unknown;
1816
- $tagInfo = NewPDFTag($tagTablePtr, $tag);
1817
- }
1818
- # increment document number if necessary
1819
- my ($oldDocNum, $oldNumTags);
1820
- if ($isSubDoc) {
1821
- $oldDocNum = $$et{DOC_NUM};
1822
- $oldNumTags = $$et{NUM_FOUND};
1823
- $$et{DOC_NUM} = ++$$et{DOC_COUNT};
1824
- }
1825
- if ($$tagInfo{SubDirectory}) {
1826
- # process the subdirectory
1827
- my @subDicts;
1828
- if (ref $val eq 'ARRAY') {
1829
- @subDicts = @{$val};
1830
- } else {
1831
- @subDicts = ( $val );
1832
- }
1833
- # loop through all values of this tag
1834
- for (;;) {
1835
- my $subDict = shift @subDicts or last;
1836
- # save last fetched object in case we fetch another one here
1837
- my $prevFetched = $lastFetched;
1838
- if (ref $subDict eq 'SCALAR') {
1839
- # only fetch once (other copies are obsolete)
1840
- next if $fetched{$$subDict};
1841
- if ($$tagInfo{IgnoreDuplicates}) {
1842
- my $flag = "ProcessedPDF_$tag";
1843
- if ($$et{$flag}) {
1844
- next if $et->WarnOnce("Ignored duplicate $tag dictionary", 2);
1845
- } else {
1846
- $$et{$flag} = 1;
1847
- }
1848
- }
1849
- # load dictionary via an indirect reference
1850
- $fetched{$$subDict} = 1;
1851
- my $obj = FetchObject($et, $$subDict, $xref, $tag);
1852
- unless (defined $obj) {
1853
- unless (defined $lastOffset) {
1854
- $et->Warn("Error reading $tag object ($$subDict)");
1855
- }
1856
- next;
1857
- }
1858
- $subDict = $obj;
1859
- }
1860
- if (ref $subDict eq 'ARRAY') {
1861
- # convert array of key/value pairs to a hash
1862
- next if @$subDict < 2;
1863
- my %hash = ( _tags => [] );
1864
- while (@$subDict >= 2) {
1865
- my $key = shift @$subDict;
1866
- $key =~ s/^\///;
1867
- push @{$hash{_tags}}, $key;
1868
- $hash{$key} = shift @$subDict;
1869
- }
1870
- $subDict = \%hash;
1871
- } else {
1872
- next unless ref $subDict eq 'HASH';
1873
- }
1874
- # set flag to re-crypt all strings when rewriting if the dictionary
1875
- # came from an encrypted stream
1876
- $$subDict{_needCrypt}{'*'} = 1 unless $lastFetched;
1877
- my $subTablePtr = GetTagTable($tagInfo->{SubDirectory}->{TagTable});
1878
- if (not $verbose) {
1879
- my $proc = $$subTablePtr{PROCESS_PROC} || \&ProcessDict;
1880
- &$proc($et, $subTablePtr, $subDict, $xref, $nesting);
1881
- } elsif ($next) {
1882
- # handle 'Next' links at this level to avoid deep recursion
1883
- undef $next;
1884
- $index = 0;
1885
- $tagTablePtr = $subTablePtr;
1886
- $dict = $subDict;
1887
- @tags = @{$$subDict{_tags}};
1888
- $et->VerboseDir($tag, scalar(@tags));
1889
- } else {
1890
- my $oldIndent = $$et{INDENT};
1891
- my $oldDir = $$et{DIR_NAME};
1892
- $$et{INDENT} .= '| ';
1893
- $$et{DIR_NAME} = $tag;
1894
- $et->VerboseDir($tag, scalar(@{$$subDict{_tags}}));
1895
- ProcessDict($et, $subTablePtr, $subDict, $xref, $nesting);
1896
- $$et{INDENT} = $oldIndent;
1897
- $$et{DIR_NAME} = $oldDir;
1898
- }
1899
- $lastFetched = $prevFetched;
1900
- }
1901
- } else {
1902
- # fetch object if necessary
1903
- # (OS X 10.6 writes indirect objects in the Info dictionary!)
1904
- if (ref $val eq 'SCALAR') {
1905
- my $prevFetched = $lastFetched;
1906
- # (note: fetching the same object multiple times is OK here)
1907
- $val = FetchObject($et, $$val, $xref, $tag);
1908
- if (defined $val) {
1909
- $val = ReadPDFValue($val);
1910
- # set flag to re-encrypt if necessary if rewritten
1911
- $$dict{_needCrypt}{$tag} = ($lastFetched ? 0 : 1) if $cryptString;
1912
- $lastFetched = $prevFetched; # restore last fetched object reference
1913
- }
1914
- } else {
1915
- $val = ReadPDFValue($val);
1916
- }
1917
- # convert from UTF-16 (big endian) to UTF-8 or Latin if necessary
1918
- # unless this is binary data (hex-encoded strings would not have been converted)
1919
- if (ref $val) {
1920
- if (ref $val eq 'ARRAY') {
1921
- my $v;
1922
- foreach $v (@$val) {
1923
- $et->FoundTag($tagInfo, $v);
1924
- }
1925
- }
1926
- } elsif (defined $val) {
1927
- my $format = $$tagInfo{Format} || $$tagInfo{Writable} || 'string';
1928
- $val = ConvertPDFDate($val) if $format eq 'date';
1929
- if (not $$tagInfo{Binary} and $val =~ /[\x18-\x1f\x80-\xff]/) {
1930
- # text string is already in Unicode if it starts with "\xfe\xff",
1931
- # otherwise we must first convert from PDFDocEncoding
1932
- $val = $et->Decode($val, ($val=~s/^\xfe\xff// ? 'UCS2' : 'PDFDoc'), 'MM');
1933
- }
1934
- if ($$tagInfo{List} and not $$et{OPTIONS}{NoPDFList}) {
1935
- # separate tokens in comma or whitespace delimited lists
1936
- my @values = ($val =~ /,/) ? split /,+\s*/, $val : split ' ', $val;
1937
- foreach $val (@values) {
1938
- $et->FoundTag($tagInfo, $val);
1939
- }
1940
- } else {
1941
- # a simple tag value
1942
- $et->FoundTag($tagInfo, $val);
1943
- }
1944
- }
1945
- }
1946
- if ($isSubDoc) {
1947
- # restore original document number
1948
- $$et{DOC_NUM} = $oldDocNum;
1949
- --$$et{DOC_COUNT} if $oldNumTags == $$et{NUM_FOUND};
1950
- }
1951
- }
1952
- #
1953
- # extract information from joined streams if necessary
1954
- #
1955
-
1956
- if (%join) {
1957
- my ($tag, $i);
1958
- foreach $tag (sort keys %join) {
1959
- my $list = $join{$tag};
1960
- last unless defined $$list[1] and $$list[1] =~ /^%.*?([\x0d\x0a]*)/;
1961
- my $buff = "%!PS-Adobe-3.0$1"; # add PS header with same line break
1962
- for ($i=1; defined $$list[$i]; ++$i) {
1963
- $buff .= $$list[$i];
1964
- undef $$list[$i]; # free memory
1965
- }
1966
- # increment document number for tags extracted from embedded EPS
1967
- my $oldDocNum = $$et{DOC_NUM};
1968
- my $oldNumTags = $$et{NUM_FOUND};
1969
- $$et{DOC_NUM} = ++$$et{DOC_COUNT};
1970
- # extract PostScript information
1971
- $et->HandleTag($tagTablePtr, $tag, $buff);
1972
- $$et{DOC_NUM} = $oldDocNum;
1973
- # revert document counter if we didn't add any new tags
1974
- --$$et{DOC_COUNT} if $oldNumTags == $$et{NUM_FOUND};
1975
- delete $$et{DOC_NUM};
1976
- }
1977
- }
1978
- #
1979
- # extract information from stream object if it exists (eg. Metadata stream)
1980
- #
1981
- for (;;) { # (cheap goto)
1982
- last unless $$dict{_stream};
1983
- my $tag = '_stream';
1984
- # add Subtype (if it exists) to stream name and remove leading '/'
1985
- ($tag = $$dict{Subtype} . $tag) =~ s/^\/// if $$dict{Subtype};
1986
- last unless $$tagTablePtr{$tag};
1987
- my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag) or last;
1988
- unless ($$tagInfo{SubDirectory}) {
1989
- # don't build filter lists across different images
1990
- delete $$et{LIST_TAGS}{$$tagTablePtr{Filter}};
1991
- # we arrive here only when extracting embedded images
1992
- # - only extract known image types and ignore others
1993
- my $filter = $$dict{Filter} || '';
1994
- $filter = @$filter[-1] if ref $filter eq 'ARRAY'; # (get last Filter type)
1995
- my $result;
1996
- if ($filter eq '/DCTDecode' or $filter eq '/JPXDecode') {
1997
- DecodeStream($et, $dict) or last;
1998
- # save the image itself
1999
- $et->FoundTag($tagInfo, \$$dict{_stream});
2000
- # extract information from embedded image
2001
- $result = $et->ExtractInfo(\$$dict{_stream}, { ReEntry => 1 });
2002
- }
2003
- unless ($result) {
2004
- $et->FoundTag('FileType', defined $result ? '(unknown)' : '(unsupported)');
2005
- }
2006
- last;
2007
- }
2008
- # decode stream if necessary
2009
- DecodeStream($et, $dict) or last;
2010
- # extract information from stream
2011
- my %dirInfo = (
2012
- DataPt => \$$dict{_stream},
2013
- DataLen => length $$dict{_stream},
2014
- DirStart => 0,
2015
- DirLen => length $$dict{_stream},
2016
- Parent => 'PDF',
2017
- );
2018
- my $subTablePtr = GetTagTable($tagInfo->{SubDirectory}->{TagTable});
2019
- unless ($et->ProcessDirectory(\%dirInfo, $subTablePtr)) {
2020
- $et->Warn("Error processing $$tagInfo{Name} information");
2021
- }
2022
- last;
2023
- }
2024
- }
2025
-
2026
- #------------------------------------------------------------------------------
2027
- # Extract information from PDF file
2028
- # Inputs: 0) ExifTool object reference, 1) dirInfo reference
2029
- # Returns: 0 if not a PDF file, 1 on success, otherwise a negative error number
2030
- sub ReadPDF($$)
2031
- {
2032
- my ($et, $dirInfo) = @_;
2033
- my $raf = $$dirInfo{RAF};
2034
- my $verbose = $et->Options('Verbose');
2035
- my ($buff, $encrypt, $id);
2036
- #
2037
- # validate PDF file
2038
- #
2039
- # (linearization dictionary must be in the first 1024 bytes of the file)
2040
- $raf->Read($buff, 1024) >= 8 or return 0;
2041
- $buff =~ /^%PDF-(\d+\.\d+)/ or return 0;
2042
- $pdfVer = $1;
2043
- $et->SetFileType(); # set the FileType tag
2044
- $et->Warn("May not be able to read a PDF version $pdfVer file") if $pdfVer >= 2.0;
2045
- # store PDFVersion tag
2046
- my $tagTablePtr = GetTagTable('Image::ExifTool::PDF::Root');
2047
- $et->HandleTag($tagTablePtr, 'Version', $pdfVer);
2048
- $tagTablePtr = GetTagTable('Image::ExifTool::PDF::Main');
2049
- #
2050
- # check for a linearized PDF (only if reading)
2051
- #
2052
- my $capture = $$et{PDF_CAPTURE};
2053
- unless ($capture) {
2054
- my $lin = 'false';
2055
- if ($buff =~ /<</g) {
2056
- $buff = substr($buff, pos($buff) - 2);
2057
- my $dict = ExtractObject($et, \$buff);
2058
- if (ref $dict eq 'HASH' and $$dict{Linearized} and $$dict{L}) {
2059
- if (not $$et{VALUE}{FileSize}) {
2060
- undef $lin; # can't determine if it is linearized
2061
- } elsif ($$dict{L} == $$et{VALUE}{FileSize}) {
2062
- $lin = 'true';
2063
- }
2064
- }
2065
- }
2066
- $et->HandleTag($tagTablePtr, '_linearized', $lin) if $lin;
2067
- }
2068
- #
2069
- # read the xref tables referenced from startxref at the end of the file
2070
- #
2071
- my @xrefOffsets;
2072
- $raf->Seek(0, 2) or return -2;
2073
- # the %%EOF must occur within the last 1024 bytes of the file (PDF spec, appendix H)
2074
- my $len = $raf->Tell();
2075
- $len = 1024 if $len > 1024;
2076
- $raf->Seek(-$len, 2) or return -2;
2077
- $raf->Read($buff, $len) == $len or return -3;
2078
- # find the LAST xref table in the file (may be multiple %%EOF marks)
2079
- $buff =~ /^.*startxref(\s+)(\d+)(\s+)%%EOF/s or return -4;
2080
- my $ws = $1 . $3;
2081
- my $xr = $2;
2082
- push @xrefOffsets, $xr, 'Main';
2083
- # set input record separator
2084
- local $/ = $ws =~ /(\x0d\x0a|\x0d|\x0a)/ ? $1 : "\x0a";
2085
- my (%xref, @mainDicts, %loaded, $mainFree);
2086
- # initialize variables to capture when rewriting
2087
- if ($capture) {
2088
- $capture->{startxref} = $xr;
2089
- $capture->{xref} = \%xref;
2090
- $capture->{newline} = $/;
2091
- $capture->{mainFree} = $mainFree = { };
2092
- }
2093
- XRef:
2094
- while (@xrefOffsets) {
2095
- my $offset = shift @xrefOffsets;
2096
- my $type = shift @xrefOffsets;
2097
- next if $loaded{$offset}; # avoid infinite recursion
2098
- unless ($raf->Seek($offset, 0)) {
2099
- %loaded or return -5;
2100
- $et->Warn('Bad offset for secondary xref table');
2101
- next;
2102
- }
2103
- # Note: care must be taken because ReadLine may read more than we want if
2104
- # the newline sequence for this table is different than the rest of the file
2105
- for (;;) {
2106
- unless ($raf->ReadLine($buff)) {
2107
- %loaded or return -6;
2108
- $et->Warn('Bad offset for secondary xref table');
2109
- next XRef;
2110
- }
2111
- last if $buff =~/\S/; # skip blank lines
2112
- }
2113
- my $loadXRefStream;
2114
- if ($buff =~ s/^\s*xref\s+//s) {
2115
- # load xref table
2116
- for (;;) {
2117
- # read another line if necessary (skipping blank lines)
2118
- $raf->ReadLine($buff) or return -6 until $buff =~ /\S/;
2119
- last if $buff =~ s/^\s*trailer([\s<[(])/$1/s;
2120
- $buff =~ s/^\s*(\d+)\s+(\d+)\s+//s or return -4;
2121
- my ($start, $num) = ($1, $2);
2122
- $raf->Seek(-length($buff), 1) or return -4;
2123
- my $i;
2124
- for ($i=0; $i<$num; ++$i) {
2125
- $raf->Read($buff, 20) == 20 or return -6;
2126
- $buff =~ /^\s*(\d{10}) (\d{5}) (f|n)/s or return -4;
2127
- my $num = $start + $i;
2128
- # save offset for newest copy of all objects
2129
- # (or next object number for free objects)
2130
- unless (defined $xref{$num}) {
2131
- my ($offset, $gen) = (int($1), int($2));
2132
- $xref{$num} = $offset;
2133
- if ($3 eq 'f') {
2134
- # save free objects in last xref table for rewriting
2135
- $$mainFree{$num} = [ $offset, $gen, 'f' ] if $mainFree;
2136
- next;
2137
- }
2138
- # also save offset keyed by object reference string
2139
- $xref{"$num $gen R"} = $offset;
2140
- }
2141
- }
2142
- # (I have a sample from Adobe which has an empty xref table)
2143
- # %xref or return -4; # xref table may not be empty
2144
- $buff = '';
2145
- }
2146
- undef $mainFree; # only do this for the last xref table
2147
- } elsif ($buff =~ s/^\s*(\d+)\s+(\d+)\s+obj//s) {
2148
- # this is a PDF-1.5 cross-reference stream dictionary
2149
- $loadXRefStream = 1;
2150
- } else {
2151
- %loaded or return -4;
2152
- $et->Warn('Invalid secondary xref table');
2153
- next;
2154
- }
2155
- my $mainDict = ExtractObject($et, \$buff, $raf, \%xref);
2156
- unless (ref $mainDict eq 'HASH') {
2157
- %loaded or return -8;
2158
- $et->Warn('Error loading secondary dictionary');
2159
- next;
2160
- }
2161
- if ($loadXRefStream) {
2162
- # decode and save our XRef stream from PDF-1.5 file
2163
- # (but parse it later as required to save time)
2164
- # Note: this technique can potentially result in an old object
2165
- # being used if the file was incrementally updated and an older
2166
- # object from an xref table was replaced by a newer object in an
2167
- # xref stream. But doing so isn't a good idea (if allowed at all)
2168
- # because a PDF 1.4 consumer would also make this same mistake.
2169
- if ($$mainDict{Type} eq '/XRef' and $$mainDict{W} and
2170
- @{$$mainDict{W}} > 2 and $$mainDict{Size} and
2171
- DecodeStream($et, $mainDict))
2172
- {
2173
- # create Index entry if it doesn't exist
2174
- $$mainDict{Index} or $$mainDict{Index} = [ 0, $$mainDict{Size} ];
2175
- # create '_entry_size' entry for internal use
2176
- my $w = $$mainDict{W};
2177
- my $size = 0;
2178
- foreach (@$w) { $size += $_; }
2179
- $$mainDict{_entry_size} = $size;
2180
- # save this stream dictionary to use later if required
2181
- $xref{dicts} = [] unless $xref{dicts};
2182
- push @{$xref{dicts}}, $mainDict;
2183
- } else {
2184
- %loaded or return -9;
2185
- $et->Warn('Invalid xref stream in secondary dictionary');
2186
- }
2187
- }
2188
- $loaded{$offset} = 1;
2189
- # load XRef stream in hybrid file if it exists
2190
- push @xrefOffsets, $$mainDict{XRefStm}, 'XRefStm' if $$mainDict{XRefStm};
2191
- $encrypt = $$mainDict{Encrypt} if $$mainDict{Encrypt};
2192
- if ($$mainDict{ID} and ref $$mainDict{ID} eq 'ARRAY') {
2193
- $id = ReadPDFValue($mainDict->{ID}->[0]);
2194
- }
2195
- push @mainDicts, $mainDict, $type;
2196
- # load previous xref table if it exists
2197
- push @xrefOffsets, $$mainDict{Prev}, 'Prev' if $$mainDict{Prev};
2198
- }
2199
- #
2200
- # extract encryption information if necessary
2201
- #
2202
- if ($encrypt) {
2203
- if (ref $encrypt eq 'SCALAR') {
2204
- $encrypt = FetchObject($et, $$encrypt, \%xref, 'Encrypt');
2205
- }
2206
- # generate Encryption tag information
2207
- my $err = DecryptInit($et, $encrypt, $id);
2208
- if ($err) {
2209
- $et->Warn($err);
2210
- $$capture{Error} = $err if $capture;
2211
- return -1;
2212
- }
2213
- }
2214
- #
2215
- # extract the information beginning with each of the main dictionaries
2216
- #
2217
- my $i = 0;
2218
- my $num = (scalar @mainDicts) / 2;
2219
- while (@mainDicts) {
2220
- my $dict = shift @mainDicts;
2221
- my $type = shift @mainDicts;
2222
- if ($verbose) {
2223
- ++$i;
2224
- my $n = scalar(@{$$dict{_tags}});
2225
- $et->VPrint(0, "PDF dictionary ($i of $num) with $n entries:\n");
2226
- }
2227
- ProcessDict($et, $tagTablePtr, $dict, \%xref, 0, $type);
2228
- }
2229
- # handle any decryption errors
2230
- if ($encrypt) {
2231
- my $err = $$encrypt{_error};
2232
- if ($err) {
2233
- $et->Warn($err);
2234
- $$capture{Error} = $err if $capture;
2235
- return -1;
2236
- }
2237
- }
2238
- return 1;
2239
- }
2240
-
2241
- #------------------------------------------------------------------------------
2242
- # ReadPDF() warning strings for each error return value
2243
- my %pdfWarning = (
2244
- # -1 is reserved as error return value with no associated warning
2245
- -2 => 'Error seeking in file',
2246
- -3 => 'Error reading file',
2247
- -4 => 'Invalid xref table',
2248
- -5 => 'Invalid xref offset',
2249
- -6 => 'Error reading xref table',
2250
- -7 => 'Error reading trailer',
2251
- -8 => 'Error reading main dictionary',
2252
- -9 => 'Invalid xref stream in main dictionary',
2253
- );
2254
-
2255
- #------------------------------------------------------------------------------
2256
- # Extract information from PDF file
2257
- # Inputs: 0) ExifTool object reference, 1) dirInfo reference
2258
- # Returns: 1 if this was a valid PDF file
2259
- sub ProcessPDF($$)
2260
- {
2261
- my ($et, $dirInfo) = @_;
2262
-
2263
- undef $cryptInfo; # (must not delete after returning so writer can use it)
2264
- undef $cryptStream;
2265
- undef $cryptString;
2266
- my $result = ReadPDF($et, $dirInfo);
2267
- if ($result < 0) {
2268
- $et->Warn($pdfWarning{$result}) if $pdfWarning{$result};
2269
- $result = 1;
2270
- }
2271
- # clean up and return
2272
- undef %streamObjs;
2273
- undef %fetched;
2274
- return $result;
2275
- }
2276
-
2277
- 1; # end
2278
-
2279
-
2280
- __END__
2281
-
2282
- =head1 NAME
2283
-
2284
- Image::ExifTool::PDF - Read PDF meta information
2285
-
2286
- =head1 SYNOPSIS
2287
-
2288
- This module is loaded automatically by Image::ExifTool when required.
2289
-
2290
- =head1 DESCRIPTION
2291
-
2292
- This code reads meta information from PDF (Adobe Portable Document Format)
2293
- files. It supports object streams introduced in PDF-1.5 but only with a
2294
- limited set of Filter and Predictor algorithms, however all standard
2295
- encryption methods through PDF-1.7 extension level 3 are supported,
2296
- including AESV2 (AES-128) and AESV3 (AES-256).
2297
-
2298
- =head1 AUTHOR
2299
-
2300
- Copyright 2003-2015, Phil Harvey (phil at owl.phy.queensu.ca)
2301
-
2302
- This library is free software; you can redistribute it and/or modify it
2303
- under the same terms as Perl itself.
2304
-
2305
- =head1 REFERENCES
2306
-
2307
- =over 4
2308
-
2309
- =item L<http://partners.adobe.com/public/developer/pdf/index_reference.html>
2310
-
2311
- =item L<Crypt::RC4|Crypt::RC4>
2312
-
2313
- =item L<http://www.adobe.com/devnet/acrobat/pdfs/PDF32000_2008.pdf>
2314
-
2315
- =item L<http://www.adobe.com/content/dam/Adobe/en/devnet/pdf/pdfs/adobe_supplement_iso32000.pdf>
2316
-
2317
- =item L<http://tools.ietf.org/search/rfc3454>
2318
-
2319
- =item L<http://www.armware.dk/RFC/rfc/rfc4013.html>
2320
-
2321
- =back
2322
-
2323
- =head1 SEE ALSO
2324
-
2325
- L<Image::ExifTool::TagNames/PDF Tags>,
2326
- L<Image::ExifTool(3pm)|Image::ExifTool>
2327
-
2328
- =cut