1
/* poppler-ps-converter.cc: qt interface to poppler
2
* Copyright (C) 2007, 2009, 2010, Albert Astals Cid <aacid@kde.org>
3
* Copyright (C) 2008, Pino Toscano <pino@kde.org>
4
* Copyright (C) 2010 Hib Eris <hib@hiberis.nl>
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2, or (at your option)
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
21
#include "poppler-qt4.h"
23
#include "poppler-private.h"
24
#include "poppler-converter-private.h"
26
#include "PSOutputDev.h"
28
static void outputToQIODevice(void *stream, char *data, int len)
30
static_cast<QIODevice*>(stream)->write(data, len);
35
class PSConverterPrivate : public BaseConverterPrivate
51
PSConverter::PSOptions opts;
52
void (* pageConvertedCallback)(int page, void *payload);
53
void *pageConvertedPayload;
56
PSConverterPrivate::PSConverterPrivate()
57
: BaseConverterPrivate(),
58
hDPI(72), vDPI(72), rotate(0), paperWidth(-1), paperHeight(-1),
59
marginRight(0), marginBottom(0), marginLeft(0), marginTop(0),
60
opts(PSConverter::Printing), pageConvertedCallback(0),
61
pageConvertedPayload(0)
66
PSConverter::PSConverter(DocumentData *document)
67
: BaseConverter(*new PSConverterPrivate())
70
d->document = document;
73
PSConverter::~PSConverter()
77
void PSConverter::setPageList(const QList<int> &pageList)
80
d->pageList = pageList;
83
void PSConverter::setTitle(const QString &title)
89
void PSConverter::setHDPI(double hDPI)
95
void PSConverter::setVDPI(double vDPI)
101
void PSConverter::setRotate(int rotate)
107
void PSConverter::setPaperWidth(int paperWidth)
110
d->paperWidth = paperWidth;
113
void PSConverter::setPaperHeight(int paperHeight)
116
d->paperHeight = paperHeight;
119
void PSConverter::setRightMargin(int marginRight)
122
d->marginRight = marginRight;
125
void PSConverter::setBottomMargin(int marginBottom)
128
d->marginBottom = marginBottom;
131
void PSConverter::setLeftMargin(int marginLeft)
134
d->marginLeft = marginLeft;
137
void PSConverter::setTopMargin(int marginTop)
140
d->marginTop = marginTop;
143
void PSConverter::setStrictMargins(bool strictMargins)
147
d->opts |= StrictMargins;
149
d->opts &= ~StrictMargins;
152
void PSConverter::setForceRasterize(bool forceRasterize)
156
d->opts |= ForceRasterization;
158
d->opts &= ~ForceRasterization;
161
void PSConverter::setPSOptions(PSConverter::PSOptions options)
167
PSConverter::PSOptions PSConverter::psOptions() const
169
Q_D(const PSConverter);
173
void PSConverter::setPageConvertedCallback(void (* callback)(int page, void *payload), void *payload)
176
d->pageConvertedCallback = callback;
177
d->pageConvertedPayload = payload;
180
bool PSConverter::convert()
183
d->lastError = NoError;
185
Q_ASSERT(!d->pageList.isEmpty());
186
Q_ASSERT(d->paperWidth != -1);
187
Q_ASSERT(d->paperHeight != -1);
189
if (d->document->locked)
191
d->lastError = FileLockedError;
195
QIODevice *dev = d->openDevice();
198
d->lastError = OpenOutputError;
202
QByteArray pstitle8Bit = d->title.toLocal8Bit();
204
if (!d->title.isEmpty()) pstitlechar = pstitle8Bit.data();
205
else pstitlechar = 0;
207
PSOutputDev *psOut = new PSOutputDev(outputToQIODevice, dev,
210
d->document->doc->getXRef(),
211
d->document->doc->getCatalog(),
213
d->document->doc->getNumPages(),
220
d->paperWidth - d->marginRight,
221
d->paperHeight - d->marginTop,
222
(d->opts & ForceRasterization));
224
if (d->opts & StrictMargins)
226
double xScale = ((double)d->paperWidth - (double)d->marginLeft - (double)d->marginRight) / (double)d->paperWidth;
227
double yScale = ((double)d->paperHeight - (double)d->marginBottom - (double)d->marginTop) / (double)d->paperHeight;
228
psOut->setScale(xScale, yScale);
233
GBool isPrinting = (d->opts & Printing) ? gTrue : gFalse;
234
foreach(int page, d->pageList)
236
d->document->doc->displayPage(psOut, page, d->hDPI, d->vDPI, d->rotate, gFalse, gTrue, isPrinting);
237
if (d->pageConvertedCallback)
238
(*d->pageConvertedCallback)(page, d->pageConvertedPayload);