exiftool-vendored.exe 12.60.0 → 12.62.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -14,48 +14,49 @@ supported by ExifTool (r = read, w = write, c = create):
14
14
 
15
15
  File Types
16
16
  ------------+-------------+-------------+-------------+------------
17
- 360 r/w | DPX r | ITC r | NRW r/w | RAM r
18
- 3FR r | DR4 r/w/c | J2C r | NUMBERS r | RAR r
19
- 3G2 r/w | DSS r | JNG r/w | O r | RAW r/w
20
- 3GP r/w | DV r | JP2 r/w | ODP r | RIFF r
21
- A r | DVB r/w | JPEG r/w | ODS r | RSRC r
22
- AA r | DVR-MS r | JSON r | ODT r | RTF r
23
- AAE r | DYLIB r | JXL r | OFR r | RW2 r/w
24
- AAX r/w | EIP r | K25 r | OGG r | RWL r/w
25
- ACR r | EPS r/w | KDC r | OGV r | RWZ r
26
- AFM r | EPUB r | KEY r | ONP r | RM r
27
- AI r/w | ERF r/w | LA r | OPUS r | SEQ r
28
- AIFF r | EXE r | LFP r | ORF r/w | SKETCH r
29
- APE r | EXIF r/w/c | LIF r | ORI r/w | SO r
30
- ARQ r/w | EXR r | LNK r | OTF r | SR2 r/w
31
- ARW r/w | EXV r/w/c | LRV r/w | PAC r | SRF r
32
- ASF r | F4A/V r/w | M2TS r | PAGES r | SRW r/w
33
- AVI r | FFF r/w | M4A/V r/w | PBM r/w | SVG r
34
- AVIF r/w | FITS r | MACOS r | PCD r | SWF r
35
- AZW r | FLA r | MAX r | PCX r | THM r/w
36
- BMP r | FLAC r | MEF r/w | PDB r | TIFF r/w
37
- BPG r | FLIF r/w | MIE r/w/c | PDF r/w | TORRENT r
38
- BTF r | FLV r | MIFF r | PEF r/w | TTC r
39
- CHM r | FPF r | MKA r | PFA r | TTF r
40
- COS r | FPX r | MKS r | PFB r | TXT r
41
- CR2 r/w | GIF r/w | MKV r | PFM r | VCF r
42
- CR3 r/w | GPR r/w | MNG r/w | PGF r | VNT r
43
- CRM r/w | GZ r | MOBI r | PGM r/w | VRD r/w/c
44
- CRW r/w | HDP r/w | MODD r | PLIST r | VSD r
45
- CS1 r/w | HDR r | MOI r | PICT r | WAV r
46
- CSV r | HEIC r/w | MOS r/w | PMP r | WDP r/w
47
- CUR r | HEIF r/w | MOV r/w | PNG r/w | WEBP r/w
48
- CZI r | HTML r | MP3 r | PPM r/w | WEBM r
49
- DCM r | ICC r/w/c | MP4 r/w | PPT r | WMA r
50
- DCP r/w | ICO r | MPC r | PPTX r | WMV r
51
- DCR r | ICS r | MPG r | PS r/w | WTV r
52
- DFONT r | IDML r | MPO r/w | PSB r/w | WV r
53
- DIVX r | IIQ r/w | MQV r/w | PSD r/w | X3F r/w
54
- DJVU r | IND r/w | MRC r | PSP r | XCF r
55
- DLL r | INSP r/w | MRW r/w | QTIF r/w | XLS r
56
- DNG r/w | INSV r | MXF r | R3D r | XLSX r
57
- DOC r | INX r | NEF r/w | RA r | XMP r/w/c
58
- DOCX r | ISO r | NKSC r/w | RAF r/w | ZIP r
17
+ 360 r/w | DR4 r/w/c | JNG r/w | ODP r | RSRC r
18
+ 3FR r | DSS r | JP2 r/w | ODS r | RTF r
19
+ 3G2 r/w | DV r | JPEG r/w | ODT r | RW2 r/w
20
+ 3GP r/w | DVB r/w | JSON r | OFR r | RWL r/w
21
+ A r | DVR-MS r | JXL r | OGG r | RWZ r
22
+ AA r | DYLIB r | K25 r | OGV r | RM r
23
+ AAE r | EIP r | KDC r | ONP r | SEQ r
24
+ AAX r/w | EPS r/w | KEY r | OPUS r | SKETCH r
25
+ ACR r | EPUB r | LA r | ORF r/w | SO r
26
+ AFM r | ERF r/w | LFP r | ORI r/w | SR2 r/w
27
+ AI r/w | EXE r | LIF r | OTF r | SRF r
28
+ AIFF r | EXIF r/w/c | LNK r | PAC r | SRW r/w
29
+ APE r | EXR r | LRV r/w | PAGES r | SVG r
30
+ ARQ r/w | EXV r/w/c | M2TS r | PBM r/w | SWF r
31
+ ARW r/w | F4A/V r/w | M4A/V r/w | PCD r | THM r/w
32
+ ASF r | FFF r/w | MACOS r | PCX r | TIFF r/w
33
+ AVI r | FITS r | MAX r | PDB r | TORRENT r
34
+ AVIF r/w | FLA r | MEF r/w | PDF r/w | TTC r
35
+ AZW r | FLAC r | MIE r/w/c | PEF r/w | TTF r
36
+ BMP r | FLIF r/w | MIFF r | PFA r | TXT r
37
+ BPG r | FLV r | MKA r | PFB r | VCF r
38
+ BTF r | FPF r | MKS r | PFM r | VNT r
39
+ CHM r | FPX r | MKV r | PGF r | VRD r/w/c
40
+ COS r | GIF r/w | MNG r/w | PGM r/w | VSD r
41
+ CR2 r/w | GPR r/w | MOBI r | PLIST r | WAV r
42
+ CR3 r/w | GZ r | MODD r | PICT r | WDP r/w
43
+ CRM r/w | HDP r/w | MOI r | PMP r | WEBP r/w
44
+ CRW r/w | HDR r | MOS r/w | PNG r/w | WEBM r
45
+ CS1 r/w | HEIC r/w | MOV r/w | PPM r/w | WMA r
46
+ CSV r | HEIF r/w | MP3 r | PPT r | WMV r
47
+ CUR r | HTML r | MP4 r/w | PPTX r | WPG r
48
+ CZI r | ICC r/w/c | MPC r | PS r/w | WTV r
49
+ DCM r | ICO r | MPG r | PSB r/w | WV r
50
+ DCP r/w | ICS r | MPO r/w | PSD r/w | X3F r/w
51
+ DCR r | IDML r | MQV r/w | PSP r | XCF r
52
+ DFONT r | IIQ r/w | MRC r | QTIF r/w | XLS r
53
+ DIVX r | IND r/w | MRW r/w | R3D r | XLSX r
54
+ DJVU r | INSP r/w | MXF r | RA r | XMP r/w/c
55
+ DLL r | INSV r | NEF r/w | RAF r/w | ZIP r
56
+ DNG r/w | INX r | NKSC r/w | RAM r |
57
+ DOC r | ISO r | NRW r/w | RAR r |
58
+ DOCX r | ITC r | NUMBERS r | RAW r/w |
59
+ DPX r | J2C r | O r | RIFF r |
59
60
 
