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