Какой лучший способ создания многостраничных PDF-файлов с помощью Perl и PDF :: API2? - PullRequest
2 голосов
/ 25 февраля 2011

Я использовал модуль PDF :: API2 для программирования PDF. Я работаю в складской компании, и мы пытаемся перейти с текстовых упаковочных листов на PDF-упаковочные листы. На упаковочных листах есть список товаров, необходимых для одного заказа. Это прекрасно работает, но я столкнулся с проблемой. В настоящее время моя программа генерирует одну страницу PDF, и все это работало нормально. Но теперь я понимаю, что PDF должен состоять из нескольких страниц, если в заказе более 30 элементов. Я пытался придумать простой (иш) способ сделать это, но не смог придумать один. Единственное, о чем я мог подумать, - это создать другую страницу и иметь логику, которая переопределяет координаты позиций, если есть несколько страниц. Поэтому я пытался выяснить, есть ли другой метод или что-то, чего мне не хватало, что могло бы помочь, но я действительно ничего не нашел в CPAN.

По сути, мне нужно создать одностраничный PDF-файл, если в нем нет> 30 элементов. Тогда оно должно быть кратным.

Я надеюсь, что это имело смысл, и любая помощь будет принята с благодарностью, поскольку я относительно новичок в программировании.

Ответы [ 4 ]

3 голосов
/ 25 февраля 2011

Поскольку у вас уже есть код, работающий с одностраничными PDF-файлами, изменить его на работу с многостраничными PDF-файлами не должно быть слишком сложно.

Попробуйте что-то вроде этого:

use PDF::API2;

sub create_packing_list_pdf {
    my @items = @_;
    my $pdf = PDF::API2->new();
    my $page = _add_pdf_page($pdf);

    my $max_items_per_page = 30;
    my $item_pos = 0;
    while (my $item = shift(@items)) {
        $item_pos++;

        # Create a new page, if needed
        if ($item_pos > $max_items_per_page) {
            $page = _add_pdf_page($pdf);
            $item_pos = 1;
        }

        # Add the item at the appropriate height for that position
        # (you'll need to declare $base_height and $line_height)
        my $y = $base_height - ($item_pos - 1) * $line_height;

        # Your code to display the line here, using $y as needed
        # to get the right coordinates
    }

    return $pdf;
}

sub _add_pdf_page {
    my $pdf = shift();

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

    # Your code to display the page template here.
    #
    # Note: You can use a different template for additional pages by
    # looking at e.g. $pdf->pages(), which returns the page count.
    #
    # If you need to include a "Page 1 of 2", you can pass the total
    # number of pages in as an argument:
    # int(scalar @items / $max_items_per_page) + 1

    return $page;
}

Главное - это отделить шаблон страницы от позиций, чтобы вы могли легко начать новую страницу без дублирования кода.

2 голосов
/ 25 февраля 2011

PDF :: API2 является низкоуровневым.В нем нет того, что вы считаете необходимым для документа, например, полей, блоков и абзацев.Из-за этого, я боюсь, вам придется делать вещи трудным путем.Вы можете посмотреть PDF :: API2 :: Simple.Он может соответствовать вашим критериям и прост в использовании.

1 голос
/ 29 июня 2012

Самый простой способ - использовать PDF-API2-Simple

my @content;
my $pdf = PDF::API2::Simple->new(file => "$name");
$pdf->add_font('Courier');
$pdf->add_page();
foreach $line (@content)
{
    $pdf->text($line, autoflow => 'on');
}
$pdf->save();
1 голос
/ 25 февраля 2011

Я использую PDF::FromHTML для некоторых подобных работ.Кажется, это разумный выбор, я думаю, я не слишком хорош в позиционировании вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...