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.
- checksums.yaml +4 -4
- data/bin/Image-ExifTool-10.23/Changes +7480 -0
- data/bin/Image-ExifTool-10.23/MANIFEST +977 -0
- data/bin/Image-ExifTool-10.23/META.yml +28 -0
- data/bin/Image-ExifTool-10.23/Makefile.PL +46 -0
- data/bin/Image-ExifTool-10.23/README +236 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/arg_files/exif2iptc.args +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/arg_files/exif2xmp.args +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/arg_files/gps2xmp.args +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/arg_files/iptc2exif.args +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/arg_files/iptc2xmp.args +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/arg_files/iptcCore.args +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/arg_files/pdf2xmp.args +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/arg_files/xmp2exif.args +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/arg_files/xmp2gps.args +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/arg_files/xmp2iptc.args +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/arg_files/xmp2pdf.args +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/config_files/convert_regions.config +0 -0
- data/bin/Image-ExifTool-10.23/config_files/example.config +343 -0
- data/bin/Image-ExifTool-10.23/config_files/gps2utm.config +256 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/config_files/photoshop_paths.config +0 -0
- data/bin/Image-ExifTool-10.23/config_files/picasa_faces.config +382 -0
- data/bin/Image-ExifTool-10.23/exiftool +6311 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/fmt_files/gpx.fmt +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/fmt_files/gpx_wpt.fmt +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/fmt_files/kml.fmt +0 -0
- data/bin/Image-ExifTool-10.23/html/ExifTool.html +2093 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/MIE1.1-20070121.pdf +0 -0
- data/bin/Image-ExifTool-10.23/html/Shift.html +173 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/AFCP.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/AIFF.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/APE.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/APP12.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/ASF.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Apple.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Audible.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/BMP.html +0 -0
- data/bin/Image-ExifTool-10.23/html/TagNames/BPG.html +118 -0
- data/bin/Image-ExifTool-10.23/html/TagNames/Canon.html +9534 -0
- data/bin/Image-ExifTool-10.23/html/TagNames/CanonCustom.html +2141 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/CanonRaw.html +0 -0
- data/bin/Image-ExifTool-10.23/html/TagNames/CanonVRD.html +2020 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Casio.html +0 -0
- data/bin/Image-ExifTool-10.23/html/TagNames/Composite.html +736 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/DICOM.html +0 -0
- data/bin/Image-ExifTool-10.23/html/TagNames/DNG.html +293 -0
- data/bin/Image-ExifTool-10.23/html/TagNames/DPX.html +229 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/DV.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/DarwinCore.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/DjVu.html +0 -0
- data/bin/Image-ExifTool-10.23/html/TagNames/EXE.html +741 -0
- data/bin/Image-ExifTool-10.23/html/TagNames/EXIF.html +3394 -0
- data/bin/Image-ExifTool-10.23/html/TagNames/Extra.html +469 -0
- data/bin/Image-ExifTool-10.23/html/TagNames/FLAC.html +183 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/FLIR.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Flash.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/FlashPix.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Font.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/FotoStation.html +0 -0
- data/bin/Image-ExifTool-10.23/html/TagNames/FujiFilm.html +824 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/GE.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/GIF.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/GIMP.html +0 -0
- data/bin/Image-ExifTool-10.23/html/TagNames/GPS.html +230 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/GeoTiff.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/H264.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/HP.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/HTML.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/ICC_Profile.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/ID3.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/IPTC.html +0 -0
- data/bin/Image-ExifTool-10.23/html/TagNames/ISO.html +159 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/ITC.html +0 -0
- data/bin/Image-ExifTool-10.23/html/TagNames/JFIF.html +62 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/JPEG.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/JVC.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Jpeg2000.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Kodak.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/KyoceraRaw.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/LNK.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Leaf.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Lytro.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/M2TS.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/MIE.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/MIFF.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/MNG.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/MOI.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/MPC.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/MPEG.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/MPF.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/MWG.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/MXF.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Matroska.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Microsoft.html +0 -0
- data/bin/Image-ExifTool-10.23/html/TagNames/Minolta.html +2625 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/MinoltaRaw.html +0 -0
- data/bin/Image-ExifTool-10.23/html/TagNames/Motorola.html +32 -0
- data/bin/Image-ExifTool-10.23/html/TagNames/Nikon.html +5907 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/NikonCapture.html +0 -0
- data/bin/Image-ExifTool-10.23/html/TagNames/NikonCustom.html +6590 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Nintendo.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/OOXML.html +0 -0
- data/bin/Image-ExifTool-10.23/html/TagNames/Ogg.html +49 -0
- data/bin/Image-ExifTool-10.23/html/TagNames/Olympus.html +3649 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/OpenEXR.html +0 -0
- data/bin/Image-ExifTool-10.23/html/TagNames/Opus.html +62 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/PDF.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/PGF.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/PICT.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/PLIST.html +0 -0
- data/bin/Image-ExifTool-10.23/html/TagNames/PLUS.html +2613 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/PNG.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/PSP.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Palm.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Panasonic.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/PanasonicRaw.html +0 -0
- data/bin/Image-ExifTool-10.23/html/TagNames/Pentax.html +4770 -0
- data/bin/Image-ExifTool-10.23/html/TagNames/PhaseOne.html +253 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/PhotoCD.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/PhotoMechanic.html +0 -0
- data/bin/Image-ExifTool-10.23/html/TagNames/Photoshop.html +739 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/PostScript.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/PrintIM.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Qualcomm.html +0 -0
- data/bin/Image-ExifTool-10.23/html/TagNames/QuickTime.html +6060 -0
- data/bin/Image-ExifTool-10.23/html/TagNames/RIFF.html +1382 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/RSRC.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/RTF.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Radiance.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Rawzor.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Real.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Reconyx.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Ricoh.html +0 -0
- data/bin/Image-ExifTool-10.23/html/TagNames/Samsung.html +616 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Sanyo.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Scalado.html +0 -0
- data/bin/Image-ExifTool-10.23/html/TagNames/Shortcuts.html +279 -0
- data/bin/Image-ExifTool-10.23/html/TagNames/Sigma.html +528 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/SigmaRaw.html +0 -0
- data/bin/Image-ExifTool-10.23/html/TagNames/Sony.html +10264 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/SonyIDC.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Stim.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Theora.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Torrent.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/Unknown.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/VCard.html +0 -0
- data/bin/Image-ExifTool-10.23/html/TagNames/Vorbis.html +243 -0
- data/bin/Image-ExifTool-10.23/html/TagNames/XMP.html +8945 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/ZIP.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/iWork.html +0 -0
- data/bin/Image-ExifTool-10.23/html/TagNames/index.html +217 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/TagNames/style.css +0 -0
- data/bin/Image-ExifTool-10.23/html/ancient_history.html +8209 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/canon_raw.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/commentary.html +0 -0
- data/bin/Image-ExifTool-10.23/html/config.html +355 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/data_members.html +0 -0
- data/bin/Image-ExifTool-10.23/html/exiftool_pod.html +2535 -0
- data/bin/Image-ExifTool-10.23/html/faq.html +1566 -0
- data/bin/Image-ExifTool-10.23/html/filename.html +352 -0
- data/bin/Image-ExifTool-10.23/html/geotag.html +659 -0
- data/bin/Image-ExifTool-10.23/html/history.html +243 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/htmldump.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/idiosyncracies.html +0 -0
- data/bin/Image-ExifTool-10.23/html/index.html +1341 -0
- data/bin/Image-ExifTool-10.23/html/install.html +261 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/metafiles.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/overview.png +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/standards.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/struct.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/style.css +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/under.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/verbose.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/html/writing.html +0 -0
- data/bin/Image-ExifTool-10.23/lib/File/RandomAccess.pm +378 -0
- data/bin/Image-ExifTool-10.23/lib/File/RandomAccess.pod +231 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool.pm +7747 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool.pod +2542 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/AES.pm +501 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/AFCP.pm +286 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/AIFF.pm +289 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/APE.pm +282 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/APP12.pm +322 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/ASF.pm +885 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Apple.pm +129 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Audible.pm +317 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/BMP.pm +179 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/BPG.pm +251 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/BZZ.pm +472 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/BigTIFF.pm +282 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/BuildTagLookup.pm +2527 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Canon.pm +8734 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/CanonCustom.pm +2667 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/CanonRaw.pm +910 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/CanonVRD.pm +2273 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/CaptureOne.pm +235 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Casio.pm +2058 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Charset.pm +423 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/Arabic.pm +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/Baltic.pm +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/Cyrillic.pm +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/Greek.pm +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/Hebrew.pm +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/JIS.pm +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/Latin.pm +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/Latin2.pm +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacArabic.pm +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacChineseCN.pm +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacChineseTW.pm +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacCroatian.pm +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacCyrillic.pm +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacGreek.pm +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacHebrew.pm +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacIceland.pm +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacJapanese.pm +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacKorean.pm +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacLatin2.pm +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacRSymbol.pm +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacRoman.pm +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacRomanian.pm +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacThai.pm +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/MacTurkish.pm +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/PDFDoc.pm +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/ShiftJIS.pm +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/Symbol.pm +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/Thai.pm +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/Turkish.pm +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/lib/Image/ExifTool/Charset/Vietnam.pm +0 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/DICOM.pm +3874 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/DNG.pm +835 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/DPX.pm +182 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/DV.pm +319 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/DarwinCore.pm +322 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/DjVu.pm +376 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/EXE.pm +1401 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Exif.pm +5863 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/FLAC.pm +297 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/FLIR.pm +1533 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Fixup.pm +366 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Flash.pm +755 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/FlashPix.pm +1935 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Font.pm +647 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/FotoStation.pm +261 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/FujiFilm.pm +1232 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/GE.pm +81 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/GIF.pm +542 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/GIMP.pm +258 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/GPS.pm +558 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/GeoTiff.pm +2263 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Geotag.pm +1241 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/H264.pm +1110 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/HP.pm +263 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/HTML.pm +576 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/HtmlDump.pm +897 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/ICC_Profile.pm +1000 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/ID3.pm +1570 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/IPTC.pm +1264 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/ISO.pm +206 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/ITC.pm +215 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Import.pm +329 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/InDesign.pm +277 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/JPEG.pm +605 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/JPEGDigest.pm +2616 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/JVC.pm +130 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Jpeg2000.pm +882 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Kodak.pm +2096 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/KyoceraRaw.pm +173 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/LNK.pm +723 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/cs.pm +1588 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/de.pm +8692 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/en_ca.pm +934 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/en_gb.pm +977 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/es.pm +4019 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/fi.pm +2854 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/fr.pm +4758 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/it.pm +7918 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/ja.pm +5835 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/ko.pm +2330 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/nl.pm +3222 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/pl.pm +1276 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/ru.pm +768 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/sv.pm +638 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/tr.pm +544 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/zh_cn.pm +1330 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lang/zh_tw.pm +801 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Leaf.pm +516 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Lytro.pm +217 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/M2TS.pm +729 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/MIE.pm +2564 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/MIEUnits.pod +377 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/MIFF.pm +279 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/MNG.pm +684 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/MOI.pm +158 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/MPC.pm +156 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/MPEG.pm +736 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/MPF.pm +292 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/MWG.pm +753 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/MXF.pm +3031 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/MakerNotes.pm +1736 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Matroska.pm +892 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Microsoft.pm +904 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Minolta.pm +2981 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/MinoltaRaw.pm +534 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Motorola.pm +62 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Nikon.pm +7970 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/NikonCapture.pm +940 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/NikonCustom.pm +7361 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Nintendo.pm +128 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/OOXML.pm +409 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Ogg.pm +240 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Olympus.pm +3985 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/OpenEXR.pm +323 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Opus.pm +98 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PDF.pm +2367 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PGF.pm +143 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PICT.pm +1260 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PLIST.pm +448 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PLUS.pm +2607 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PNG.pm +1227 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PPM.pm +169 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PSP.pm +306 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Palm.pm +403 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Panasonic.pm +2374 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PanasonicRaw.pm +643 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Pentax.pm +6063 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PhaseOne.pm +707 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PhotoCD.pm +507 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PhotoMechanic.pm +256 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Photoshop.pm +939 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PostScript.pm +699 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/PrintIM.pm +125 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Qualcomm.pm +1344 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/QuickTime.pm +6601 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/README +994 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/RIFF.pm +1587 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/RSRC.pm +241 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/RTF.pm +383 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Radiance.pm +144 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Rawzor.pm +189 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Real.pm +739 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Reconyx.pm +190 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Ricoh.pm +1148 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Samsung.pm +1177 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Sanyo.pm +440 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Scalado.pm +141 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Shift.pl +596 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Shortcuts.pm +337 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Sigma.pm +754 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/SigmaRaw.pm +670 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Sony.pm +9623 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/SonyIDC.pm +332 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Stim.pm +196 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/TagInfoXML.pm +827 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/TagLookup.pm +9250 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/TagNames.pod +29842 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Theora.pm +145 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Torrent.pm +317 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Unknown.pm +66 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/VCard.pm +405 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Vorbis.pm +255 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/WriteCanonRaw.pl +637 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/WriteExif.pl +2466 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/WriteIPTC.pl +706 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/WritePDF.pl +771 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/WritePNG.pl +390 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/WritePhotoshop.pl +266 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/WritePostScript.pl +772 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/WriteQuickTime.pl +358 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/WriteXMP.pl +1380 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/Writer.pl +6220 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/XMP.pm +4071 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/XMP2.pl +1284 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/XMPStruct.pl +843 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/ZIP.pm +667 -0
- data/bin/Image-ExifTool-10.23/lib/Image/ExifTool/iWork.pm +223 -0
- data/bin/Image-ExifTool-10.23/perl-Image-ExifTool.spec +113 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/AFCP.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/AFCP_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/AFCP_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/AIFF.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/AIFF_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/APE.t +0 -0
- data/bin/Image-ExifTool-10.23/t/APE_2.out +30 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/APE_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ASF.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ASF_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Audible.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Audible_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/BMP.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/BMP_2.out +0 -0
- data/bin/Image-ExifTool-10.23/t/BPG.t +28 -0
- data/bin/Image-ExifTool-10.23/t/BPG_2.out +92 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/BigTIFF.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/BigTIFF_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Canon.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonRaw.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonRaw_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonRaw_4.out +0 -0
- data/bin/Image-ExifTool-10.23/t/CanonRaw_5.out +209 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonRaw_6.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonRaw_7.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_11.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_12.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_13.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_14.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_15.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_16.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_17.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_18.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_19.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_20.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_21.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_4.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_5.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_6.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_7.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_8.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/CanonVRD_9.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Canon_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Canon_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Casio.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Casio_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Casio_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Casio_4.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Casio_5.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Casio_6.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/DICOM.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/DICOM_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/DNG.t +0 -0
- data/bin/Image-ExifTool-10.23/t/DNG_2.out +329 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/DNG_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/DPX.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/DPX_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/DV.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/DV_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/DjVu.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/DjVu_2.out +0 -0
- data/bin/Image-ExifTool-10.23/t/EXE.t +31 -0
- data/bin/Image-ExifTool-10.23/t/EXE_2.out +34 -0
- data/bin/Image-ExifTool-10.23/t/EXE_3.out +10 -0
- data/bin/Image-ExifTool-10.23/t/EXE_4.out +8 -0
- data/bin/Image-ExifTool-10.23/t/EXE_5.out +9 -0
- data/bin/Image-ExifTool-10.23/t/EXE_6.out +8 -0
- data/bin/Image-ExifTool-10.23/t/EXE_7.out +10 -0
- data/bin/Image-ExifTool-10.23/t/ExifTool.t +328 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_16.out +0 -0
- data/bin/Image-ExifTool-10.23/t/ExifTool_17.out +598 -0
- data/bin/Image-ExifTool-10.23/t/ExifTool_2.out +427 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_20.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_21.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_22.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_23.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_24.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_25.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_26.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_27.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_28.out +0 -0
- data/bin/Image-ExifTool-10.23/t/ExifTool_29.out +426 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_3.out +0 -0
- data/bin/Image-ExifTool-10.23/t/ExifTool_30.out +2 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_4.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_5.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_6.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_7.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_8.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ExifTool_9.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FLAC.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FLAC_2.out +0 -0
- data/bin/Image-ExifTool-10.23/t/FLAC_3.out +20 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FLIR.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FLIR_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FLIR_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Flash.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FlashPix.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FlashPix_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Flash_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Flash_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Font.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Font_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Font_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Font_4.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Font_5.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Font_6.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Font_7.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FotoStation.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FotoStation_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FotoStation_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FujiFilm.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FujiFilm_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FujiFilm_3.out +0 -0
- data/bin/Image-ExifTool-10.23/t/FujiFilm_4.out +143 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/FujiFilm_5.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GE.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GE_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GE_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GIF.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GIF_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GIF_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GIF_4.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GIMP.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GIMP_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GPS.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GPS_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GPS_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GeoTiff.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GeoTiff_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GeoTiff_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/GeoTiff_4.out +0 -0
- data/bin/Image-ExifTool-10.23/t/Geotag.t +201 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Geotag_10.out +0 -0
- data/bin/Image-ExifTool-10.23/t/Geotag_11.out +3 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Geotag_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Geotag_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Geotag_5.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Geotag_6.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Geotag_7.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Geotag_8.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Geotag_9.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/HTML.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/HTML_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/IPTC.t +0 -0
- data/bin/Image-ExifTool-10.23/t/IPTC_2.out +69 -0
- data/bin/Image-ExifTool-10.23/t/IPTC_4.out +67 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/IPTC_5.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/IPTC_6.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/IPTC_7.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/IPTC_8.out +0 -0
- data/bin/Image-ExifTool-10.23/t/ISO.t +28 -0
- data/bin/Image-ExifTool-10.23/t/ISO_2.out +19 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ITC.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ITC_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/InDesign.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/InDesign_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/InDesign_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/InDesign_4.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/JVC.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/JVC_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/JVC_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Jpeg2000.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Jpeg2000_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Jpeg2000_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Jpeg2000_4.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Kodak.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Kodak_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Kodak_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/KyoceraRaw.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/KyoceraRaw_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/LNK.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/LNK_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_1.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_10.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_11.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_12.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_13.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_14.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_15.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_16.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_17.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_18.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_4.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_5.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_6.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_7.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_8.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lang_9.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lytro.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Lytro_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/M2TS.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/M2TS_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MIE.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MIE_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MIE_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MIE_5.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MIE_6.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MIFF.t +0 -0
- data/bin/Image-ExifTool-10.23/t/MIFF_2.out +114 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MOI.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MOI_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MP3.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MP3_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MWG.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MWG_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MWG_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MWG_4.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MWG_5.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MWG_6.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MXF.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/MXF_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Matroska.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Matroska_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Minolta.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Minolta_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Minolta_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Minolta_4.out +0 -0
- data/bin/Image-ExifTool-10.23/t/Motorola.t +29 -0
- data/bin/Image-ExifTool-10.23/t/Motorola_2.out +97 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Nikon.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Nikon_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Nikon_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Nikon_4.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Nikon_5.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Nikon_7.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Nikon_8.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Olympus.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Olympus_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Olympus_3.out +0 -0
- data/bin/Image-ExifTool-10.23/t/Olympus_4.out +194 -0
- data/bin/Image-ExifTool-10.23/t/Olympus_5.out +266 -0
- data/bin/Image-ExifTool-10.23/t/Olympus_6.out +153 -0
- data/bin/Image-ExifTool-10.23/t/Olympus_7.out +483 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Olympus_8.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/OpenEXR.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/OpenEXR_2.out +0 -0
- data/bin/Image-ExifTool-10.23/t/Opus.t +27 -0
- data/bin/Image-ExifTool-10.23/t/Opus_2.out +26 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_10.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_11.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_12.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_14.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_15.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_16.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_17.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_18.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_19.out +0 -0
- data/bin/Image-ExifTool-10.23/t/PDF_2.out +127 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_20.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_22.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_4.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_5.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_6.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_7.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_8.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PDF_9.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PGF.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PGF_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PICT.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PICT_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PLIST.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PLIST_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PLIST_3.out +0 -0
- data/bin/Image-ExifTool-10.23/t/PLUS.t +45 -0
- data/bin/Image-ExifTool-10.23/t/PLUS_2.out +31 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PNG.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PNG_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PNG_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PNG_4.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PNG_5.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PPM.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PPM_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PPM_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PSP.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PSP_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Palm.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Palm_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Panasonic.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Panasonic_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Panasonic_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Panasonic_4.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Panasonic_5.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Pentax.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Pentax_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Pentax_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Pentax_4.out +0 -0
- data/bin/Image-ExifTool-10.23/t/PhaseOne.t +38 -0
- data/bin/Image-ExifTool-10.23/t/PhaseOne_2.out +99 -0
- data/bin/Image-ExifTool-10.23/t/PhaseOne_3.out +170 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PhotoCD.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PhotoCD_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PhotoMechanic.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PhotoMechanic_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PhotoMechanic_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Photoshop.t +0 -0
- data/bin/Image-ExifTool-10.23/t/Photoshop_2.out +109 -0
- data/bin/Image-ExifTool-10.23/t/Photoshop_3.out +117 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PostScript.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PostScript_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/PostScript_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/QuickTime.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/QuickTime_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/QuickTime_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/QuickTime_4.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/QuickTime_5.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/RIFF.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/RIFF_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/RIFF_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/RIFF_4.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/RTF.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/RTF_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Radiance.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Radiance_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Real.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Real_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Real_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Real_4.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Ricoh.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Ricoh_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Ricoh_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Ricoh_4.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Sanyo.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Sanyo_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Sanyo_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Sigma.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Sigma_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Sigma_3.out +0 -0
- data/bin/Image-ExifTool-10.23/t/Sigma_4.out +65 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Sigma_5.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Sony.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Sony_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Sony_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Sony_5.out +0 -0
- data/bin/Image-ExifTool-10.23/t/TestLib.pm +431 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Torrent.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Torrent_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Unknown.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Unknown_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Unknown_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/VCard.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/VCard_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/VCard_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Vorbis.t +0 -0
- data/bin/Image-ExifTool-10.23/t/Vorbis_2.out +29 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_10.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_11.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_13.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_14.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_15.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_16.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_17.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_18.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_19.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_22.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_24.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_25.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_26.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_27.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_28.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_29.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_30.out +0 -0
- data/bin/Image-ExifTool-10.23/t/Writer_31.out +108 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_32.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_33.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_34.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_35.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_36.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_37.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_38.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_39.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_4.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_40.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_41.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_42.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_43.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_44.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_45.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_46.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_47.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_48.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_50.out +0 -0
- data/bin/Image-ExifTool-10.23/t/Writer_51.out +414 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_52.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_53.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_54.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_55.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_56.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_6.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_7.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/Writer_9.out +0 -0
- data/bin/Image-ExifTool-10.23/t/XMP.t +570 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_10.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_11.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_12.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_13.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_14.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_15.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_16.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_17.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_18.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_19.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_20.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_21.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_22.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_23.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_24.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_25.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_26.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_27.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_28.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_29.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_30.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_31.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_32.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_34.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_36.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_37.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_39.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_40.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_41.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_42.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_43.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_44.out +0 -0
- data/bin/Image-ExifTool-10.23/t/XMP_45.out +23 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_5.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_6.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_7.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_8.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/XMP_9.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ZIP.t +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ZIP_2.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ZIP_3.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ZIP_4.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ZIP_5.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ZIP_6.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/ZIP_7.out +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/AFCP.jpg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/AIFF.aif +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/APE.ape +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/APE.mpc +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/ASF.wmv +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Audible.aa +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/BMP.bmp +0 -0
- data/bin/Image-ExifTool-10.23/t/images/BPG.bpg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/BigTIFF.btf +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Canon.jpg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Canon1DmkIII.jpg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/CanonRaw.cr2 +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/CanonRaw.crw +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/CanonVRD.dr4 +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/CanonVRD.vrd +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/CaptureOne.eip +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Casio.jpg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Casio2.jpg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/CasioQVCI.jpg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/DICOM.dcm +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/DNG.dng +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/DPX.dpx +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/DV.dv +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/DjVu.djvu +0 -0
- data/bin/Image-ExifTool-10.23/t/images/EXE.a +0 -0
- data/bin/Image-ExifTool-10.23/t/images/EXE.dylib +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/EXE.elf +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/EXE.exe +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/EXE.macho +0 -0
- data/bin/Image-ExifTool-10.23/t/images/EXE.so +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/ExifTool.jpg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/ExifTool.tif +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/ExtendedXMP.jpg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/FLAC.flac +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/FLAC.ogg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/FLIR.fpf +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/FLIR.jpg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Flash.flv +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Flash.swf +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/FlashPix.ppt +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Font.afm +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Font.dfont +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Font.pfa +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Font.pfb +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Font.pfm +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Font.ttf +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/FotoStation.jpg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/FujiFilm.jpg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/FujiFilm.raf +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/GE.jpg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/GIF.gif +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/GIMP.xcf +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/GPS.jpg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/GeoTiff.tif +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Geotag.gpx +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Geotag.igc +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Geotag.kml +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Geotag.log +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Geotag.xml +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Geotag2.log +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Geotag3.log +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/HTML.html +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/IPTC.jpg +0 -0
- data/bin/Image-ExifTool-10.23/t/images/ISO.iso +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/ITC.itc +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/InDesign.indd +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/JVC.jpg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/JVC2.jpg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Jpeg2000.j2c +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Jpeg2000.jp2 +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Kodak.jpg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/KyoceraRaw.raw +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/LNK.lnk +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Lytro.lfp +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/M2TS.mts +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/MIE.mie +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/MIFF.miff +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/MOI.moi +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/MP3.mp3 +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/MWG.jpg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/MXF.mxf +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Matroska.mkv +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Minolta.jpg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Minolta.mrw +0 -0
- data/bin/Image-ExifTool-10.23/t/images/Motorola.jpg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Nikon.jpg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Nikon.nef +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/NikonD2Hs.jpg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/NikonD70.jpg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/OOXML.docx +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Olympus.dss +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Olympus.jpg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Olympus2.jpg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/OlympusE1.jpg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/OpenDoc.ods +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/OpenEXR.exr +0 -0
- data/bin/Image-ExifTool-10.23/t/images/Opus.opus +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/PDF.pdf +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/PDF2.pdf +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/PGF.pgf +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/PICT.pict +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/PLIST-bin.plist +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/PLIST-xml.plist +0 -0
- data/bin/Image-ExifTool-10.23/t/images/PLUS.xmp +127 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/PNG.png +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/PPM.ppm +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/PSP.psp +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Palm.mobi +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Panasonic.jpg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Panasonic.rw2 +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Pentax.avi +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Pentax.jpg +0 -0
- data/bin/Image-ExifTool-10.23/t/images/PhaseOne.iiq +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/PhotoCD.pcd +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/PhotoMechanic.jpg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Photoshop.psd +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/PostScript.eps +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/QuickTime.m4a +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/QuickTime.mov +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/RIFF.avi +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/RIFF.wav +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/RIFF.webp +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/RTF.rtf +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Radiance.hdr +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Real.ra +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Real.ram +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Real.rm +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Ricoh.jpg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Ricoh2.jpg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Sanyo.jpg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Sigma.jpg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Sigma.x3f +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/SigmaDP2.x3f +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Sony.jpg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Sony.pmp +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Torrent.torrent +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Unknown.jpg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/VCard.ics +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/VCard.vcf +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Vorbis.ogg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/Writer.jpg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/XMP.inx +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/XMP.jpg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/XMP.svg +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/XMP.xml +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/XMP.xmp +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/XMP2.xmp +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/XMP3.xmp +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/XMP4.xmp +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/XMP5.xmp +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/XMP6.xmp +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/ZIP.gz +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/ZIP.zip +0 -0
- data/bin/{Image-ExifTool-10.04 → Image-ExifTool-10.23}/t/images/iWork.numbers +0 -0
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +980 -941
- data/bin/Image-ExifTool-10.04/Changes +0 -7227
- data/bin/Image-ExifTool-10.04/MANIFEST +0 -937
- data/bin/Image-ExifTool-10.04/META.yml +0 -27
- data/bin/Image-ExifTool-10.04/Makefile.PL +0 -41
- data/bin/Image-ExifTool-10.04/README +0 -233
- data/bin/Image-ExifTool-10.04/config_files/example.config +0 -343
- data/bin/Image-ExifTool-10.04/config_files/picasa_faces.config +0 -370
- data/bin/Image-ExifTool-10.04/exiftool +0 -6260
- data/bin/Image-ExifTool-10.04/html/ExifTool.html +0 -2070
- data/bin/Image-ExifTool-10.04/html/Shift.html +0 -173
- data/bin/Image-ExifTool-10.04/html/TagNames/Canon.html +0 -9344
- data/bin/Image-ExifTool-10.04/html/TagNames/CanonCustom.html +0 -2081
- data/bin/Image-ExifTool-10.04/html/TagNames/CanonVRD.html +0 -1958
- data/bin/Image-ExifTool-10.04/html/TagNames/Composite.html +0 -705
- data/bin/Image-ExifTool-10.04/html/TagNames/DNG.html +0 -291
- data/bin/Image-ExifTool-10.04/html/TagNames/DPX.html +0 -224
- data/bin/Image-ExifTool-10.04/html/TagNames/EXE.html +0 -697
- data/bin/Image-ExifTool-10.04/html/TagNames/EXIF.html +0 -3383
- data/bin/Image-ExifTool-10.04/html/TagNames/Extra.html +0 -437
- data/bin/Image-ExifTool-10.04/html/TagNames/FLAC.html +0 -183
- data/bin/Image-ExifTool-10.04/html/TagNames/FujiFilm.html +0 -813
- data/bin/Image-ExifTool-10.04/html/TagNames/GPS.html +0 -230
- data/bin/Image-ExifTool-10.04/html/TagNames/JFIF.html +0 -61
- data/bin/Image-ExifTool-10.04/html/TagNames/Minolta.html +0 -2614
- data/bin/Image-ExifTool-10.04/html/TagNames/Nikon.html +0 -4836
- data/bin/Image-ExifTool-10.04/html/TagNames/NikonCustom.html +0 -5633
- data/bin/Image-ExifTool-10.04/html/TagNames/Ogg.html +0 -44
- data/bin/Image-ExifTool-10.04/html/TagNames/Olympus.html +0 -3534
- data/bin/Image-ExifTool-10.04/html/TagNames/Pentax.html +0 -4693
- data/bin/Image-ExifTool-10.04/html/TagNames/PhaseOne.html +0 -253
- data/bin/Image-ExifTool-10.04/html/TagNames/Photoshop.html +0 -575
- data/bin/Image-ExifTool-10.04/html/TagNames/QuickTime.html +0 -6040
- data/bin/Image-ExifTool-10.04/html/TagNames/RIFF.html +0 -1344
- data/bin/Image-ExifTool-10.04/html/TagNames/Samsung.html +0 -604
- data/bin/Image-ExifTool-10.04/html/TagNames/Shortcuts.html +0 -277
- data/bin/Image-ExifTool-10.04/html/TagNames/Sigma.html +0 -469
- data/bin/Image-ExifTool-10.04/html/TagNames/Sony.html +0 -8781
- data/bin/Image-ExifTool-10.04/html/TagNames/Vorbis.html +0 -228
- data/bin/Image-ExifTool-10.04/html/TagNames/XMP.html +0 -9175
- data/bin/Image-ExifTool-10.04/html/TagNames/index.html +0 -211
- data/bin/Image-ExifTool-10.04/html/ancient_history.html +0 -7903
- data/bin/Image-ExifTool-10.04/html/config.html +0 -355
- data/bin/Image-ExifTool-10.04/html/exiftool_pod.html +0 -2514
- data/bin/Image-ExifTool-10.04/html/faq.html +0 -1534
- data/bin/Image-ExifTool-10.04/html/filename.html +0 -352
- data/bin/Image-ExifTool-10.04/html/geotag.html +0 -654
- data/bin/Image-ExifTool-10.04/html/history.html +0 -263
- data/bin/Image-ExifTool-10.04/html/index.html +0 -1331
- data/bin/Image-ExifTool-10.04/html/install.html +0 -255
- data/bin/Image-ExifTool-10.04/lib/File/RandomAccess.pm +0 -378
- data/bin/Image-ExifTool-10.04/lib/File/RandomAccess.pod +0 -231
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool.pm +0 -7499
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool.pod +0 -2504
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/AES.pm +0 -501
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/AFCP.pm +0 -286
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/AIFF.pm +0 -289
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/APE.pm +0 -264
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/APP12.pm +0 -322
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/ASF.pm +0 -885
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Apple.pm +0 -128
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Audible.pm +0 -317
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/BMP.pm +0 -179
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/BZZ.pm +0 -472
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/BigTIFF.pm +0 -282
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/BuildTagLookup.pm +0 -2513
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Canon.pm +0 -8482
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/CanonCustom.pm +0 -2582
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/CanonRaw.pm +0 -910
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/CanonVRD.pm +0 -2240
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/CaptureOne.pm +0 -235
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Casio.pm +0 -2058
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Charset.pm +0 -396
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/DICOM.pm +0 -3874
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/DNG.pm +0 -835
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/DPX.pm +0 -181
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/DV.pm +0 -319
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/DarwinCore.pm +0 -322
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/DjVu.pm +0 -376
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/EXE.pm +0 -1253
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Exif.pm +0 -4687
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/FLAC.pm +0 -297
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/FLIR.pm +0 -1533
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Fixup.pm +0 -354
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Flash.pm +0 -755
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/FlashPix.pm +0 -1935
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Font.pm +0 -647
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/FotoStation.pm +0 -261
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/FujiFilm.pm +0 -1196
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/GE.pm +0 -81
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/GIF.pm +0 -542
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/GIMP.pm +0 -258
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/GPS.pm +0 -558
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/GeoTiff.pm +0 -2263
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Geotag.pm +0 -1221
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/H264.pm +0 -1112
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/HP.pm +0 -263
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/HTML.pm +0 -576
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/HtmlDump.pm +0 -895
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/ICC_Profile.pm +0 -1000
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/ID3.pm +0 -1569
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/IPTC.pm +0 -1264
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/ITC.pm +0 -215
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Import.pm +0 -329
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/InDesign.pm +0 -277
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/JPEG.pm +0 -605
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/JPEGDigest.pm +0 -2511
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/JVC.pm +0 -130
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Jpeg2000.pm +0 -882
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Kodak.pm +0 -2096
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/KyoceraRaw.pm +0 -173
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/LNK.pm +0 -723
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/cs.pm +0 -1588
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/de.pm +0 -8692
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/en_ca.pm +0 -848
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/en_gb.pm +0 -863
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/es.pm +0 -4019
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/fi.pm +0 -2854
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/fr.pm +0 -4758
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/it.pm +0 -7918
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/ja.pm +0 -5835
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/ko.pm +0 -2330
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/nl.pm +0 -3222
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/pl.pm +0 -1276
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/ru.pm +0 -768
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/sv.pm +0 -638
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/tr.pm +0 -544
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/zh_cn.pm +0 -1330
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lang/zh_tw.pm +0 -801
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Leaf.pm +0 -516
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Lytro.pm +0 -217
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/M2TS.pm +0 -725
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/MIE.pm +0 -2564
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/MIEUnits.pod +0 -377
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/MIFF.pm +0 -279
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/MNG.pm +0 -684
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/MOI.pm +0 -158
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/MPC.pm +0 -156
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/MPEG.pm +0 -736
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/MPF.pm +0 -292
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/MWG.pm +0 -753
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/MXF.pm +0 -3031
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/MakerNotes.pm +0 -1725
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Matroska.pm +0 -892
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Microsoft.pm +0 -904
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Minolta.pm +0 -2961
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/MinoltaRaw.pm +0 -534
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Nikon.pm +0 -6751
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/NikonCapture.pm +0 -940
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/NikonCustom.pm +0 -6331
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Nintendo.pm +0 -128
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/OOXML.pm +0 -409
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Ogg.pm +0 -237
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Olympus.pm +0 -3797
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/OpenEXR.pm +0 -324
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PDF.pm +0 -2328
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PGF.pm +0 -143
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PICT.pm +0 -1260
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PLIST.pm +0 -453
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PNG.pm +0 -1227
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PPM.pm +0 -169
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PSP.pm +0 -306
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Palm.pm +0 -403
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Panasonic.pm +0 -2374
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PanasonicRaw.pm +0 -643
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Pentax.pm +0 -5973
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PhaseOne.pm +0 -551
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PhotoCD.pm +0 -507
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PhotoMechanic.pm +0 -256
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Photoshop.pm +0 -650
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PostScript.pm +0 -696
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/PrintIM.pm +0 -125
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Qualcomm.pm +0 -1344
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/QuickTime.pm +0 -6576
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/README +0 -981
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/RIFF.pm +0 -1530
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/RSRC.pm +0 -241
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/RTF.pm +0 -383
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Radiance.pm +0 -144
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Rawzor.pm +0 -189
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Real.pm +0 -739
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Reconyx.pm +0 -190
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Ricoh.pm +0 -1148
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Samsung.pm +0 -1168
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Sanyo.pm +0 -440
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Scalado.pm +0 -141
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Shift.pl +0 -596
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Shortcuts.pm +0 -336
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Sigma.pm +0 -684
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/SigmaRaw.pm +0 -668
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Sony.pm +0 -9219
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/SonyIDC.pm +0 -331
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Stim.pm +0 -196
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/TagInfoXML.pm +0 -827
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/TagLookup.pm +0 -8948
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/TagNames.pod +0 -29199
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Theora.pm +0 -145
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Torrent.pm +0 -317
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Unknown.pm +0 -66
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/VCard.pm +0 -405
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Vorbis.pm +0 -238
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/WriteCanonRaw.pl +0 -637
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/WriteExif.pl +0 -3741
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/WriteIPTC.pl +0 -706
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/WritePDF.pl +0 -768
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/WritePNG.pl +0 -390
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/WritePhotoshop.pl +0 -266
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/WritePostScript.pl +0 -772
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/WriteQuickTime.pl +0 -358
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/WriteXMP.pl +0 -1367
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/Writer.pl +0 -6165
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/XMP.pm +0 -4034
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/XMP2.pl +0 -1579
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/XMPStruct.pl +0 -828
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/ZIP.pm +0 -667
- data/bin/Image-ExifTool-10.04/lib/Image/ExifTool/iWork.pm +0 -223
- data/bin/Image-ExifTool-10.04/perl-Image-ExifTool.spec +0 -112
- data/bin/Image-ExifTool-10.04/t/APE_2.out +0 -29
- data/bin/Image-ExifTool-10.04/t/CanonRaw_5.out +0 -209
- data/bin/Image-ExifTool-10.04/t/DNG_2.out +0 -328
- data/bin/Image-ExifTool-10.04/t/EXE.t +0 -31
- data/bin/Image-ExifTool-10.04/t/EXE_2.out +0 -41
- data/bin/Image-ExifTool-10.04/t/EXE_3.out +0 -16
- data/bin/Image-ExifTool-10.04/t/EXE_4.out +0 -15
- data/bin/Image-ExifTool-10.04/t/ExifTool.t +0 -304
- data/bin/Image-ExifTool-10.04/t/ExifTool_17.out +0 -598
- data/bin/Image-ExifTool-10.04/t/ExifTool_2.out +0 -418
- data/bin/Image-ExifTool-10.04/t/FLAC_3.out +0 -20
- data/bin/Image-ExifTool-10.04/t/FujiFilm_4.out +0 -141
- data/bin/Image-ExifTool-10.04/t/Geotag.t +0 -185
- data/bin/Image-ExifTool-10.04/t/IPTC_2.out +0 -60
- data/bin/Image-ExifTool-10.04/t/IPTC_4.out +0 -58
- data/bin/Image-ExifTool-10.04/t/MIFF_2.out +0 -110
- data/bin/Image-ExifTool-10.04/t/Olympus_4.out +0 -194
- data/bin/Image-ExifTool-10.04/t/Olympus_5.out +0 -266
- data/bin/Image-ExifTool-10.04/t/Olympus_6.out +0 -153
- data/bin/Image-ExifTool-10.04/t/Olympus_7.out +0 -483
- data/bin/Image-ExifTool-10.04/t/PDF_2.out +0 -118
- data/bin/Image-ExifTool-10.04/t/Photoshop_2.out +0 -98
- data/bin/Image-ExifTool-10.04/t/Photoshop_3.out +0 -110
- data/bin/Image-ExifTool-10.04/t/Sigma_4.out +0 -65
- data/bin/Image-ExifTool-10.04/t/TestLib.pm +0 -427
- data/bin/Image-ExifTool-10.04/t/Vorbis_2.out +0 -29
- data/bin/Image-ExifTool-10.04/t/Writer_31.out +0 -99
- data/bin/Image-ExifTool-10.04/t/Writer_51.out +0 -405
- 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
|