15 #include <QtGui/QPrinter>
16 #include <QPrintEngine>
17 #include <QStringList>
19 #include <QtCore/QFile>
20 #include <QtCore/QFileInfo>
21 #include <QtGui/QLabel>
22 #include <QtGui/QShowEvent>
23 #include <QtNetwork/QTcpSocket>
27 #include <klocalsocket.h>
28 #include <kstandarddirs.h>
34 using namespace Okular;
37 QPrinter::Orientation documentOrientation,
FileDeletePolicy fileDeletePolicy,
41 return fp.
doPrintFiles( printer, QStringList( file ), fileDeletePolicy, pageSelectPolicy, pageRange,
42 documentOrientation );
47 QPrinter::Orientation documentOrientation )
50 if ( fileList.size() < 1 ) {
54 for (QStringList::ConstIterator it = fileList.constBegin(); it != fileList.constEnd(); ++it) {
55 if (!QFile::exists(*it)) {
60 if ( printer.printerState() == QPrinter::Aborted || printer.printerState() == QPrinter::Error ) {
69 if ( !printer.outputFileName().isEmpty() ) {
71 if ( QFile::exists( printer.outputFileName() ) ) {
72 QFile::remove( printer.outputFileName() );
75 QFileInfo inputFileInfo = QFileInfo( fileList[0] );
76 QFileInfo outputFileInfo = QFileInfo( printer.outputFileName() );
79 if ( inputFileInfo.suffix() == outputFileInfo.suffix() ) {
81 bool res = QFile::rename( fileList[0], printer.outputFileName() );
89 bool res = QFile::copy( fileList[0], printer.outputFileName() );
96 }
else if ( inputFileInfo.suffix() ==
"ps" && printer.outputFormat() == QPrinter::PdfFormat &&
ps2pdfAvailable() ) {
98 argList << fileList[0] << printer.outputFileName();
99 kDebug(
OkularDebug) <<
"Executing" << exe <<
"with arguments" << argList;
100 ret = KProcess::execute( exe, argList );
101 }
else if ( inputFileInfo.suffix() ==
"pdf" && printer.outputFormat() == QPrinter::PostScriptFormat &&
pdf2psAvailable() ) {
103 argList << fileList[0] << printer.outputFileName();
104 kDebug(
OkularDebug) <<
"Executing" << exe <<
"with arguments" << argList;
105 ret = KProcess::execute( exe, argList );
110 if ( doDeleteFile ) {
111 QFile::remove( fileList[0] );
121 if ( !KStandardDirs::findExe(
"lpr-cups").isEmpty() ) {
123 }
else if ( !KStandardDirs::findExe(
"lpr.cups").isEmpty() ) {
125 }
else if ( !KStandardDirs::findExe(
"lpr").isEmpty() ) {
127 }
else if ( !KStandardDirs::findExe(
"lp").isEmpty() ) {
134 argList =
printArguments( printer, fileDeletePolicy, pageSelectPolicy,
135 useCupsOptions, pageRange, exe, documentOrientation ) << fileList;
136 kDebug(
OkularDebug) <<
"Executing" << exe <<
"with arguments" << argList;
138 ret = KProcess::execute( exe, argList );
147 return pageList( printer, lastPage, 0, selectedPageList );
151 int currentPage,
const QList<int> &selectedPageList )
153 if ( printer.printRange() == QPrinter::Selection) {
154 return selectedPageList;
157 int startPage, endPage;
160 if ( printer.printRange() == QPrinter::PageRange ) {
161 startPage = printer.fromPage();
162 endPage = printer.toPage();
163 #if QT_VERSION >= KDE_MAKE_VERSION(4,7,0)
164 }
else if ( printer.printRange() == QPrinter::CurrentPage) {
165 startPage = currentPage;
166 endPage = currentPage;
173 for (
int i = startPage; i <= endPage; i++ ) {
182 if ( printer.printRange() == QPrinter::Selection) {
186 if ( printer.printRange() == QPrinter::PageRange ) {
187 return QString(
"%1-%2").arg(printer.fromPage()).arg(printer.toPage());
190 return QString(
"1-%2").arg( lastPage );
196 int count = pageList.count();
201 while ( i != count ) {
203 if ( i + 1 == count || pageList[i] + 1 != pageList[i+1] ) {
207 if ( !pageRange.isEmpty() ) {
208 pageRange.append(
",");
211 if ( seqStart == seqEnd ) {
212 pageRange.append(pageList[i]);
214 pageRange.append(QString(
"%1-%2").arg(seqStart).arg(seqEnd));
228 return ( !KStandardDirs::findExe(
"ps2pdf").isEmpty() );
233 return ( !KStandardDirs::findExe(
"pdf2ps").isEmpty() );
244 QPrinter testPrinter;
245 testPrinter.setNumCopies( 2 );
246 return ( testPrinter.numCopies() == 1 );
255 qsock.connectToHost(
"localhost", 631);
256 bool rtn = qsock.waitForConnected() && qsock.isValid();
263 if ( QFile::exists(
"/etc/cups/cupsd.conf") )
return true;
264 if ( QFile::exists(
"/usr/etc/cups/cupsd.conf") )
return true;
265 if ( QFile::exists(
"/usr/local/etc/cups/cupsd.conf") )
return true;
266 if ( QFile::exists(
"/opt/etc/cups/cupsd.conf") )
return true;
267 if ( QFile::exists(
"/opt/local/etc/cups/cupsd.conf") )
return true;
275 switch ( printer.pageSize() ) {
276 case QPrinter::A0: size = QSize( 2384, 3370 );
break;
277 case QPrinter::A1: size = QSize( 1684, 2384 );
break;
278 case QPrinter::A2: size = QSize( 1191, 1684 );
break;
279 case QPrinter::A3: size = QSize( 842, 1191 );
break;
280 case QPrinter::A4: size = QSize( 595, 842 );
break;
281 case QPrinter::A5: size = QSize( 420, 595 );
break;
282 case QPrinter::A6: size = QSize( 298, 420 );
break;
283 case QPrinter::A7: size = QSize( 210, 298 );
break;
284 case QPrinter::A8: size = QSize( 147, 210 );
break;
285 case QPrinter::A9: size = QSize( 105, 147 );
break;
286 case QPrinter::B0: size = QSize( 2835, 4008 );
break;
287 case QPrinter::B1: size = QSize( 2004, 2835 );
break;
288 case QPrinter::B2: size = QSize( 1417, 2004 );
break;
289 case QPrinter::B3: size = QSize( 1001, 1417 );
break;
290 case QPrinter::B4: size = QSize( 709, 1001 );
break;
291 case QPrinter::B5: size = QSize( 499, 709 );
break;
292 case QPrinter::B6: size = QSize( 354, 499 );
break;
293 case QPrinter::B7: size = QSize( 249, 354 );
break;
294 case QPrinter::B8: size = QSize( 176, 249 );
break;
295 case QPrinter::B9: size = QSize( 125, 176 );
break;
296 case QPrinter::B10: size = QSize( 88, 125 );
break;
297 case QPrinter::C5E: size = QSize( 459, 649 );
break;
298 case QPrinter::Comm10E: size = QSize( 297, 684 );
break;
299 case QPrinter::DLE: size = QSize( 312, 624 );
break;
300 case QPrinter::Executive: size = QSize( 522, 756 );
break;
301 case QPrinter::Folio: size = QSize( 595, 935 );
break;
302 case QPrinter::Ledger: size = QSize( 1224, 792 );
break;
303 case QPrinter::Legal: size = QSize( 612, 1008 );
break;
304 case QPrinter::Letter: size = QSize( 612, 792 );
break;
305 case QPrinter::Tabloid: size = QSize( 792, 1224 );
break;
306 case QPrinter::Custom:
return QSize( (
int) printer.widthMM() * ( 25.4 / 72 ),
307 (
int) printer.heightMM() * ( 25.4 / 72 ) );
308 default:
return QSize();
311 if ( printer.orientation() == QPrinter::Landscape ) {
360 const QString &pageRange,
const QString &
version,
361 QPrinter::Orientation documentOrientation )
365 if ( !
destination( printer, version ).isEmpty() ) {
369 if ( !
copies( printer, version ).isEmpty() ) {
370 argList <<
copies( printer, version );
373 if ( !
jobname( printer, version ).isEmpty() ) {
374 argList <<
jobname( printer, version );
377 if ( !
pages( printer, pageSelectPolicy, pageRange, useCupsOptions, version ).isEmpty() ) {
378 argList <<
pages( printer, pageSelectPolicy, pageRange, useCupsOptions, version );
381 if ( useCupsOptions && !
cupsOptions( printer, documentOrientation ).isEmpty() ) {
382 argList <<
cupsOptions( printer, documentOrientation);
385 if ( !
deleteFile( printer, fileDeletePolicy, version ).isEmpty() ) {
386 argList <<
deleteFile( printer, fileDeletePolicy, version );
389 if ( version ==
"lp" ) {
398 if ( version ==
"lp" ) {
399 return QStringList(
"-d") << printer.printerName();
402 if ( version.startsWith(
"lpr" ) ) {
403 return QStringList(
"-P") << printer.printerName();
406 return QStringList();
411 int cp = printer.actualNumCopies();
413 if ( version ==
"lp" ) {
414 return QStringList(
"-n") << QString(
"%1").arg( cp );
417 if ( version.startsWith(
"lpr" ) ) {
418 return QStringList() << QString(
"-#%1").arg( cp );
421 return QStringList();
426 if ( ! printer.docName().isEmpty() ) {
428 if ( version ==
"lp" ) {
429 return QStringList(
"-t") << printer.docName();
432 if ( version.startsWith(
"lpr" ) ) {
433 const QString shortenedDocName = QString::fromUtf8(printer.docName().toUtf8().left(255));
434 return QStringList(
"-J") << shortenedDocName;
438 return QStringList();
444 return QStringList(
"-r");
447 return QStringList();
451 bool useCupsOptions,
const QString &
version )
455 if ( printer.printRange() == QPrinter::Selection && ! pageRange.isEmpty() ) {
457 if ( version ==
"lp" ) {
461 if ( version.startsWith(
"lpr" ) && useCupsOptions ) {
462 return QStringList(
"-o") << QString(
"page-ranges=%1").arg( pageRange );
467 if ( printer.printRange() == QPrinter::PageRange ) {
469 if ( version ==
"lp" ) {
470 return QStringList(
"-P") << QString(
"%1-%2").arg( printer.fromPage() )
471 .arg( printer.toPage() );
474 if ( version.startsWith(
"lpr" ) && useCupsOptions ) {
475 return QStringList(
"-o") << QString(
"page-ranges=%1-%2").arg( printer.fromPage() )
476 .arg( printer.toPage() );
483 return QStringList();
488 QStringList optionList;
523 return QStringList(
"-o") <<
529 return QStringList(
"-o") <<
534 return QStringList(
"-o") <<
538 return QStringList();
543 switch ( printer.pageSize() ) {
544 case QPrinter::A0:
return "A0";
545 case QPrinter::A1:
return "A1";
546 case QPrinter::A2:
return "A2";
547 case QPrinter::A3:
return "A3";
548 case QPrinter::A4:
return "A4";
549 case QPrinter::A5:
return "A5";
550 case QPrinter::A6:
return "A6";
551 case QPrinter::A7:
return "A7";
552 case QPrinter::A8:
return "A8";
553 case QPrinter::A9:
return "A9";
554 case QPrinter::B0:
return "B0";
555 case QPrinter::B1:
return "B1";
556 case QPrinter::B10:
return "B10";
557 case QPrinter::B2:
return "B2";
558 case QPrinter::B3:
return "B3";
559 case QPrinter::B4:
return "B4";
560 case QPrinter::B5:
return "B5";
561 case QPrinter::B6:
return "B6";
562 case QPrinter::B7:
return "B7";
563 case QPrinter::B8:
return "B8";
564 case QPrinter::B9:
return "B9";
565 case QPrinter::C5E:
return "C5";
566 case QPrinter::Comm10E:
return "Comm10";
567 case QPrinter::DLE:
return "DL";
568 case QPrinter::Executive:
return "Executive";
569 case QPrinter::Folio:
return "Folio";
570 case QPrinter::Ledger:
return "Ledger";
571 case QPrinter::Legal:
return "Legal";
572 case QPrinter::Letter:
return "Letter";
573 case QPrinter::Tabloid:
return "Tabloid";
574 case QPrinter::Custom:
return QString(
"Custom.%1x%2mm")
575 .arg( printer.heightMM() )
576 .arg( printer.widthMM() );
577 default:
return QString();
584 switch ( printer.paperSource() ) {
585 case QPrinter::Auto:
return QString();
586 case QPrinter::Cassette:
return "Cassette";
587 case QPrinter::Envelope:
return "Envelope";
588 case QPrinter::EnvelopeManual:
return "EnvelopeManual";
589 case QPrinter::FormSource:
return "FormSource";
590 case QPrinter::LargeCapacity:
return "LargeCapacity";
591 case QPrinter::LargeFormat:
return "LargeFormat";
592 case QPrinter::Lower:
return "Lower";
593 case QPrinter::MaxPageSource:
return "MaxPageSource";
594 case QPrinter::Middle:
return "Middle";
595 case QPrinter::Manual:
return "Manual";
596 case QPrinter::OnlyOne:
return "OnlyOne";
597 case QPrinter::Tractor:
return "Tractor";
598 case QPrinter::SmallFormat:
return "SmallFormat";
599 default:
return QString();
608 if ( printer.orientation() == documentOrientation ) {
610 return QStringList(
"-o") <<
"portrait";
613 return QStringList(
"-o") <<
"landscape";
619 switch ( printer.duplex() ) {
620 case QPrinter::DuplexNone:
return QStringList(
"-o") <<
"sides=one-sided";
621 case QPrinter::DuplexAuto:
if ( printer.orientation() == QPrinter::Landscape ) {
622 return QStringList(
"-o") <<
"sides=two-sided-short-edge";
624 return QStringList(
"-o") <<
"sides=two-sided-long-edge";
626 case QPrinter::DuplexLongSide:
return QStringList(
"-o") <<
"sides=two-sided-long-edge";
627 case QPrinter::DuplexShortSide:
return QStringList(
"-o") <<
"sides=two-sided-short-edge";
628 default:
return QStringList();
634 if ( printer.pageOrder() == QPrinter::LastPageFirst ) {
635 return QStringList(
"-o") <<
"outputorder=reverse";
637 return QStringList(
"-o") <<
"outputorder=normal";
642 if ( printer.collateCopies() ) {
643 return QStringList(
"-o") <<
"Collate=True";
645 return QStringList(
"-o") <<
"Collate=False";
650 if (printer.printEngine()->property(QPrintEngine::PPK_PageMargins).isNull()) {
651 return QStringList();
654 printer.getPageMargins( &l, &t, &r, &b, QPrinter::Point );
655 return QStringList(
"-o") << QString(
"page-left=%1").arg(l)
656 <<
"-o" << QString(
"page-top=%1").arg(t)
657 <<
"-o" << QString(
"page-right=%1").arg(r)
658 <<
"-o" << QString(
"page-bottom=%1").arg(b) <<
"-o" <<
"fit-to-page";
664 QStringList dialogOptions = printer.printEngine()->property(QPrintEngine::PrintEnginePropertyKey(0xfe00)).toStringList();
667 for (
int i = 0; i < dialogOptions.count(); i = i + 2 ) {
668 if ( dialogOptions[i+1].isEmpty() ) {
669 cupsOptions <<
"-o" << dialogOptions[i];
671 cupsOptions <<
"-o" << dialogOptions[i] +
'=' + dialogOptions[i+1];
QStringList optionOrientation(QPrinter &printer, QPrinter::Orientation documentOrientation)
static bool cupsAvailable()
Return if CUPS Print System is available on this system.
static QString pageRange(QPrinter &printer, int lastPage, const QList< int > &selectedPageList)
Return the range of pages selected by the user in the Print Dialog.
QStringList deleteFile(QPrinter &printer, FileDeletePolicy fileDeletePolicy, const QString &version)
static bool ps2pdfAvailable()
Return if Ghostscript ps2pdf is available on this system.
QStringList jobname(QPrinter &printer, const QString &version)
PageSelectPolicy
Whether pages to be printed are selected by the application or the print system.
QStringList cupsOptions(QPrinter &printer, QPrinter::Orientation documentOrientation)
QStringList pages(QPrinter &printer, PageSelectPolicy pageSelectPolicy, const QString &pageRange, bool useCupsOptions, const QString &version)
QStringList optionPageOrder(QPrinter &printer)
There was no print error.
int doPrintFiles(QPrinter &printer, const QStringList fileList, FileDeletePolicy fileDeletePolicy, PageSelectPolicy pageSelectPolicy, const QString &pageRange, QPrinter::Orientation documentOrientation)
QStringList destination(QPrinter &printer, const QString &version)
QStringList optionCollateCopies(QPrinter &printer)
QStringList copies(QPrinter &printer, const QString &version)
static QString pageListToPageRange(const QList< int > &pageList)
convert a Page List into a Page Range
QStringList optionDoubleSidedPrinting(QPrinter &printer)
FileDeletePolicy
Whether file(s) get deleted by the application or by the print system.
static QList< int > pageList(QPrinter &printer, int lastPage, int currentPage, const QList< int > &selectedPageList)
Return the list of pages selected by the user in the Print Dialog.
static bool pdf2psAvailable()
Return if Ghostscript pdf2ps is available on this system.
QStringList optionPageMargins(QPrinter &printer)
PrintError
Possible print errors.
QStringList optionMedia(QPrinter &printer)
QStringList printArguments(QPrinter &printer, FileDeletePolicy fileDeletePolicy, PageSelectPolicy pageSelectPolicy, bool useCupsOptions, const QString &pageRange, const QString &version, QPrinter::Orientation documentOrientation)
static int printFile(QPrinter &printer, const QString file, QPrinter::Orientation documentOrientation, FileDeletePolicy fileDeletePolicy=FilePrinter::ApplicationDeletesFiles, PageSelectPolicy pageSelectPolicy=FilePrinter::ApplicationSelectsPages, const QString &pageRange=QString())
Print a file using the settings in QPrinter.
QStringList optionCupsProperties(QPrinter &printer)
QString mediaPageSize(QPrinter &printer)
static Generator::PrintError printError(int c)
Convert the code returned by printFile* to PrintError.
QString mediaPaperSource(QPrinter &printer)
static const char version[]
static QSize psPaperSize(QPrinter &printer)
Returns the postscript standard page size.