60
61
  Meta Information
61
62
  ----------------------+----------------------+---------------------
@@ -107,8 +108,8 @@ your home directory, then you would type the following commands in a
107
108
  terminal window to extract and run ExifTool:
108
109
 
109
110
  cd ~/Desktop
110
- gzip -dc Image-ExifTool-12.60.tar.gz | tar -xf -
111
- cd Image-ExifTool-12.60
111
+ gzip -dc Image-ExifTool-12.62.tar.gz | tar -xf -
112
+ cd Image-ExifTool-12.62
112
113
  ./exiftool t/images/ExifTool.jpg
113
114
 
114
115
  Note: These commands extract meta information from one of the test images.
@@ -11,7 +11,7 @@ use strict;
11
11
  use warnings;
12
12
  require 5.004;
13
13
 
14
- my $version = '12.60';
14
+ my $version = '12.62';
15
15
 
16
16
  # add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
17
17
  my $exePath;
@@ -379,13 +379,14 @@ if ($exePath =~ /\(([^\\\/]+)\)(.exe|.pl)?$/i) {
379
379
 
380
380
  # isolate arguments common to all commands
381
381
  if (grep /^-common_args$/i, @ARGV) {
382
- my (@newArgs, $common);
382
+ my (@newArgs, $common, $end);
383
383
  foreach (@ARGV) {
384
- if (/^-common_args$/i) {
384
+ if (/^-common_args$/i and not $end) {
385
385
  $common = 1;
386
386
  } elsif ($common) {
387
387
  push @commonArgs, $_;
388
388
  } else {
389
+ $end = 1 if $_ eq '--';
389
390
  push @newArgs, $_;
390
391
  }
391
392
  }
@@ -850,7 +851,7 @@ for (;;) {
850
851
  $mt->Options(Charset => $charset);
851
852
  }
852
853
  if ($evalWarning) {
853
- warn $evalWarning;
854
+ Warn $evalWarning;
854
855
  } else {
855
856
  $setCharset = $mt->Options('Charset');
856
857
  }
@@ -1735,7 +1736,8 @@ if ($textOut) {
1735
1736
  if ($outOpt) {
1736
1737
  my $type = GetFileType($outOpt);
1737
1738
  if ($type) {
1738
- unless (CanWrite($type)) {
1739
+ # (must test original file name because we can write .webp but not other RIFF types)
1740
+ unless (CanWrite($outOpt)) {
1739
1741
  Warn "Can't write $type files\n";
1740
1742
  $rtnVal = 1;
1741
1743
  next;
@@ -1949,23 +1951,31 @@ sub GetImageInfo($$)
1949
1951
  my (@foundTags, $info, $file, $ind, $g8);
1950
1952
 
1951
1953
  # set window title for this file if necessary
1952
- if (defined $windowTitle and $progressCount >= $progressNext) {
1953
- my $prog = $progressMax ? "$progressCount/$progressMax" : '0/0';
1954
- my $title = $windowTitle;
1955
- my ($num, $denom) = split '/', $prog;
1956
- my $frac = $num / ($denom || 1);
1957
- my $n = $title =~ s/%(\d+)b/%b/ ? $1 : 20; # length of bar
1958
- my $bar = int($frac * $n + 0.5);
1959
- my %lkup = (
1960
- b => ('I' x $bar) . ('.' x ($n - $bar)), # (undocumented)
1961
- f => $orig,
1962
- p => int(100 * $frac + 0.5),
1963
- r => $prog,
1964
- '%'=> '%',
1965
- );
1966
- $title =~ s/%([%bfpr])/$lkup{$1}/eg;
1967
- SetWindowTitle($title);
1968
- undef $progressNext;
1954
+ if (defined $windowTitle) {
1955
+ if ($progressCount >= $progressNext) {
1956
+ my $prog = $progressMax ? "$progressCount/$progressMax" : '0/0';
1957
+ my $title = $windowTitle;
1958
+ my ($num, $denom) = split '/', $prog;
1959
+ my $frac = $num / ($denom || 1);
1960
+ my $n = $title =~ s/%(\d+)b/%b/ ? $1 : 20; # length of bar
1961
+ my $bar = int($frac * $n + 0.5);
1962
+ my %lkup = (
1963
+ b => ('I' x $bar) . ('.' x ($n - $bar)),
1964
+ f => $orig,
1965
+ p => int(100 * $frac + 0.5),
1966
+ r => $prog,
1967
+ '%'=> '%',
1968
+ );
1969
+ $title =~ s/%([%bfpr])/$lkup{$1}/eg;
1970
+ SetWindowTitle($title);
1971
+ if (defined $progressMax) {
1972
+ undef $progressNext;
1973
+ } else {
1974
+ $progressNext += $progressIncr;
1975
+ }
1976
+ }
1977
+ # ($progressMax is not defined for "-progress:%f")
1978
+ ++$progressCount unless defined $progressMax;
1969
1979
  }
1970
1980
  unless (length $orig or $outOpt) {
1971
1981
  Warn qq(Error: Zero-length file name - ""\n);
@@ -1991,7 +2001,11 @@ sub GetImageInfo($$)
1991
2001
  }
1992
2002
  # set alternate file names
1993
2003
  foreach $g8 (sort keys %altFile) {
1994
- my $altName = FilenameSPrintf($altFile{$g8}, $orig);
2004
+ my $altName = $orig;
2005
+ # must double any '$' symbols in the original file name because
2006
+ # they are used for tag names in a -fileNUM argument
2007
+ $altName =~ s/\$/\$\$/g;
2008
+ $altName = FilenameSPrintf($altFile{$g8}, $altName);
1995
2009
  $et->SetAlternateFile($g8, $altName);
1996
2010
  }
1997
2011
 
@@ -2534,6 +2548,7 @@ TAG: foreach $tag (@foundTags) {
2534
2548
  $xtra .= " et:table='${table}'";
2535
2549
  $xtra .= " et:index='${index}'" if defined $index;
2536
2550
  }
2551
+ # Note: New $xtra attributes must be added to %ignoreEtProp in XMP.pm!
2537
2552
  my $lastVal = $val;
2538
2553
  for ($valNum=0; $valNum<2; ++$valNum) {
2539
2554
  $val = FormatXML($val, $ind, $group);
@@ -3698,7 +3713,7 @@ sub ProcessFiles($;$)
3698
3713
  if (defined $progressMax) {
3699
3714
  unless (defined $progressNext) {
3700
3715
  $progressNext = $progressCount + $progressIncr;
3701
- $progressNext -= $progressNext % $progressIncr;
3716
+ $progressNext -= $progressNext % $progressIncr; # (show even multiples)
3702
3717
  $progressNext = $progressMax if $progressNext > $progressMax;
3703
3718
  }
3704
3719
  ++$progressCount;
@@ -4477,7 +4492,7 @@ sub Progress($$)
4477
4492
  my ($file, $msg) = @_;
4478
4493
  if (defined $progStr) {
4479
4494
  print $file $msg, $progStr, "\n";
4480
- undef $progressNext;
4495
+ undef $progressNext if defined $progressMax;
4481
4496
  }
4482
4497
  }
4483
4498
 
@@ -4599,48 +4614,49 @@ DESCRIPTION
4599
4614
 
4600
4615
  File Types
4601
4616
  ------------+-------------+-------------+-------------+------------
4602
- 360 r/w | DPX r | ITC r | NRW r/w | RAM r
4603
- 3FR r | DR4 r/w/c | J2C r | NUMBERS r | RAR r
4604
- 3G2 r/w | DSS r | JNG r/w | O r | RAW r/w
4605
- 3GP r/w | DV r | JP2 r/w | ODP r | RIFF r
4606
- A r | DVB r/w | JPEG r/w | ODS r | RSRC r
4607
- AA r | DVR-MS r | JSON r | ODT r | RTF r
4608
- AAE r | DYLIB r | JXL r | OFR r | RW2 r/w
4609
- AAX r/w | EIP r | K25 r | OGG r | RWL r/w
4610
- ACR r | EPS r/w | KDC r | OGV r | RWZ r
4611
- AFM r | EPUB r | KEY r | ONP r | RM r
4612
- AI r/w | ERF r/w | LA r | OPUS r | SEQ r
4613
- AIFF r | EXE r | LFP r | ORF r/w | SKETCH r
4614
- APE r | EXIF r/w/c | LIF r | ORI r/w | SO r
4615
- ARQ r/w | EXR r | LNK r | OTF r | SR2 r/w
4616
- ARW r/w | EXV r/w/c | LRV r/w | PAC r | SRF r
4617
- ASF r | F4A/V r/w | M2TS r | PAGES r | SRW r/w
4618
- AVI r | FFF r/w | M4A/V r/w | PBM r/w | SVG r
4619
- AVIF r/w | FITS r | MACOS r | PCD r | SWF r
4620
- AZW r | FLA r | MAX r | PCX r | THM r/w
4621
- BMP r | FLAC r | MEF r/w | PDB r | TIFF r/w
4622
- BPG r | FLIF r/w | MIE r/w/c | PDF r/w | TORRENT r
4623
- BTF r | FLV r | MIFF r | PEF r/w | TTC r
4624
- CHM r | FPF r | MKA r | PFA r | TTF r
4625
- COS r | FPX r | MKS r | PFB r | TXT r
4626
- CR2 r/w | GIF r/w | MKV r | PFM r | VCF r
4627
- CR3 r/w | GPR r/w | MNG r/w | PGF r | VNT r
4628
- CRM r/w | GZ r | MOBI r | PGM r/w | VRD r/w/c
4629
- CRW r/w | HDP r/w | MODD r | PLIST r | VSD r
4630
- CS1 r/w | HDR r | MOI r | PICT r | WAV r
4631
- CSV r | HEIC r/w | MOS r/w | PMP r | WDP r/w
4632
- CUR r | HEIF r/w | MOV r/w | PNG r/w | WEBP r/w
4633
- CZI r | HTML r | MP3 r | PPM r/w | WEBM r
4634
- DCM r | ICC r/w/c | MP4 r/w | PPT r | WMA r
4635
- DCP r/w | ICO r | MPC r | PPTX r | WMV r
4636
- DCR r | ICS r | MPG r | PS r/w | WTV r
4637
- DFONT r | IDML r | MPO r/w | PSB r/w | WV r
4638
- DIVX r | IIQ r/w | MQV r/w | PSD r/w | X3F r/w
4639
- DJVU r | IND r/w | MRC r | PSP r | XCF r
4640
- DLL r | INSP r/w | MRW r/w | QTIF r/w | XLS r
4641
- DNG r/w | INSV r | MXF r | R3D r | XLSX r
4642
- DOC r | INX r | NEF r/w | RA r | XMP r/w/c
4643
- DOCX r | ISO r | NKSC r/w | RAF r/w | ZIP r
4617
+ 360 r/w | DR4 r/w/c | JNG r/w | ODP r | RSRC r
4618
+ 3FR r | DSS r | JP2 r/w | ODS r | RTF r
4619
+ 3G2 r/w | DV r | JPEG r/w | ODT r | RW2 r/w
4620
+ 3GP r/w | DVB r/w | JSON r | OFR r | RWL r/w
4621
+ A r | DVR-MS r | JXL r | OGG r | RWZ r
4622
+ AA r | DYLIB r | K25 r | OGV r | RM r
4623
+ AAE r | EIP r | KDC r | ONP r | SEQ r
4624
+ AAX r/w | EPS r/w | KEY r | OPUS r | SKETCH r
4625
+ ACR r | EPUB r | LA r | ORF r/w | SO r
4626
+ AFM r | ERF r/w | LFP r | ORI r/w | SR2 r/w
4627
+ AI r/w | EXE r | LIF r | OTF r | SRF r
4628
+ AIFF r | EXIF r/w/c | LNK r | PAC r | SRW r/w
4629
+ APE r | EXR r | LRV r/w | PAGES r | SVG r
4630
+ ARQ r/w | EXV r/w/c | M2TS r | PBM r/w | SWF r
4631
+ ARW r/w | F4A/V r/w | M4A/V r/w | PCD r | THM r/w
4632
+ ASF r | FFF r/w | MACOS r | PCX r | TIFF r/w
4633
+ AVI r | FITS r | MAX r | PDB r | TORRENT r
4634
+ AVIF r/w | FLA r | MEF r/w | PDF r/w | TTC r
4635
+ AZW r | FLAC r | MIE r/w/c | PEF r/w | TTF r
4636
+ BMP r | FLIF r/w | MIFF r | PFA r | TXT r
4637
+ BPG r | FLV r | MKA r | PFB r | VCF r
4638
+ BTF r | FPF r | MKS r | PFM r | VNT r
4639
+ CHM r | FPX r | MKV r | PGF r | VRD r/w/c
4640
+ COS r | GIF r/w | MNG r/w | PGM r/w | VSD r
4641
+ CR2 r/w | GPR r/w | MOBI r | PLIST r | WAV r
4642
+ CR3 r/w | GZ r | MODD r | PICT r | WDP r/w
4643
+ CRM r/w | HDP r/w | MOI r | PMP r | WEBP r/w
4644
+ CRW r/w | HDR r | MOS r/w | PNG r/w | WEBM r
4645
+ CS1 r/w | HEIC r/w | MOV r/w | PPM r/w | WMA r
4646
+ CSV r | HEIF r/w | MP3 r | PPT r | WMV r
4647
+ CUR r | HTML r | MP4 r/w | PPTX r | WPG r
4648
+ CZI r | ICC r/w/c | MPC r | PS r/w | WTV r
4649
+ DCM r | ICO r | MPG r | PSB r/w | WV r
4650
+ DCP r/w | ICS r | MPO r/w | PSD r/w | X3F r/w
4651
+ DCR r | IDML r | MQV r/w | PSP r | XCF r
4652
+ DFONT r | IIQ r/w | MRC r | QTIF r/w | XLS r
4653
+ DIVX r | IND r/w | MRW r/w | R3D r | XLSX r
4654
+ DJVU r | INSP r/w | MXF r | RA r | XMP r/w/c
4655
+ DLL r | INSV r | NEF r/w | RAF r/w | ZIP r
4656
+ DNG r/w | INX r | NKSC r/w | RAM r |
4657
+ DOC r | ISO r | NRW r/w | RAR r |
4658
+ DOCX r | ITC r | NUMBERS r | RAW r/w |
4659
+ DPX r | J2C r | O r | RIFF r |
4644
4660
 
4645
4661
  Meta Information
4646
4662
  ----------------------+----------------------+---------------------
@@ -4677,7 +4693,7 @@ OPTIONS
4677
4693
  -TAG or --TAG Extract or exclude specified tag
4678
4694
  -TAG[+-^]=[VALUE] Write new value for tag
4679
4695
  -TAG[+-]<=DATFILE Write tag value from contents of file
4680
- -TAG[+-]<SRCTAG Copy tag value (see -tagsFromFile)
4696
+ -[+]TAG[+-]<SRCTAG Copy tag value (see -tagsFromFile)
4681
4697
 
4682
4698
  -tagsFromFile SRCFILE Copy tag values from file
4683
4699
  -x TAG (-exclude) Exclude specified tag
@@ -5565,7 +5581,7 @@ OPTIONS
5565
5581
 
5566
5582
  produces output like this:
5567
5583
 
5568
- -- Generated by ExifTool 12.60 --
5584
+ -- Generated by ExifTool 12.62 --
5569
5585
  File: a.jpg - 2003:10:31 15:44:19
5570
5586
  (f/5.6, 1/60s, ISO 100)
5571
5587
  File: b.jpg - 2006:05:23 11:57:38
@@ -6548,12 +6564,23 @@ OPTIONS
6548
6564
  suppresses the output "{readyNUM}" message.
6549
6565
 
6550
6566
  -file*NUM* *ALTFILE*
6551
- Read tags from an alternate source file. These tags are accessed
6552
- via the family 8 group name (eg. "File1:TAG" for the -file1 option,
6553
- "File2:TAG" for -file2, etc). *ALTFILE* may contain filename
6554
- formatting codes %d, %f and %e. Among other things, this allows
6555
- tags from different files to be compared and combined using the -if
6556
- and -p options.
6567
+ Read tags from an alternate source file. Among other things, this
6568
+ allows tags from different files to be compared and combined using
6569
+ the -if and -p options. Tags from alternate files are accessed via
6570
+ the corresponding family 8 group name (eg. "File1:TAG" for the
6571
+ -file1 option, "File2:TAG" for -file2, etc). *ALTFILE* may contain
6572
+ filename formatting codes like the -w option (%d, %f, etc), and/or
6573
+ tag names with a leading "$" symbol to access tags from the source
6574
+ file in the same way as the -p option (so any other dollar symbol
6575
+ in the file name must be doubled, eg. "money$$.jpg"). For example,
6576
+ assuming that the OriginalFileName tag has been set in the edited
6577
+ file, a command to copy Rights from the original file could look
6578
+ like this:
6579
+
6580
+ exiftool -file1 "$originalfilename" "-rights<file1:rights" edited.jpg
6581
+
6582
+ Composite tags may access tags from alternate files using the
6583
+ appropriate (case-sensitive) family 8 group name.
6557
6584
 
6558
6585
  -list_dir
6559
6586
  List directories themselves instead of their contents. This option
@@ -358,4 +358,3 @@ L<Image::ExifTool::TagNames/BMP Tags>,
358
358
  L<Image::ExifTool(3pm)|Image::ExifTool>
359
359
 
360
360
  =cut
361
-
@@ -582,10 +582,10 @@ number of available PDF tags. See
582
582
  L<http://www.adobe.com/devnet/pdf/pdf_reference.html> for the official PDF
583
583
  specification.
584
584
 
585
- ExifTool supports reading and writing PDF documents up to version 1.7
586
- extension level 3, including support for RC4, AES-128 and AES-256
587
- encryption. A L<Password|../ExifTool.html#Password> option is provided to allow processing of
588
- password-protected PDF files.
585
+ ExifTool supports reading and writing PDF documents up to version 2.0,
586
+ including support for RC4, AES-128 and AES-256 encryption. A
587
+ L<Password|../ExifTool.html#Password> option is provided to allow processing
588
+ of password-protected PDF files.
589
589
 
590
590
  ExifTool may be used to write native PDF and XMP metadata to PDF files. It
591
591
  uses an incremental update technique that has the advantages of being both
@@ -21,7 +21,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
21
21
  use Image::ExifTool::Exif;
22
22
  use Image::ExifTool::ASF; # for GetGUID()
23
23
 
24
- $VERSION = '1.44';
24
+ $VERSION = '1.45';
25
25
 
26
26
  sub ProcessFPX($$);
27
27
  sub ProcessFPXR($$$);
@@ -1539,6 +1539,7 @@ sub ReadFPXValue($$$$$;$$)
1539
1539
  }
1540
1540
  $_[2] = $valPos; # return updated value position
1541
1541
 
1542
+ push @vals, '' if $type eq 0; # (VT_EMPTY)
1542
1543
  if (wantarray) {
1543
1544
  return @vals;
1544
1545
  } elsif (@vals > 1) {
@@ -16,7 +16,7 @@ use strict;
16
16
  use vars qw($VERSION);
17
17
  use Image::ExifTool qw(:DataAccess :Utils);
18
18
 
19
- $VERSION = '1.33';
19
+ $VERSION = '1.34';
20
20
 
21
21
  sub ProcessJpeg2000Box($$$);
22
22
  sub ProcessJUMD($$$);
@@ -34,6 +34,9 @@ my %resolutionUnit = (
34
34
  6 => 'um',
35
35
  );
36
36
 
37
+ # top-level boxes containing image data
38
+ my %isImageData = ( jp2c=>1, jbrd=>1, jxlp=>1, jxlc=>1 );
39
+
37
40
  # map of where information is written in JPEG2000 image
38
41
  my %jp2Map = (
39
42
  IPTC => 'UUID-IPTC',
@@ -428,6 +431,7 @@ my %j2cMarker = (
428
431
  # stuff seen in JPEG XL images:
429
432
  #
430
433
  # jbrd - JPEG Bitstream Reconstruction Data (allows lossless conversion back to original JPG)
434
+ # jxlp - partial JXL codestream
431
435
  jxlc => {
432
436
  Name => 'JXLCodestream',
433
437
  Format => 'undef',
@@ -930,7 +934,7 @@ sub ProcessJpeg2000Box($$$)
930
934
  my $raf = $$dirInfo{RAF};
931
935
  my $outfile = $$dirInfo{OutFile};
932
936
  my $dirEnd = $dirStart + $dirLen;
933
- my ($err, $outBuff, $verbose, $doColour);
937
+ my ($err, $outBuff, $verbose, $doColour, $md5);
934
938
 
935
939
  if ($outfile) {
936
940
  unless ($raf) {
@@ -948,6 +952,8 @@ sub ProcessJpeg2000Box($$$)
948
952
  # (must not set verbose flag when writing!)
949
953
  $verbose = $$et{OPTIONS}{Verbose};
950
954
  $et->VerboseDir($$dirInfo{DirName}) if $verbose;
955
+ # do MD5 if requested, but only for top-level image data
956
+ $md5 = $$et{ImageDataMD5} if $raf;
951
957
  }
952
958
  # loop through all contained boxes
953
959
  my ($pos, $boxLen, $lastBox);
@@ -971,6 +977,11 @@ sub ProcessJpeg2000Box($$$)
971
977
  }
972
978
  $boxLen = unpack("x$pos N",$$dataPt); # (length includes header and data)
973
979
  $boxID = substr($$dataPt, $pos+4, 4);
980
+ # (ftbl box contains flst boxes with absolute file offsets, not currently handled)
981
+ if ($outfile and $boxID eq 'ftbl') {
982
+ $et->Error("Can't yet handle fragmented JPX files");
983
+ return -1;
984
+ }
974
985
  # remove old colr boxes if necessary
975
986
  if ($doColour and $boxID eq 'colr') {
976
987
  if ($doColour == 1) { # did we successfully write the new colr box?
@@ -1007,9 +1018,14 @@ sub ProcessJpeg2000Box($$$)
1007
1018
  while ($raf->Read($buff, 65536)) {
1008
1019
  Write($outfile, $buff) or $err = 1;
1009
1020
  }
1010
- } elsif ($verbose) {
1011
- my $msg = sprintf("offset 0x%.4x to end of file", $dataPos + $base + $pos);
1012
- $et->VPrint(0, "$$et{INDENT}- Tag '${boxID}' ($msg)\n");
1021
+ } else {
1022
+ if ($verbose) {
1023
+ my $msg = sprintf("offset 0x%.4x to end of file", $dataPos + $base + $pos);
1024
+ $et->VPrint(0, "$$et{INDENT}- Tag '${boxID}' ($msg)\n");
1025
+ }
1026
+ if ($md5 and $isImageData{$boxID}) {
1027
+ $et->ImageDataMD5($raf, undef, $boxID);
1028
+ }
1013
1029
  }
1014
1030
  last; # (ignore the rest of the file when reading)
1015
1031
  }
@@ -1026,6 +1042,8 @@ sub ProcessJpeg2000Box($$$)
1026
1042
  Write($outfile, $$dataPt) or $err = 1;
1027
1043
  $raf->Read($buff,$boxLen) == $boxLen or $err = '', last;
1028
1044
  Write($outfile, $buff) or $err = 1;
1045
+ } elsif ($md5 and $isImageData{$boxID}) {
1046
+ $et->ImageDataMD5($raf, $boxLen, $boxID);
1029
1047
  } else {
1030
1048
  $raf->Seek($boxLen, 1) or $err = 'Seek error', last;
1031
1049
  }
@@ -1038,6 +1056,10 @@ sub ProcessJpeg2000Box($$$)
1038
1056
  # read the box data
1039
1057
  $dataPos = $raf->Tell() - $base;
1040
1058
  $raf->Read($buff,$boxLen) == $boxLen or $err = '', last;
1059
+ if ($md5 and $isImageData{$boxID}) {
1060
+ $md5->add($buff);
1061
+ $et->VPrint(0, "$$et{INDENT}(ImageDataMD5: $boxLen bytes of $boxID data)\n");
1062
+ }
1041
1063
  $valuePtr = 0;
1042
1064
  $dataLen = $boxLen;
1043
1065
  } elsif ($pos + $boxLen > $dirEnd) {
@@ -1311,7 +1333,7 @@ sub ProcessJP2($$)
1311
1333
  }
1312
1334
 
1313
1335
  #------------------------------------------------------------------------------
1314
- # Read meta information from a JPEG XL image
1336
+ # Read/write meta information in a JPEG XL image
1315
1337
  # Inputs: 0) ExifTool object reference, 1) dirInfo reference
1316
1338
  # Returns: 1 on success, 0 if this wasn't a valid JPEG XL file, -1 on write error
1317
1339
  sub ProcessJXL($$)
@@ -1340,6 +1362,9 @@ sub ProcessJXL($$)
1340
1362
  $$dirInfo{RAF} = new File::RandomAccess(\$buff);
1341
1363
  } else {
1342
1364
  $et->SetFileType('JXL Codestream','image/jxl', 'jxl');
1365
+ if ($$et{ImageDataMD5} and $raf->Seek(0,0)) {
1366
+ $et->ImageDataMD5($raf, undef, 'JXL');
1367
+ }
1343
1368
  return ProcessJXLCodestream($et, \$hdr);
1344
1369
  }
1345
1370
  } else {
@@ -17,7 +17,7 @@ use vars qw($VERSION);
17
17
  use Image::ExifTool qw(:DataAccess :Utils);
18
18
  use Image::ExifTool::Minolta;
19
19
 
20
- $VERSION = '1.17';
20
+ $VERSION = '1.18';
21
21
 
22
22
  sub ProcessMRW($$;$);
23
23
  sub WriteMRW($$;$);
@@ -489,7 +489,7 @@ sub ProcessMRW($$;$)
489
489
  $err and $et->Error("MRW format error", $$et{TIFF_TYPE} eq 'ARW');
490
490
  } else {
491
491
  $err and $et->Warn("MRW format error");
492
- $et->ImageDataMD5($raf, undef, 'raw');
492
+ $et->ImageDataMD5($raf, undef, 'raw') unless $$et{A100DataOffset};
493
493
  }
494
494
  return $rtnVal;
495
495
  }
@@ -64,7 +64,7 @@ use Image::ExifTool::Exif;
64
64
  use Image::ExifTool::GPS;
65
65
  use Image::ExifTool::XMP;
66
66
 
67
- $VERSION = '4.21';
67
+ $VERSION = '4.22';
68
68
 
69
69
  sub LensIDConv($$$);
70
70
  sub ProcessNikonAVI($$$);
@@ -2300,8 +2300,8 @@ my %base64coord = (
2300
2300
  },
2301
2301
  },
2302
2302
  { # (Z6_2 firmware version 1.00 and Z7II firmware versions 1.00 & 1.01, ref 28)
2303
- # 0800=Z6/Z7 0801=Z50 0802=Z5 0803=Z6II/Z7II 0804=Zfc
2304
- Condition => '$$valPt =~ /^080[01234]/',
2303
+ # 0800=Z6/Z7 0801=Z50 0802=Z5 0803=Z6II/Z7II 0804=Zfc 0807=Z30
2304
+ Condition => '$$valPt =~ /^080[012347]/',
2305
2305
  Name => 'ShotInfoZ7II',
2306
2306
  SubDirectory => {
2307
2307
  TagTable => 'Image::ExifTool::Nikon::ShotInfoZ7II',