2013-09-06 2 views
1

Ниже приведен минимальный код, необходимый для создания одного файла PDF с использованием модуля Perl PDF :: API2. Первый PDF создается отлично. В начале попытки создать второй PDF, процесс терпит неудачу на втором экземпляре линии:Как создать несколько PDF-файлов с использованием PDF API2?

$page = $pdf->page(0); 

с ошибкой, Can't call method "new_obj" on an undefined value at C:/Perl64/site/lib/PDF/API2/Basic/PDF/Pages.pm line 92.

Почему? Что еще более важно, какие изменения я должен сделать, чтобы создать второй pdf-файл?

#!/usr/bin/perl 
    use strict; 
    use warnings; 
    use PDF::API2; 

    my $pdf1 = 'hello_world.pdf'; 
    my $pdf2 = 'hi_mom.pdf'; 
    my $text1 = "Hello World"; 
    my $text2 = "Hi Mom"; 
    my $pdf = PDF::API2->new();  #dynamic pdf file name 
    my $font = $pdf->corefont('Times-Roman', -encoding => 'latin1'); 

    my $page = $pdf->page(0); 
    $page->mediabox(612.0, 792.0); #8.5" x 11.0" in PostScript points 
    my $msg_text = $page->text; 
    $msg_text->transform(-translate =>[72, 144]); #x,y position in points 
    $msg_text->fillcolor('black'); 
    $msg_text->font($font, 100); 
    $msg_text->text($text1); 
    $pdf->saveas($pdf1); 

    print "Make 2nd pdf.\n"; 
    $page = $pdf->page(0); #FAILS! 
    {..} 
    $msg_text->text($text2); 
    $pdf->saveas($pdf2); 
    print "2nd pdf created\n"; 

    $pdf->end(); 

    1; 

ответ

1

Использование Data::Dumper после первых создания $pdf показывает много данных:

$VAR1 = bless({ 
      'catalog' => bless({ }) 
      # Lot lots more, including: 
      'pdf' => $VAR1->{'catalog'}{'Pages'}{' outto'}[0], 
      # Which is referenced several times, e.g. $self->{pdf}->new_obj(...) 
      }, 'PDF::API2'); 

Это все удаляется после вызова saveas, вызывая undefined value ошибку:

$VAR1 = bless({}, 'PDF::API2'); 

Вы могли бы обновить $pdf:

$pdf = PDF::API2->new(); 

, но тогда вам также необходимо будет добавить все другие вызовы методов (corefonts, mediabox, text). Легче добавить код создания PDF в строку:

sub create_pdf { 
    my $name = shift; 
    my $text = shift; 

    my $pdf = PDF::API2->new(); 
    .... 
    $pdf->saveas($name); # also calls end() 
} 

Затем вызовите его дважды с соответствующими аргументами.

create_pdf($pdf1, $text1); 
create_pdf($pdf2, $text2); 

Полный рабочий пример:

#!/usr/bin/perl 
use strict; 
use warnings; 
use PDF::API2; 

my $pdf1 = 'hello_world.pdf'; 
my $pdf2 = 'hi_mom.pdf'; 
my $text1 = "Hello World"; 
my $text2 = "Hi Mom"; 

create_pdf($pdf1, $text1); 
create_pdf($pdf2, $text2); 

sub create_pdf { 
    my $name = shift; 
    my $text = shift; 

    my $pdf = PDF::API2->new();  #dynamic pdf file name 
    my $font = $pdf->corefont('Times-Roman', -encoding => 'latin1'); 

    my $page = $pdf->page(0); 
    $page->mediabox(612.0, 792.0); #8.5" x 11.0" in PostScript points 
    my $msg_text = $page->text; 
    $msg_text->transform(-translate =>[72, 144]); #x,y position in points 
    $msg_text->fillcolor('black'); 
    $msg_text->font($font, 100); 
    $msg_text->text($text); 
    $pdf->saveas($name); 
} 
+0

Спасибо. Естественно, я проведу процедуру моего кода. Второй вызов 'PDF :: API2-> new()' не решает проблему. Ошибка изменяется на «Невозможно вызвать метод« val »по неопределенному значению в C: /Perl64/site/lib/PDF/API2/Resource.pm строке 69.'. Во всяком случае, создание нового экземпляра класса PDF не требуется для создания новой страницы (или я надеюсь). (Обычно я был бы ответом, который даже не работает. Но я ценю помощь и, кроме того, возможно, что я делаю что-то неправильно в применении вашего решения? Знаете ли вы, что это работает? Если нет, я предлагаю удалить его.) – Karl

+2

Я предполагаю, что вызов 'saveas()' завершает внутренний объект и делает его непригодным для дальнейшего использования. В документации это не так, но, возможно, это просто упущение. –

+0

Отлично, спасибо @RobEarl. Я думаю, возможно, @Slaven Rezic прав, что после возвращения 'saveas()' объект уничтожается, хотя, если это так, я удивлен, что ошибка указывает на неопределенный вызов метода. PDF :: API2 замечательный, но неплохо использовать немного больше документации, IMO. (Возможно, я прочитаю источник и опубликую здесь мои выводы.) – Karl

-2
if($lineas_pag == 160){ 
    $page2 = $pdf->importpage($old, 2); 
    $page2->mediabox('Letter'); 
    my $msg_text = $page2->text; 
    my $font = $pdf->corefont('Arial-Bold', -encoding => 'latin1');     
    $msg_text->font($font, 8);  
    $txt= $msg_text; 
} 
$txt->translate(96 ,$lineas_pag); $txt->text(" HOLA "); 
+1

Попробуйте форматировать свой код, и, возможно, потребуется разъяснение. Отметьте код четырьмя пробелами для создания кодового блока. – ShellFish

+0

Хорошие ответы дают объяснение. –

Смежные вопросы