mirror of
https://github.com/qpdf/qpdf.git
synced 2024-09-27 12:39:06 +00:00
164 lines
6.0 KiB
Perl
164 lines
6.0 KiB
Perl
#!/usr/bin/env perl
|
|
require 5.008;
|
|
use warnings;
|
|
use strict;
|
|
use File::Compare;
|
|
|
|
unshift(@INC, '.');
|
|
require qpdf_test_helpers;
|
|
|
|
chdir("qpdf") or die "chdir testdir failed: $!\n";
|
|
|
|
require TestDriver;
|
|
|
|
cleanup();
|
|
|
|
my $td = new TestDriver('json');
|
|
|
|
my @json_files = (
|
|
['outlines-with-actions', []],
|
|
['outlines-with-old-root-dests', []],
|
|
['page-labels-and-outlines', []],
|
|
['page-labels-num-tree', []],
|
|
['image-streams', []],
|
|
['image-streams-small', []],
|
|
['field-types', []],
|
|
['field-types', ['--show-encryption-key']],
|
|
['image-streams', ['--decode-level=all']],
|
|
['image-streams', ['--decode-level=specialized']],
|
|
['attachment-fields', []],
|
|
['page-labels-and-outlines', ['--json-key=objects']],
|
|
['page-labels-and-outlines', ['--json-key=pages']],
|
|
['page-labels-and-outlines', ['--json-key=pagelabels']],
|
|
['page-labels-and-outlines', ['--json-key=outlines']],
|
|
['page-labels-and-outlines',
|
|
['--json-key=outlines', '--json-key=pages']],
|
|
['page-labels-and-outlines',
|
|
['--json-key=objects', '--json-object=trailer']],
|
|
['page-labels-and-outlines',
|
|
['--json-key=objects', '--json-object=trailer', '--json-object=2 0 R']],
|
|
['field-types', ['--json-key=acroform']],
|
|
['need-appearances', ['--json-key=acroform']],
|
|
['V4-aes', ['--json-key=encrypt']],
|
|
['V4-aes', ['--json-key=encrypt', '--show-encryption-key']],
|
|
);
|
|
my $n_tests = 25 + (2 * scalar(@json_files));
|
|
foreach my $d (@json_files)
|
|
{
|
|
my ($file, $xargs) = @$d;
|
|
my $out = "json-$file";
|
|
foreach my $x (@$xargs)
|
|
{
|
|
my $y = $x;
|
|
$y =~ s/^.*=//;
|
|
$y =~ s/\s.*//;
|
|
$out .= "-$y";
|
|
}
|
|
my $in = "$file.pdf";
|
|
$td->runtest("json v1 $out",
|
|
{$td->COMMAND =>
|
|
['qpdf', '--json=1', '--test-json-schema',
|
|
@$xargs, $in]},
|
|
{$td->FILE => "$out-v1.out", $td->EXIT_STATUS => 0},
|
|
$td->NORMALIZE_NEWLINES);
|
|
$td->runtest("json v2 $out",
|
|
{$td->COMMAND =>
|
|
['qpdf', '--json=2', '--test-json-schema', @$xargs, $in]},
|
|
{$td->FILE => "$out-v2.out", $td->EXIT_STATUS => 0},
|
|
$td->NORMALIZE_NEWLINES);
|
|
}
|
|
|
|
$td->runtest("bad json stream data (inline)",
|
|
{$td->COMMAND =>
|
|
"qpdf --json-output=2 --decode-level=all" .
|
|
" --json-stream-data=inline bad-data.pdf a.json"},
|
|
{$td->FILE => "bad-data-json.out", $td->EXIT_STATUS => 3},
|
|
$td->NORMALIZE_NEWLINES);
|
|
$td->runtest("check (inline)",
|
|
{$td->FILE => "a.json"},
|
|
{$td->FILE => "json-bad-data-json-inline-v2.out"},
|
|
$td->NORMALIZE_NEWLINES);
|
|
$td->runtest("bad json stream data (file)",
|
|
{$td->COMMAND =>
|
|
"qpdf --json-output=2 --decode-level=all" .
|
|
" --json-stream-data=file --json-stream-prefix=auto" .
|
|
" bad-data.pdf a.json"},
|
|
{$td->FILE => "bad-data-json.out", $td->EXIT_STATUS => 3},
|
|
$td->NORMALIZE_NEWLINES);
|
|
$td->runtest("check (file)",
|
|
{$td->FILE => "a.json"},
|
|
{$td->FILE => "json-bad-data-json-file-v2.out"},
|
|
$td->NORMALIZE_NEWLINES);
|
|
$td->runtest("check stream (file)",
|
|
{$td->FILE => "auto-4"},
|
|
{$td->FILE => "bad-data-4.out"});
|
|
|
|
foreach my $l (qw(none generalized specialized all))
|
|
{
|
|
if ($l ne 'all')
|
|
{
|
|
# We don't want a dependency on the exact value of the
|
|
# uncompressed jpeg, which can differ depending on which jpeg
|
|
# library is use.
|
|
$td->runtest("image-streams json inline: $l",
|
|
{$td->COMMAND =>
|
|
"qpdf image-streams-small.pdf - --json-output=2" .
|
|
" --decode-level=$l --json-stream-data=inline"},
|
|
{$td->FILE => "json-image-streams-$l-inline-v2.out",
|
|
$td->EXIT_STATUS => 0},
|
|
$td->NORMALIZE_NEWLINES);
|
|
}
|
|
$td->runtest("image-streams json file: $l",
|
|
{$td->COMMAND =>
|
|
"qpdf image-streams-small.pdf - --json-output=2" .
|
|
" --decode-level=$l --json-stream-data=file" .
|
|
" --json-stream-prefix=auto" .
|
|
" --json-object=12 --json-object=16 --json-object=18"},
|
|
{$td->FILE => "json-image-streams-$l-file-v2.out",
|
|
$td->EXIT_STATUS => 0},
|
|
$td->NORMALIZE_NEWLINES);
|
|
# object 12: /FlateDecode
|
|
# object 16: /DCTDecode
|
|
# object 18: /RunLengthDecode
|
|
my %exp_compression = (
|
|
'12' => {'none' => 1},
|
|
'16' => {'none' => 1, 'generalized' => 1, 'specialized' => 1},
|
|
'18' => {'none' => 1, 'generalized' => 1},
|
|
);
|
|
|
|
foreach my $obj (qw(12 16 18))
|
|
{
|
|
my $compressed = (exists $exp_compression{$obj}{$l});
|
|
my $suf = $compressed ? "compressed" : "uncompressed";
|
|
if (($obj eq '16') && (! $compressed))
|
|
{
|
|
# Rather than testing the uncompressed DCT, just make sure
|
|
# it is different from the compressed DCT.
|
|
my $same = (compare(
|
|
"auto-$obj",
|
|
"image-streams-small-$obj-compressed.out") ?
|
|
"same" : "different");
|
|
$td->runtest("check stream data ($obj, $l)",
|
|
{$td->STRING => $same},
|
|
{$td->STRING => "same"});
|
|
}
|
|
else
|
|
{
|
|
$td->runtest("check stream data ($obj, $l)",
|
|
{$td->FILE => "auto-$obj"},
|
|
{$td->FILE => "image-streams-small-$obj-$suf.out"});
|
|
}
|
|
}
|
|
}
|
|
|
|
$td->runtest("file to stdout without prefix",
|
|
{$td->COMMAND =>
|
|
"qpdf image-streams-small.pdf - --json-output=2" .
|
|
" -json-stream-data=file"},
|
|
{$td->FILE => "file-stdout-needs-prefix.out",
|
|
$td->EXIT_STATUS => 2},
|
|
$td->NORMALIZE_NEWLINES);
|
|
|
|
cleanup();
|
|
$td->report($n_tests);
|