Commit 2cf9e6a2 authored by Till Kamppeter's avatar Till Kamppeter Committed by Albert Astals Cid

Support multiple page sizes when converting to PS

Fixes byg #19777
parent 30fb7cb7
......@@ -21,6 +21,7 @@
// Copyright (C) 2008 Koji Otani <sho@bbr.jp>
// Copyright (C) 2008 Hib Eris <hib@hiberis.nl>
// Copyright (C) 2009 Thomas Freitag <Thomas.Freitag@alfa.de>
// Copyright (C) 2009 Till Kamppeter <till.kamppeter@gmail.com>
//
// 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;
......
......@@ -18,6 +18,7 @@
// Copyright (C) 2006-2008 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2007 Brad Hards <bradh@kde.org>
// Copyright (C) 2009 Thomas Freitag <Thomas.Freitag@alfa.de>
// Copyright (C) 2009 Till Kamppeter <till.kamppeter@gmail.com>
//
// 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 {
......
......@@ -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
......
......@@ -17,6 +17,7 @@
//
// Copyright (C) 2006 Kristian Høgsberg <krh@redhat.com>
// Copyright (C) 2007-2008 Albert Astals Cid <aacid@kde.org>
// Copyright (C) 2009 Till Kamppeter <till.kamppeter@gmail.com>
//
// 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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment