Subversion Repositories Scribus

Rev

Rev 21527 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
17560 jainbasil 1
/*
2
For general Scribus (>=1.3.2) copyright and licensing information please refer
3
to the COPYING file provided with the program. Following this notice may exist
4
a copyright and/or license notice that predates the release of Scribus 1.3.2
5
for which a new license (GPL+exception) is in place.
6
*/
7
#include "api_printer.h"
8
#include "util_printer.h"
9
#include "util_ghostscript.h"
10
#include "util_file.h"
11
#include "pslib.h"
12
 
13
#ifdef HAVE_CUPS
14
#include <cups/cups.h>
15
#endif
16
 
17
#if defined(_WIN32)
18
#include "scprintengine_gdi.h"
19
#endif
20
 
21
 
22
PrinterAPI::PrinterAPI() : QObject(COLLECTOR)
23
{
24
        qDebug() << "PrinterAPI loaded";
25
        setObjectName("printer");
26
        printer = QString("File");
27
        cmd = QString("");
28
        color = true;
29
        useICC = false;
30
        mph = false;
31
        mpv = false;
32
        ucr = true;
33
        copies = true;
34
 
35
 
36
 
37
        QString tf(ScCore->primaryMainWindow()->doc->pdfOptions().fileName);
38
        if (tf.isEmpty())
39
        {
40
                QFileInfo fi = QFileInfo(ScCore->primaryMainWindow()->doc->DocName);
41
                tf = fi.path()+"/"+fi.baseName()+".pdf";
42
        }
43
        file = tf;
44
 
45
 
46
        int num = 0;
47
        if (ScCore->primaryMainWindow()->HaveDoc)
48
                num = ScCore->primaryMainWindow()->doc->Pages->count();
49
 
50
        for (int i = 0; i<num; i++)
51
        {
52
                pages.append(i+1);
53
        }
54
 
55
        separation = "No";
56
}
57
 
58
QList<QVariant> PrinterAPI::allPrinters()
59
{
60
        QStringList list = PrinterUtil::getPrinterNames();
61
        QList<QVariant> l;
62
        for (int i=0; i < list.count(); ++i)
63
        {
64
                l.append(list[i]);
65
        }
66
        l.append(QString("File"));
67
        return l;
68
}
69
 
70
void PrinterAPI::doPrint()
71
{
72
// copied from void ScribusMainWindow::slotFilePrint() in file scribus.cpp
73
        QString fna, prn, cmd, scmd, cc, data, SepName;
74
        QString printcomm;
75
        bool fil, PSfile;
76
        PSfile = false;
77
 
78
//    ReOrderText(ScCore->primaryMainWindow()->doc, ScCore->primaryMainWindow()->view);
79
        prn = printer;
80
        fna = file;
81
        fil = (printer == QString("File")) ? true : false;
82
        std::vector<int> pageNs;
83
        PrintOptions options;
84
        for (int i = 0; i < pages.size(); ++i) {
85
                options.pageNumbers.push_back(pages[i]);
86
        }
87
        int Nr = (copies < 1) ? 1 : copies;
88
        SepName = separation;
89
        options.printer   = prn;
90
        options.prnEngine = (PrintEngine) pslevel;
91
        options.toFile    = fil;
92
        options.separationName = SepName;
93
        options.outputSeparations = (SepName == QString("No")) ?  false : true;
94
        options.useColor = color;
95
        options.mirrorH  = mph;
96
        options.mirrorV  = mpv;
22333 jghali 97
        // options.useICC   = useICC; FIXME
17560 jainbasil 98
        options.doGCR    = ucr;
99
        options.cropMarks  = false;
100
        options.bleedMarks = false;
101
        options.registrationMarks = false;
102
        options.colorMarks = false;
103
        options.markOffset = 0.0;
20103 avox 104
        options.bleeds.setTop(0.0);
105
        options.bleeds.setLeft(0.0);
106
        options.bleeds.setRight(0.0);
107
        options.bleeds.setBottom(0.0);
17560 jainbasil 108
        if (!PrinterUtil::checkPrintEngineSupport(options.printer, options.prnEngine, options.toFile))
109
                options.prnEngine = PrinterUtil::getDefaultPrintEngine(options.printer, options.toFile);
110
        printcomm = cmd;
111
        QMap<QString, QMap<uint, FPointArray> > ReallyUsed;
112
        ReallyUsed.clear();
113
        ScCore->primaryMainWindow()->doc->getUsedFonts(ReallyUsed);
114
        PrefsManager *prefsManager=PrefsManager::instance();
115
 
116
#if defined(_WIN32)
117
        if (!options.toFile)
118
        {
119
                QByteArray devMode;
120
                bool printDone = false;
121
                if ( PrinterUtil::getDefaultSettings(prn, options.devMode) )
122
                {
123
                        ScPrintEngine_GDI winPrint;
124
                        printDone = winPrint.print( *ScCore->primaryMainWindow()->doc, options );
125
                }
126
                if (!printDone)
127
                        RAISE("Printing failed");
128
        }
129
#endif
130
 
131
        PSLib *dd = new PSLib(options, true, prefsManager->appPrefs.fontPrefs.AvailFonts, ReallyUsed, ScCore->primaryMainWindow()->doc->PageColors, false, true);
132
        if (dd != NULL)
133
        {
134
                if (!fil)
21527 craig 135
                        fna = QDir::toNativeSeparators(ScPaths::tempFileDir()+"/tmp.ps");
17560 jainbasil 136
                PSfile = dd->PS_set_file(fna);
137
                fna = QDir::toNativeSeparators(fna);
138
                if (PSfile)
139
                {
140
                        options.setDevParam = false;
141
                        options.doClip = false;
142
                        dd->CreatePS(ScCore->primaryMainWindow()->doc, options);
143
                        if (options.prnEngine == PostScript1 || options.prnEngine == PostScript2)
144
                        {
145
                                if (ScCore->haveGS())
146
                                {
147
                                        QString tmp;
148
                                        QStringList opts;
149
                                        opts.append( QString("-dDEVICEWIDTHPOINTS=%1").arg(tmp.setNum(ScCore->primaryMainWindow()->doc->pageWidth())) );
150
                                        opts.append( QString("-dDEVICEHEIGHTPOINTS=%1").arg(tmp.setNum(ScCore->primaryMainWindow()->doc->pageHeight())) );
151
                                        convertPS2PS(fna, fna+".tmp", opts, options.prnEngine);
152
                                        moveFile( fna + ".tmp", fna );
153
                                }
154
                                else
155
                                {
156
                                        RAISE("Printing failed : GhostScript is needed to print to PostScript Level 1 or Level 2");
157
                                }
158
                        }
159
 
160
                        if (!fil)
161
                        {
162
                                if (!printcomm.isEmpty())
163
                                        cmd = printcomm + " "+fna;
164
                                else
165
                                {
166
                                        cmd = "lpr -P" + prn;
167
                                        if (Nr > 1)
168
                                                cmd += " -#" + cc.setNum(Nr);
169
#ifdef HAVE_CUPS
170
// This need yet to be implemented by object Printer
171
//                                      cmd += printer->PrinterOpts;
172
#endif
173
                                        cmd += " "+fna;
174
                                }
175
                                system(cmd.toLocal8Bit().constData());
176
                                unlink(fna.toLocal8Bit().constData());
177
                        }
178
                }
179
                else {
180
                        delete dd;
181
                        RAISE("Printing failed");
182
                }
183
                delete dd;
184
        }
185
}
186
 
