拆分单页到两页使用Ghostscript(Splitting single page into tw

2019-08-08 00:59发布

我有一个类似的演示幻灯片,每页多张幻灯片的PDF文件。 如何使用ghostscript的分割文件,以便有每页一张幻灯片?

Answer 1:

很久以前,我写了一些代码,有人comp.lang.postscript要做到这一点,再次它是为PowerPoint幻灯片。 此PostScript代码假设所有的“子页”(即幻灯片)是PDF页面上相同的大小和位置,所有的PDF页面的大小相同。 以下内容作为一个文件名为pdf_slice.ps,并按照使用在注释中的描述。

%!PS
% Copyright (C) 2011 Artifex Software, Inc.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.
%
% Slice up a PDF file
%
% usage: gs -sFile=____.pdf  -dSubPagesX= -dSubPagesY= [-dSubPageOrder=] [-dVerbose=]pdf_slice.ps
%
% SubPageOrder is a bit field;
% Default = 0
% Bit 0 - 0 = top to bottom
%         1 = bottom to top
% Bit 1 - 0 = left to right
%         1 = right to left
% Bit 3 - 0 = increase x then y
%       - 1 = increase y then x
% 
% 0 - page 1 at top left, increasing left to right, top to bottom
% 1 - page 1 at bottom left increasing left to right, bottom to top
% 2 - page 1 at top right, increasing right to left, top to bottom
% 3 - page 1 at bottom right increasing right to left, bottom to top
% 4 - page 1 at top left, increasing top to bottom, left to right
% 5 - page 1 at bottom left increasing bottom to top, left to right
% 6 - page 1 at top right, increasing top to bottom, right to left 
% 7 - page 1 at bottom right increasing bottom to top, right to left

%
% Check the parameters to see they are present and of the correct type
%
/Usage {
  (  usage: gs -dNODISPLAY -q -sFile=____.pdf \n) =
  (     -dSubPagesX= -dSubPagesY= [-dSubPageOrder=] pdf_slice.ps \n) =
  (Please see comments in pdf_slice.ps for more details) =
  flush
  quit
} bind def

/Verbose where not {
  /Verbose false def
}{
  pop /Verbose true def
} ifelse

/File where not {
  (\n   *** Missing source file. \(use -sFile=____.pdf\)\n) =
  Usage
} {
  pop
}ifelse

/SubPagesX where not {
  (\n   *** SubPagesX not integer! \(use -dSubPagesX=\)\n) =
  Usage
} {
  Verbose { (SubPagesX ) print } if 
  SubPagesX type 
  Verbose { dup == } if
  /integertype eq not {
    (\n   *** SubPagesX not integer! \(use -dSubPagesX=\)\n) =
    Usage
  }
  pop 
}ifelse

/SubPagesY where not {
  (\n   *** SubPagesY not integer! \(use -dSubPagesY=\)\n) =
  Usage
} {
  Verbose { (SubPagesY ) print } if
  SubPagesY type 
  Verbose { dup == } if
  /integertype eq not {
    (\n   *** SubPagesY not integer! \(use -dSubPagesY=\)\n) =
    Usage
  }
  pop 
}ifelse

/SubPageOrder where not {
  /SubPageOrder 0 def
} {
  Verbose { (SubPageOrder ) print } if
  SubPageOrder type 
  Verbose { dup == } if
  dup == 
  /integertype eq not {
    (\n   *** SubPageOrder not integer! \(use -dSubPageOrder=\)\n) =
    Usage
  }
  pop 
}ifelse

% 
% Turns off most messages
%
/QUIET true def     % in case they forgot

%() =

%
% Open the PDF file and tell the PDF interpreter to start dealing with it
%
File dup (r) file runpdfbegin pop
/PDFPageCount pdfpagecount def

%
% Set up our bookkeeping
%
% First get the size of the page from page 1 of the PDF file
% We assume that all PDF pages are the same size.
%
1 pdfgetpage currentpagedevice
1 index get_any_box 
exch pop dup 2 get exch 3 get
/PDFHeight exch def
/PDFWidth exch def

%
% Now get the page size of the current device. We are assuming that
% this is the size of the individual sub-pages in the original PDF. NB
% This assumes no margins between sub-pages, all sub-pages the same size.
%
currentpagedevice /PageSize get
dup 0 get /SubPageWidth exch def
1 get /SubPageHeight exch def

% 
% Calculate the margins. This is the margin between the page border and
% the enclosed group of sub-pages, we assume there are no borders
% between sub pages.
%
/TopMargin PDFHeight SubPageHeight SubPagesY mul sub 2 div def
/LeftMargin PDFWidth SubPageWidth SubPagesX mul sub 2 div def

Verbose {
  (PDFHeight = ) print PDFHeight ==
  (PDFWidth = ) print PDFWidth ==
  (SubPageHeight = ) print SubPageHeight ==
  (SubPageWidth = ) print SubPageWidth ==
  (TopMargin = ) print TopMargin ==
  (LeftMmargin = ) print LeftMargin ==
} if

%
% This rouitne calculates and sets the PageOffset in the page device
% dictionary for each subpage, so that the PDF page is 'moved' in such 
% a way that the required sub page is under the 'window' which is the current
% page being imaged.
%
/NextPage {
    SubPageOrder 2 mod 0 eq {
        /H SubPagesY SubPageY sub SubPageHeight mul TopMargin add def
    }{
        /H SubPageY 1 sub SubPageHeight mul TopMargin add def
    } ifelse
    SubPageOrder 2 div floor cvi 2 mod 0 eq {
        /W SubPageX 1 sub SubPageWidth mul LeftMargin add def
    }{
        /W SubPagesX SubPageX sub SubPageWidth mul LeftMargin add def
    } ifelse
    << /PageOffset [W neg H neg]>> setpagedevice

Verbose {
  (SubPageX ) print SubPageX ==
  (SubPageY ) print SubPageY ==
  (X Offset ) print W ==
  (Y Offset ) print H == flush
} if

    PDFPage
} bind def

%
% The main loop
% For every page in the original PDF file
%
1 1 PDFPageCount 
{
    /PDFPage exch def

    % Do the gross ordering here rather than in
    % NextPage. We eiither process rows and then 
    % columns, or columns then rows, depending on
    % Bit 3 of SubPageorder
    SubPageOrder 3 le {
        1 1 SubPagesY {
            /SubPageY exch def
            1 1 SubPagesX {
                /SubPageX exch def
                NextPage
                pdfgetpage
                pdfshowpage
            } for
        } for
    } {
        1 1 SubPagesX {
            /SubPageX exch def
            1 1 SubPagesY {
                /SubPageY exch def
                NextPage
                pdfgetpage
                pdfshowpage
            } for
        } for
    } ifelse
} for


Answer 2:

KENS的答案是应该由@howardh被接受的一个。 KENS采用一种很巧妙PostScript语言程序来实现的结果。 (什么KENS说永远记住:他的解决方案将工作做好仅“如果所有的‘子页’(即幻灯片)是PDF页面上相同的大小和位置,所有的PDF页面大小相同 )。

然而,为了完整性,让我链接到其他几个以前的答案(其中一些所示),这解决了类似的问题:

  • 每页2个双方将PDF转换为1个侧每页 (SuperUser.com)
  • 我怎么可以拆分PDF的页面拦腰? (SuperUser.com)
  • 裁剪使用的Ghostscript 9.01 PDF文件 (StackOverflow.com)
  • PDF -删除白边距 (StackOverflow.com)
  • 拆分一个PDF页面分成两个 (StackOverflow.com)
  • 免费软件来分割PDF格式的网页拦腰? (SuperUser.com)

这些答案也使用PostScript代码,而只是作为传递给Ghostscript的命令行上的“片段”。 (如果你不是PostScript的悟性,这些可能更容易修改,适应了那里的“子页”不是在PDF页面上相同的大小和位置,并在PDF页面的大小不同的情况。)



Answer 3:

我想提出一个解决方案,实际上
1)分裂一个PS或PDF页面许多单独的页面和
2)然后合并的* .pdf到多页PDF。 但是,这种解决方案不处理的利润率。

