Как разделить мультидокумент PDF на основе закладки с помощью PDF :: API2 - PullRequest
0 голосов
/ 14 апреля 2011

Можно ли использовать PDF :: API2 для разделения многодокументного PDF на основе закладки?Например, если myfile.pdf содержит следующие закладки:

  • bookmark1
  • bookmark2
  • bookmark3

Затем его необходимо разделить на следующие отдельные PDF-файлы:

  • bookmark1.pdf
  • bookmark2.pdf
  • bookmark3.pdf

Я не могу найти термин bookmark в документации PDF :: API2.Это то, что относится к наброскам ?

Спасибо!

1 Ответ

3 голосов
/ 14 апреля 2011

Я немного попробовал это в Perl, затем бросил и оценил тяжелую работу до pdftk . Я все еще контролирую это из Perl. Вот пример сценария, где у моих закладок были такие заголовки, как «Глава 1» и «Приложение 1». Вы, вероятно, можете адаптировать этот скрипт, но понимаете, что некоторые вещи характерны для моего использования. Я также использую некоторые новые функции, но если вы не хотите использовать Perl 5.13, вы можете легко отключить эти части:

use 5.013;

use Data::Dumper;
use File::Basename;
use File::Spec::Functions;
use File::Path qw(make_path);

my $pdftk = 'pdftk';


    my $file = $ARGV[0];
    say ("\n$0 <FILENAME>") && exit 1 unless $file;

my $dir  = dirname( $file ) || '.';
my $output_dir = $ARGV[1] || $dir;

unless( -e $output_dir ) {
    make_path $output_dir, { mode => 0755 } unless -e $output_dir;
    die "mkdir failed: $!" unless -e $output_dir;
    }


my $string = `$pdftk @{[quotemeta($file)]} dump_data output -`;

my( $last_page ) = $string =~ m/NumberOfPages: (\d+)/;
say "last page is $last_page";

my $regex = qr/
    BookmarkTitle:      \s+ (?<title>.*?) \s+
    BookmarkLevel:      \s+ (?<level>\d+) \s+
    BookmarkPageNumber: \s+ (?<page>\d+)
    /x;

my @page_numbers;
while( $string =~ /$regex/g ) {
    next unless $+{level} == 1;
    push @page_numbers, [ @+{ qw(title page) } ];
    }

say "Last index is $#page_numbers";

# Chapter&#160;1.&#160;Introduction
while( my( $index, $elem ) = each @page_numbers ) {
    last if $index == $#page_numbers;
    $page_numbers[$index]->[0] =~ s/&#160;/ /g;
    unshift @$elem,
                    $page_numbers[$index]->[0] =~ s/(?:Chapter|Appendix)\s+(\d+|[ABC]|).?\s+//g

            ?
        $1
            :
        'XX';
    last if $index == $#page_numbers;

    push @$elem, $page_numbers[$index+1]->[-1] - 1;     
    }
unshift @{ $page_numbers[-1] }, 'XX';
push @{ $page_numbers[-1] }, $last_page;

print Dumper( \@page_numbers );

# pdftk A=one.pdf B=two.pdf cat A1-7 B1-5 A8 output combined.pdf
foreach my $elem ( @page_numbers ) {
    my $chapter = $elem->[1] =~ s/\s+/_/rg;
    my $filename = catfile( $output_dir, "$elem->[0].$chapter.pdf" );
    say "Splitting Chapter $elem->[0] $elem->[1]";
    print "Running ", join ' ', $pdftk, $file, 'cat', "$elem->[2]-$elem->[3]", 'output', $filename, "\n";
    system $pdftk, $file, 'cat', "$elem->[2]-$elem->[3]", 'output', $filename;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...