187
QString PrinterAPI::getPrinter()
188
{
189
        return this->printer;
190
}
191
 
192
void PrinterAPI::setPrinter(QString name)
193
{
194
        this->printer = name;
195
}
196
 
197
QString PrinterAPI::getFile()
198
{
199
        return this->file;
200
}
201
 
202
void PrinterAPI::setFile(QString name)
203
{
204
        this->file = name;
205
}
206
 
207
QString PrinterAPI::getCmd()
208
{
209
        return this->cmd;
210
}
211
 
212
void PrinterAPI::setCmd(QString name)
213
{
214
        this->cmd = name;
215
}
216
 
217
QString PrinterAPI::getSeparation()
218
{
219
        return this->separation;
220
}
221
 
222
void PrinterAPI::setSeparation(QString name)
223
{
224
        this->separation = name;
225
}
226
 
227
 
228
QList<QVariant> PrinterAPI::getPages()
229
{
230
        QList<QVariant> p;
231
        for(int i=0; i <pages.count(); i++)
232
        {
233
                p.append(pages[i]);
234
        }
235
        return p;
236
}
237
 
238
void PrinterAPI::setPages(QList<QVariant> list)
239
{
240
        this->pages.clear();
241
        for(int i=0; i<list.count(); ++i)
242
        {
243
                if(list[i].toInt() > ScCore->primaryMainWindow()->doc->Pages->count())
244
                {
245
                        qDebug()<<"trying to raise an exception";
246
                        RAISE("pages value out of range.");
247
                }
248
                else
249
                        this->pages.append(list[i].toInt());
250
        }
251
}
252
 
253
bool PrinterAPI::isColor()
254
{
255
        return this->color;
256
}
257
 
258
void PrinterAPI::setColor(bool value)
259
{
260
        this->color = value;
261
}
262
 
263
bool PrinterAPI::getUseICC()
264
{
265
        return this->useICC;
266
}
267
 
268
void PrinterAPI::setUseICC(bool value)
269
{
270
        this->useICC = value;
271
}
272
 
273
int PrinterAPI::getPsLevel()
274
{
275
        return this->pslevel;
276
}
277
 
278
void PrinterAPI::setPsLevel(int value)
279
{
280
        this->pslevel = value;
281
}
282
 
283
bool PrinterAPI::getMph()
284
{
285
        return this->mph;
286
}
287
 
288
void PrinterAPI::setMph(bool value)
289
{
290
        this->mph = value;
291
}
292
 
293
bool PrinterAPI::getMpv()
294
{
295
        return this->mpv;
296
}
297
 
298
void PrinterAPI::setMpv(bool value)
299
{
300
        this->mpv = value;
301
}
302
 
303
bool PrinterAPI::getUcr()
304
{
305
        return this->ucr;
306
}
307
 
308
void PrinterAPI::setUcr(bool value)
309
{
310
        this->ucr = value;
311
}
312
 
313
PrinterAPI::~PrinterAPI()
314
{
315
        qDebug() << "PrinterAPI deleted";
316
}
317
 
318