这个脚本在Linux的BASH工作:

INPUT="input.ps" ; 
RESOLUTION=72 ;
WHOLE_WIDTH=598 ; # current size of portrait A4
WHOLE_HEIGHT=843 ;
COLOUMNS=2 ; #  split vertically
ROWS=1 ; # split horizontally
PAGE_WIDTH=$((WHOLE_WIDTH/COLOUMNS)) ;
PAGE_HEIGHT=$((WHOLE_HEIGHT/ROWS)) ;

# Split: 

for x in `seq 1 ${COLOUMNS}` ; do
  for y in `seq 1 ${ROWS}` ; do 
    gs  -dBATCH -dNOPAUSE -dSAFER \
    -o gramps_tmp_${x},${y}.pdf \
    -r${RESOLUTION} \
    -sDEVICE=pdfwrite \
    -g${PAGE_WIDTH}x${PAGE_HEIGHT} \
    -c "<</PageOffset [$(((x - 1)*(0 - PAGE_WIDTH))) \
                       $(((y - 1)*(0 - PAGE_HEIGHT)))]>> setpagedevice" \
    -f "$INPUT" ;
  done ;
done ;

# Merge:

gs -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=singleCombinedPdfFile.pdf -dBATCH gramps_tmp_*.pdf ;

但是,我们可安排在需要的顺序页面:

ORDERED="tmp_1,1.pdf tmp_1,2.pdf" ;
gs -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=singleCombinedMultipagePdfFile.pdf -dBATCH  ${ORDERED};


文章来源: Splitting single page into two pages with ghostscript