/usr/bin/revertpdf is in libcam-pdf-perl 1.60-1.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | #!/usr/bin/perl -w
eval 'exec /usr/bin/perl -w -S $0 ${1+"$@"}'
if 0; # not running under some shell
package main;
use warnings;
use strict;
use Getopt::Long;
use Pod::Usage;
use English qw(-no_match_vars);
our $VERSION = '1.60';
my %opts = (
count => 0,
verbose => 0,
help => 0,
version => 0,
);
Getopt::Long::Configure('bundling');
GetOptions('c|count' => \$opts{count},
'v|verbose' => \$opts{verbose},
'h|help' => \$opts{help},
'V|version' => \$opts{version},
) or pod2usage(1);
if ($opts{help})
{
pod2usage(-exitstatus => 0, -verbose => 2);
}
if ($opts{version})
{
require CAM::PDF;
print "CAM::PDF v$CAM::PDF::VERSION\n";
exit 0;
}
if (@ARGV < 1)
{
pod2usage(1);
}
my $infile = shift;
my $outfile = shift || q{-};
my $content;
if ($infile eq q{-})
{
$content = do { local $RS = undef; <STDIN>; }; ## no critic(InputOutput::ProhibitExplicitStdin)
}
else
{
open my $in_fh, '<', $infile or die "Failed to open file $infile: $ERRNO\n";
$content = do { local $RS = undef; <$in_fh>; };
close $in_fh or die "Failed to read $infile: $ERRNO\n";
}
my @matches = ($content =~ m/ [\015\012]%%EOF *[\015\012] /gxms);
my $revs = @matches;
if ($opts{count})
{
print "$revs\n";
}
elsif ($revs < 1)
{
die "Error: this does not seem to be a PDF document\n";
}
elsif ($revs == 1)
{
die "Error: there is only one revision in this PDF document. It cannot be reverted.\n";
}
else
{
# Figure out line end character
my ($lineend) = $content =~ m/ (.)%%EOF.*?\z /xms;
if (!$lineend)
{
die "Cannot find the end-of-file marker\n";
}
my $eof = $lineend.'%%EOF';
my $i = rindex $content, $eof;
my $j = rindex $content, $eof, $i-1;
$content = (substr $content, 0, $j) . $eof . $lineend;
if ($outfile eq q{-})
{
print STDOUT $content;
}
else
{
open my $fh, '>', $outfile or die "Cannot write to $outfile: $ERRNO\n";
print {$fh} $content;
close $fh or die "Failed to write $outfile: $ERRNO\n";
}
}
__END__
=for stopwords revertpdf.pl unoptimized
=head1 NAME
revertpdf.pl - Remove the last edits to a PDF document
=head1 SYNOPSIS
revertpdf.pl [options] infile.pdf [outfile.pdf]
Options:
-c --count just print the number of revisions and exits
-v --verbose print diagnostic messages
-h --help verbose help message
-V --version print CAM::PDF version
=head1 DESCRIPTION
PDF documents have the interesting feature that edits can be applied
just to the end of the file without altering the original content.
This makes it possible to recover previous versions of a document.
This is only possible if the editor writes out an 'unoptimized'
version of the PDF.
This program removes the last layer of edits from the PDF document. If
there is just one revision, we emit a message and abort.
The C<--count> option just prints the number of generations the document
has endured and applies no changes.
=head1 SEE ALSO
CAM::PDF
=head1 AUTHOR
See L<CAM::PDF>
=cut
|