2

マージするPDFドキュメントがたくさんあるので、このコードを作成してマージしました。マージするPDFドキュメントが2つしかない場合は機能しますが、2つ以上指定すると、余分なドキュメントが文字化けして表示されます。何が悪いのかを見つけるのを手伝ってもらえますか?

#!/usr/bin/perl

use PDF::API2;
use List::Util qw( reduce );


# Given two pdfs and a page number, appends the given page of the second pdf to the first pdf
sub append_page_to_pdf {
    my ( $pdf1, $pdf2, $pg ) = @_;
    $pdf1->importpage( $pdf2, $pg );
}

# Given two pdfs, appends the second to the first.  Closes pdf2
sub merge_2_pdfs {
    my ($pdf1, $pdf2) = @_;
    map &append_page_to_pdf( $pdf1, $pdf2, $_ ), 1..$pdf2->pages;
    $pdf2->end;
    return $pdf1;
}

# does what it says
sub open_pdf {
    my $file = $_[0];
    my $pdf = PDF::API2->open( $file );
    print "Opened pdf ( $file )\n";
    return $pdf;
}

# reduces merge_2_pdfs over an array of pdfs
sub merge_pdfs {
    my @files = @_;
    my $starting_filename = shift @files;
    my $start_pdf = &open_pdf( $starting_filename );
    my $final_pdf = reduce { &merge_2_pdfs( $a, &open_pdf( $b ) ) } $start_pdf, @files;
    return $final_pdf;
}

# Get the arguments ie save_name, file1, file2, file3, ...
my @files = @ARGV;
my $save_name = shift @files;
my $save = &merge_pdfs( @files );
$save->saveas( $save_name );
4

3 に答える 3

4

コードの実際の問題はshift、ファイルをマージする前にファイルの 1 つをオフにしたためです。

my $save_name = shift @files; 
# which should be 
my $save_name = $files[0];

それ以外の場合、コードは実際に機能し、文字化けは見つかりませんでした。

いくつかのヒント:

  1. use strictuse warnings

  2. &現在の一般的な方法は、サブルーチン呼び出しでを省略することです。その規則の例外については、こちらを参照してください。

  3. この場合、サブルーチンによってコードが冗長になり、理解が難しくなります。ここにもっと簡潔なものがあります。

    use strict;
    use warnings;
    use List::Util 'reduce';
    use PDF::API2;
    
    my $new
      = reduce { $a->importpage($b, $_) foreach 1 .. $b->pages; $a }
        map { PDF::API2->open($_) }
        @ARGV;
    $new->saveas('new.pdf');
    
  4. 単純なループは、 を使用するよりも読みやすいですreduce

    use PDF::API2;
    
    my $new = PDF::API2->new;
    foreach my $filename (@ARGV) {
        my $pdf = PDF::API2->open($filename);
        $new->importpage($pdf, $_) foreach 1 .. $pdf->pages;
    }
    $new->saveas('new.pdf');
    
于 2012-04-13T01:03:02.640 に答える
1

もう1つの可能性は、私のライブラリであるCAM::PDFです。

my $pdf1 = CAM::PDF->new($file1) or die;
my $pdf2 = CAM::PDF->new($file2) or die;
my $pdf3 = CAM::PDF->new($file3) or die;
$pdf1->appendPDF($pdf2);
$pdf1->appendPDF($pdf3);
$pdf1->cleanoutput($outfile);

または、おそらく@ARGV上のループでラップします。たった2つのPDFの場合、同じことを行うための単純なコマンドラインラッパーがあります。

appendpdf.pl file1.pdf file2.pdf out.pdf

于 2012-05-05T03:08:28.470 に答える
1

PDF::再利用

prFile('myFile.pdf');
for my $pdf (@PDFS) {
    prDoc($pdf);
}
prEnd();
于 2012-04-12T17:24:01.103 に答える