poppler/PSOutputDev.cc | 31 +++++++++++++++++++++++++++++-- poppler/PSOutputDev.h | 4 +++- utils/pdftops.1 | 26 +++++++++++++++++++++----- utils/pdftops.cc | 17 ++++++++++++----- 4 files changed, 65 insertions(+), 13 deletions(-)
New commits: commit 2cf9e6a2318b770ae62572944c687576d1801d31 Author: Till Kamppeter <[email protected]> Date: Thu Jun 4 19:48:42 2009 +0200 Support multiple page sizes when converting to PS Fixes byg #19777 diff --git a/poppler/PSOutputDev.cc b/poppler/PSOutputDev.cc index 7f60292..b0084af 100644 --- a/poppler/PSOutputDev.cc +++ b/poppler/PSOutputDev.cc @@ -21,6 +21,7 @@ // Copyright (C) 2008 Koji Otani <[email protected]> // Copyright (C) 2008 Hib Eris <[email protected]> // Copyright (C) 2009 Thomas Freitag <[email protected]> +// Copyright (C) 2009 Till Kamppeter <[email protected]> // // To see a description of the changes please see the Changelog file that // came with your tarball or type make ChangeLog if you are building from git @@ -1274,6 +1275,7 @@ void PSOutputDev::writeHeader(int firstPage, int lastPage, Object info, obj1; switch (mode) { + case psModePSOrigPageSizes: case psModePS: writePS("%!PS-Adobe-3.0\n"); break; @@ -1304,6 +1306,7 @@ void PSOutputDev::writeHeader(int firstPage, int lastPage, writePS("%%DocumentSuppliedResources: (atend)\n"); switch (mode) { + case psModePSOrigPageSizes: case psModePS: writePSFmt("%%DocumentMedia: plain {0:d} {1:d} 0 () ()\n", paperWidth, paperHeight); @@ -3134,7 +3137,7 @@ void PSOutputDev::startPage(int pageNum, GfxState *state) { GBool landscape; - if (mode == psModePS) { + if (mode == psModePS || mode == psModePSOrigPageSizes) { GooString pageLabel; const GBool gotLabel = m_catalog->indexToLabel(pageNum -1, &pageLabel); if (gotLabel) { @@ -3149,7 +3152,8 @@ void PSOutputDev::startPage(int pageNum, GfxState *state) { } else { writePSFmt("%%Page: {0:d} {1:d}\n", pageNum, seqPage); } - writePS("%%BeginPageSetup\n"); + if (mode != psModePSOrigPageSizes) + writePS("%%BeginPageSetup\n"); } // underlays @@ -3162,6 +3166,29 @@ void PSOutputDev::startPage(int pageNum, GfxState *state) { switch (mode) { + case psModePSOrigPageSizes: + x1 = (int)floor(state->getX1()); + y1 = (int)floor(state->getY1()); + x2 = (int)ceil(state->getX2()); + y2 = (int)ceil(state->getY2()); + width = x2 - x1; + height = y2 - y1; + if (width > height) { + landscape = gTrue; + } else { + landscape = gFalse; + } + writePSFmt("%%PageBoundingBox: {0:d} {1:d} {2:d} {3:d}\n", x1, y1, x2 - x1, y2 - y1); + writePS("%%BeginPageSetup\n"); + writePSFmt("%%PageOrientation: {0:s}\n", + landscape ? "Landscape" : "Portrait"); + writePSFmt("<</PageSize [{0:d} {1:d}]>> setpagedevice\n", width, height); + writePS("pdfStartPage\n"); + writePSFmt("{0:d} {1:d} {2:d} {3:d} re W\n", x1, y1, x2 - x1, y2 - y1); + writePS("%%EndPageSetup\n"); + ++seqPage; + break; + case psModePS: // rotate, translate, and scale page imgWidth = imgURX - imgLLX; diff --git a/poppler/PSOutputDev.h b/poppler/PSOutputDev.h index 0aea502..ac2416c 100644 --- a/poppler/PSOutputDev.h +++ b/poppler/PSOutputDev.h @@ -18,6 +18,7 @@ // Copyright (C) 2006-2008 Albert Astals Cid <[email protected]> // Copyright (C) 2007 Brad Hards <[email protected]> // Copyright (C) 2009 Thomas Freitag <[email protected]> +// Copyright (C) 2009 Till Kamppeter <[email protected]> // // To see a description of the changes please see the Changelog file that // came with your tarball or type make ChangeLog if you are building from git @@ -55,7 +56,8 @@ class Function; enum PSOutMode { psModePS, psModeEPS, - psModeForm + psModeForm, + psModePSOrigPageSizes }; enum PSFileType { diff --git a/utils/pdftops.1 b/utils/pdftops.1 index dfa07b3..45e8399 100644 --- a/utils/pdftops.1 +++ b/utils/pdftops.1 @@ -65,17 +65,30 @@ CID font embedding. Generate Level 3 separable PostScript. The separation handling is the same as for \-level2Sep. .TP +.B \-origpagesizes +Generate a PostScript file with variable page sizes and orientations, +taking for each page the size of the original page in the PDF file. +The PostScript file contains "<</PageSize [WIDTH HEIGHT]>> setpagedevice" +lines in each page header, so that the paper input tray gets correctly +changed on the printer. This option should be used when pdftops is used +as a print filter. Any specification of the page size via \-paper, +\-paperw, or \-paperh will get overridden as long as each page of the +PDF file has a defined paper size. No more than one of the mode options +(\-origpagesizes, \-eps, \-form) may be given. +.TP .B \-eps Generate an Encapsulated PostScript (EPS) file. An EPS file contains a single image, so if you use this option with a multi-page PDF file, you must use \-f and \-l to specify a single page. No more than one of -the mode options (\-eps, \-form) may be given. +the mode options (\-origpagesizes, \-eps, \-form) may be given. .TP .B \-form Generate a PostScript form which can be imported by software that understands forms. A form contains a single page, so if you use this option with a multi-page PDF file, you must use \-f and \-l to specify a -single page. The \-level1 option cannot be used with \-form. +single page. The \-level1 option cannot be used with \-form. No more +than one of the mode options (\-origpagesizes, \-eps, \-form) may be +given. .TP .B \-opi Generate OPI comments for all images and forms which have OPI @@ -113,13 +126,16 @@ preload images and forms .BI \-paper " size" Set the paper size to one of "letter", "legal", "A4", or "A3". This can also be set to "match", which will set the paper size to match the -size specified in the PDF file. +size specified in the PDF file. \-origpagesizes overrides this setting +if the PDF file has defined page sizes. .TP .BI \-paperw " size" -Set the paper width, in points. +Set the paper width, in points. \-origpagesizes overrides this setting +if the PDF file has defined page sizes. .TP .BI \-paperh " size" -Set the paper height, in points. +Set the paper height, in points. \-origpagesizes overrides this setting +if the PDF file has defined page sizes. .TP .B \-nocrop By default, output is cropped to the CropBox specified in the PDF diff --git a/utils/pdftops.cc b/utils/pdftops.cc index 6801050..747063e 100644 --- a/utils/pdftops.cc +++ b/utils/pdftops.cc @@ -17,6 +17,7 @@ // // Copyright (C) 2006 Kristian Høgsberg <[email protected]> // Copyright (C) 2007-2008 Albert Astals Cid <[email protected]> +// Copyright (C) 2009 Till Kamppeter <[email protected]> // // To see a description of the changes please see the Changelog file that // came with your tarball or type make ChangeLog if you are building from git @@ -74,6 +75,7 @@ static GBool level2 = gFalse; static GBool level2Sep = gFalse; static GBool level3 = gFalse; static GBool level3Sep = gFalse; +static GBool doOrigPageSizes = gFalse; static GBool doEPS = gFalse; static GBool doForm = gFalse; #if OPI_SUPPORT @@ -115,6 +117,8 @@ static const ArgDesc argDesc[] = { "generate Level 3 PostScript"}, {"-level3sep", argFlag, &level3Sep, 0, "generate Level 3 separable PostScript"}, + {"-origpagesizes",argFlag, &doOrigPageSizes,0, + "conserve original page sizes"}, {"-eps", argFlag, &doEPS, 0, "generate Encapsulated PostScript (EPS)"}, {"-form", argFlag, &doForm, 0, @@ -202,8 +206,10 @@ int main(int argc, char *argv[]) { fprintf(stderr, "Error: use only one of the 'level' options.\n"); exit(1); } - if (doEPS && doForm) { - fprintf(stderr, "Error: use only one of -eps and -form\n"); + if ((doOrigPageSizes ? 1 : 0) + + (doEPS ? 1 : 0) + + (doForm ? 1 : 0) > 1) { + fprintf(stderr, "Error: use only one of -origpagesizes, -eps, and -form\n"); exit(1); } if (level1) { @@ -223,9 +229,10 @@ int main(int argc, char *argv[]) { fprintf(stderr, "Error: forms are only available with Level 2 output.\n"); exit(1); } - mode = doEPS ? psModeEPS - : doForm ? psModeForm - : psModePS; + mode = doOrigPageSizes ? psModePSOrigPageSizes + : doEPS ? psModeEPS + : doForm ? psModeForm + : psModePS; fileName = new GooString(argv[1]); // read config file
_______________________________________________ poppler mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/poppler
