2010-04-09 6 views
2

페이지를 오른쪽으로 몇 인치 이동해야하는 PDF 문서가 있습니다. 나는 페이지의 왼편에 여백을 두는 것을 좋아한다.펄을 사용하여 PDF 페이지를 이동하는 방법 (CAM :: PDF, PDF :: API2)?

CAM :: PDF 또는 PDF :: API2로 처리 할 수 ​​있습니까? 아니면 경험이있는 사람이 있습니까?

감사합니다.

+0

소리가 힘들다. – Mike

+0

여백과 HWMargin을 설정하여 고스트 스크립트를 사용하여 수행 할 수 있지만 시스템을 통해 외부 명령을 호출하는 대신 Perl에서 수행하려고합니다. – est

답변

3

저는 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'); 

"Data :: Dumper; print Dumper ($ page);"를 사용했습니다. $ page 데이터 구조를 생각 나게합니다.

1

Ghostscript으로도 가능합니다. (유닉스를 사용하는 경우, 단지 gs에 의해 gswin32c.exe 교체) 나는 당신에게 윈도우에 대한 몇 가지 예를 들어 명령을주지 :

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 <<...
  4. : ( -f-c 사용 후 필요) 입력 PDF를 지정 명령 줄에 전달 된 포스트 스크립트 코드는 페이지 이동
  5. -f ...을 일어날 수 있도록한다.

/PageShift에 의해 사용되는 단위는 포스트 스크립트 포인트입니다. 72pt == 1 인치. 값 [-72 0]은 왼쪽으로 72pt == 1in, 위쪽/아래로 0in 시프트합니다. 이제 오른쪽으로 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 
2

내가 PDF : API2에 그것을 할 것입니다 방법은 다음과 같습니다

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'); 
:

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'); 
작동합니다

또 다른 방법은하여 mediabox에 대한 좌표 (그리고 아마도 다른 상자)을 조정하는 것입니다

콘텐츠가 잘리는 문제가 발생하는 경우 cropbox, bleedbox, trimboxartbox 중 하나 이상을 가져와 설정해야 할 수 있습니다. 하지만 대부분의 경우이 방법이 효과적입니다.

+0

필자는 항상 PDF :: API2에 내 자신의 모듈 인 CAM :: PDF보다 멋진 API가 있다고 생각했습니다. 나는 자유 시간의 녀석이있는 경우에, 나는 그 (것)들을 단 하나 최고 PDF 도서관으로 합병하고 싶으면 ... –

관련 문제