Как сдвинуть страницу PDF с помощью perl (CAM :: PDF, PDF :: API2)? - PullRequest
2 голосов
/ 09 апреля 2010

У меня есть PDF-документ, который мне нужен, чтобы сместить страницы вправо на несколько дюймов То есть, как поле на левой стороне страницы.

Может ли CAM :: PDF или PDF :: API2 сделать это? Или есть у кого опыт с этим?

Спасибо.

Ответы [ 3 ]

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

Я автор CAM :: PDF . Следующая небольшая программа сдвигает содержимое страницы вправо на 100 пунктов.

use CAM::PDF;
my $pdf = CAM::PDF->new('my.pdf');
my $page = $pdf->getPage(1);
$page->{MediaBox}->{value}->[0]->{value} -= 100;
$page->{MediaBox}->{value}->[2]->{value} -= 100;
$pdf->cleanoutput('out.pdf');

Я использовал «use Data :: Dumper; print Dumper ($ page);» напомнить себе о структуре данных $ page.

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

Вот как я бы это сделал в PDF :: API2:

use PDF::API2;

my $in  = PDF::API2->open('/path/to/file.pdf');
my $out = PDF::API2->new();

# Choose your margin (72 = one inch)
my $x_offset = 72;
my $y_offset = 0;

foreach my $page_num (1 .. $in->pages()) {
    # Take the source page and import it as an XObject
    my $xobject = $out->importPageIntoForm($in, $page_num);

    # Add the XObject to the new PDF
    my $page = $out->page();
    my $gfx = $page->gfx();
    $gfx->formimage($xobject, $x_offset, $y_offset);
}
$out->saveas('/path/to/new.pdf');

Еще один способ, который должен работать, - это отрегулировать координаты для мультимедийного блока (и, возможно, других блоков):

use PDF::API2;

my $pdf = PDF::API2->open('/path/to/file.pdf');

# Choose your margin (72 = one inch)
my $x_offset = 72;
my $y_offset = 0;

foreach my $page_num (1 .. $pdf->pages()) {
    my $page = $pdf->openpage($page_num);

    # Get the coordinates for the page corners
    my ($llx, $lly, $urx, $ury) = $page->get_mediabox();

    # Add the margin by shifting the mediabox in the opposite direction
    $llx -= $x_offset;
    $lly -= $y_offset;
    $urx -= $x_offset;
    $ury -= $y_offset;

    # Store the new coordinates for the page corners
    $page->mediabox($llx, $lly, $urx, $ury);
}

$pdf->saveas('/path/to/new.pdf');

Если у вас возникнут проблемы с отключением контента, вам может потребоваться получить и установить один или несколько из cropbox, bleedbox, trimbox и artbox, но это должно работать в большинстве случаев.случаи.

1 голос
/ 10 сентября 2010

Вы можете сделать это также с помощью Ghostscript . Я приведу несколько примеров команд для Windows (при использовании Unix просто замените gswin32c.exe на gs):

gswin32c.exe ^
   -o input-shifted-pages-1-inch-to-left.pdf ^
   -sDEVICE=pdfwrite ^
   -c "<</PageOffset [-72 0]>> setpagedevice" ^
   -f /path/to/input.pdf
  1. -o: указывает выходной файл. Неявно также использует -dNOPAUSE -dBATCH -dSAFER.
  2. -sDEVICE=...: просит Ghostscript вывести PDF.
  3. -c <<...: фрагмент кода PostScript, переданный в командную строку для осуществления сдвига страницы
  4. -f ...: указывает входной PDF (-f требуется после использования -c).

Единицы, используемые /PageShift, являются точками PostScript. 72 пт == 1 дюйм Значение [-72 0] сдвигается на 72 пт == 1 дюйм влево и на 0 дюймов вверх / вниз. Теперь вы знаете, как сдвинуть на 2 дюйма вправо:

gswin32c ^
   -o input-shifted-pages-2-inches-to-right.pdf ^
   -sDEVICE=pdfwrite ^
   -c "<</PageOffset [144 0]>> setpagedevice" ^
   -f /path/to/input.pdf

Хотите сдвинуться на 0,5 дюйма вниз и на 1 дюйм вправо?

gswin32c.exe ^
   -o input-shifted-pages-1-inch-to-right-half-inch-down.pdf ^
   -sDEVICE=pdfwrite ^
   -c "<</PageOffset [72 -36]>> setpagedevice" ^
   -f /path/to/input.pdf
...