diff --git a/core/fileprinter.h b/core/fileprinter.h --- a/core/fileprinter.h +++ b/core/fileprinter.h @@ -48,6 +48,15 @@ */ enum PageSelectPolicy { ApplicationSelectsPages, SystemSelectsPages }; + /** Whether to apply scaling when printing. + * + * 'None' indicates that no scaling should be applied. + * 'FitToPrintArea' indicates that the document should be scaled to the + * area that is available for printing. Whether or not this includes the printer's + * hardware margins depends on the value of 'QPrinter::fullPage()' for the given printer. + */ + enum ScaleMode { FitToPrintArea, None }; + /** Print a file using the settings in QPrinter * * Only supports CUPS and LPR on *NIX. Page Range only supported in CUPS. @@ -58,6 +67,7 @@ * @param printer the print settings to use * @param file the file to print * @param documentOrientation the orientation stored in the document itself + * @param scaleMode scale mode to use * @param fileDeletePolicy if the application or system deletes the file * @param pageSelectPolicy if the application or system selects the pages to print * @param pageRange page range to print if SystemSelectsPages and user chooses Selection in Print Dialog @@ -71,10 +81,21 @@ * -2 if the KProcess could not be started * -1 if the KProcess crashed * otherwise the KProcess exit code + */ + static int printFile( QPrinter &printer, const QString file, + QPrinter::Orientation documentOrientation, + ScaleMode scaleMode, + FileDeletePolicy fileDeletePolicy = FilePrinter::ApplicationDeletesFiles, + PageSelectPolicy pageSelectPolicy = FilePrinter::ApplicationSelectsPages, + const QString &pageRange = QString() ); + + /** Print a file using the settings in QPrinter + * + * Same as 'printFile()' with 7 parameters, but always using a 'scaleMode' of + * 'FitToPrintArea'. * * @since 0.14 (KDE 4.8) */ - static int printFile( QPrinter &printer, const QString file, QPrinter::Orientation documentOrientation, FileDeletePolicy fileDeletePolicy = FilePrinter::ApplicationDeletesFiles, @@ -156,11 +177,19 @@ FileDeletePolicy fileDeletePolicy, PageSelectPolicy pageSelectPolicy, const QString &pageRange, QPrinter::Orientation documentOrientation ); + int doPrintFiles( QPrinter &printer, const QStringList fileList, + FileDeletePolicy fileDeletePolicy, PageSelectPolicy pageSelectPolicy, + const QString &pageRange, + QPrinter::Orientation documentOrientation, ScaleMode scaleMode ); QStringList printArguments( QPrinter &printer, FileDeletePolicy fileDeletePolicy, PageSelectPolicy pageSelectPolicy, bool useCupsOptions, const QString &pageRange, const QString &version, QPrinter::Orientation documentOrientation ); + QStringList printArguments( QPrinter &printer, + FileDeletePolicy fileDeletePolicy, PageSelectPolicy pageSelectPolicy, + bool useCupsOptions, const QString &pageRange, const QString &version, + QPrinter::Orientation documentOrientation, ScaleMode scaleMode ); QStringList destination( QPrinter &printer, const QString &version ); QStringList copies( QPrinter &printer, const QString &version ); @@ -171,14 +200,16 @@ const QString &pageRange, bool useCupsOptions, const QString &version ); QStringList cupsOptions( QPrinter &printer, QPrinter::Orientation documentOrientation ); + QStringList cupsOptions( QPrinter &printer, QPrinter::Orientation documentOrientation, ScaleMode scaleMode ); QStringList optionMedia( QPrinter &printer ); QString mediaPageSize( QPrinter &printer ); QString mediaPaperSource( QPrinter &printer ); QStringList optionOrientation( QPrinter &printer, QPrinter::Orientation documentOrientation ); QStringList optionDoubleSidedPrinting( QPrinter &printer ); QStringList optionPageOrder( QPrinter &printer ); QStringList optionCollateCopies( QPrinter &printer ); QStringList optionPageMargins( QPrinter &printer ); + QStringList optionPageMargins( QPrinter &printer, ScaleMode scaleMode ); QStringList optionCupsProperties( QPrinter &printer ); }; diff --git a/core/fileprinter.cpp b/core/fileprinter.cpp --- a/core/fileprinter.cpp +++ b/core/fileprinter.cpp @@ -34,16 +34,33 @@ int FilePrinter::printFile( QPrinter &printer, const QString file, QPrinter::Orientation documentOrientation, FileDeletePolicy fileDeletePolicy, PageSelectPolicy pageSelectPolicy, const QString &pageRange ) +{ + return printFile( printer, file, documentOrientation, ScaleMode::FitToPrintArea, fileDeletePolicy, + pageSelectPolicy, pageRange ); +} + +int FilePrinter::printFile( QPrinter &printer, const QString file, + QPrinter::Orientation documentOrientation, ScaleMode scaleMode, + FileDeletePolicy fileDeletePolicy, PageSelectPolicy pageSelectPolicy, + const QString &pageRange ) { FilePrinter fp; - return fp.doPrintFiles( printer, QStringList( file ), fileDeletePolicy, pageSelectPolicy, pageRange, - documentOrientation ); + return fp.doPrintFiles( printer, QStringList( file ), fileDeletePolicy, pageSelectPolicy, pageRange, + documentOrientation, scaleMode ); } int FilePrinter::doPrintFiles( QPrinter &printer, QStringList fileList, FileDeletePolicy fileDeletePolicy, PageSelectPolicy pageSelectPolicy, const QString &pageRange, QPrinter::Orientation documentOrientation ) { + return doPrintFiles( printer, fileList, fileDeletePolicy, pageSelectPolicy, pageRange, + documentOrientation, ScaleMode::FitToPrintArea ); +} + +int FilePrinter::doPrintFiles( QPrinter &printer, QStringList fileList, FileDeletePolicy fileDeletePolicy, + PageSelectPolicy pageSelectPolicy, const QString &pageRange, + QPrinter::Orientation documentOrientation, ScaleMode scaleMode ) +{ if ( fileList.size() < 1 ) { return -8; @@ -130,7 +147,7 @@ bool useCupsOptions = cupsAvailable(); argList = printArguments( printer, fileDeletePolicy, pageSelectPolicy, - useCupsOptions, pageRange, exe, documentOrientation ) << fileList; + useCupsOptions, pageRange, exe, documentOrientation, scaleMode ) << fileList; qCDebug(OkularCoreDebug) << "Executing" << exe << "with arguments" << argList; ret = KProcess::execute( exe, argList ); @@ -319,12 +336,19 @@ return pe; } +QStringList FilePrinter::printArguments( QPrinter &printer, FileDeletePolicy fileDeletePolicy, + PageSelectPolicy pageSelectPolicy, bool useCupsOptions, + const QString &pageRange, const QString &version, + QPrinter::Orientation documentOrientation ) { + return printArguments( printer, fileDeletePolicy, pageSelectPolicy, useCupsOptions, + pageRange, version, documentOrientation, ScaleMode::FitToPrintArea); +} QStringList FilePrinter::printArguments( QPrinter &printer, FileDeletePolicy fileDeletePolicy, PageSelectPolicy pageSelectPolicy, bool useCupsOptions, const QString &pageRange, const QString &version, - QPrinter::Orientation documentOrientation ) + QPrinter::Orientation documentOrientation, ScaleMode scaleMode ) { QStringList argList; @@ -344,8 +368,8 @@ argList << pages( printer, pageSelectPolicy, pageRange, useCupsOptions, version ); } - if ( useCupsOptions && ! cupsOptions( printer, documentOrientation ).isEmpty() ) { - argList << cupsOptions( printer, documentOrientation); + if ( useCupsOptions && ! cupsOptions( printer, documentOrientation, scaleMode ).isEmpty() ) { + argList << cupsOptions( printer, documentOrientation, scaleMode); } if ( ! deleteFile( printer, fileDeletePolicy, version ).isEmpty() ) { @@ -450,6 +474,11 @@ } QStringList FilePrinter::cupsOptions( QPrinter &printer, QPrinter::Orientation documentOrientation ) +{ + return cupsOptions( printer, documentOrientation, ScaleMode::FitToPrintArea ); +} + +QStringList FilePrinter::cupsOptions( QPrinter &printer, QPrinter::Orientation documentOrientation, ScaleMode scaleMode ) { QStringList optionList; @@ -473,8 +502,8 @@ optionList << optionCollateCopies( printer ); } - if ( ! optionPageMargins( printer ).isEmpty() ) { - optionList << optionPageMargins( printer ); + if ( ! optionPageMargins( printer, scaleMode ).isEmpty() ) { + optionList << optionPageMargins( printer, scaleMode ); } optionList << optionCupsProperties( printer ); @@ -611,18 +640,29 @@ } QStringList FilePrinter::optionPageMargins( QPrinter &printer ) +{ + return optionPageMargins( printer, ScaleMode::FitToPrintArea ); +} + +QStringList FilePrinter::optionPageMargins( QPrinter &printer, ScaleMode scaleMode ) { if (printer.printEngine()->property(QPrintEngine::PPK_PageMargins).isNull()) { return QStringList(); } else { qreal l(0), t(0), r(0), b(0); if (!printer.fullPage()) { printer.getPageMargins( &l, &t, &r, &b, QPrinter::Point ); } - return QStringList(QStringLiteral("-o")) << QStringLiteral("page-left=%1").arg(l) + QStringList marginOptions; + marginOptions << (QStringLiteral("-o")) << QStringLiteral("page-left=%1").arg(l) << QStringLiteral("-o") << QStringLiteral("page-top=%1").arg(t) << QStringLiteral("-o") << QStringLiteral("page-right=%1").arg(r) - << QStringLiteral("-o") << QStringLiteral("page-bottom=%1").arg(b) << QStringLiteral("-o") << QStringLiteral("fit-to-page"); + << QStringLiteral("-o") << QStringLiteral("page-bottom=%1").arg(b); + if (scaleMode == ScaleMode::FitToPrintArea) { + marginOptions << QStringLiteral("-o") << QStringLiteral("fit-to-page"); + } + + return marginOptions; } } diff --git a/generators/poppler/generator_pdf.cpp b/generators/poppler/generator_pdf.cpp --- a/generators/poppler/generator_pdf.cpp +++ b/generators/poppler/generator_pdf.cpp @@ -80,17 +80,6 @@ class PDFOptionsPage : public Okular::PrintOptionsWidget { Q_OBJECT -public slots: - void enableOrDisableScaleMode() - { - m_scaleMode->setEnabled ( m_forceRaster->isChecked() ); - - if ( m_forceRaster->isChecked() ) { - m_scaleMode->setToolTip( i18n( "Scaling mode for the printed pages" ) ); - } else { - m_scaleMode->setToolTip( i18n( "Select rasterization to enable this!" ) ); - } - } public: enum ScaleMode { @@ -120,18 +109,13 @@ m_scaleMode->insertItem(FitToPrintableArea, i18n("Fit to printable area"), FitToPrintableArea); m_scaleMode->insertItem(FitToPage, i18n("Fit to full page"), FitToPage); m_scaleMode->insertItem(None, i18n("None; print original size"), None); - m_scaleMode->setToolTip(i18n("Select rasterization to enable this!")); + m_scaleMode->setToolTip(i18n( "Scaling mode for the printed pages" ) ); printBackendLayout->addRow(i18n("Scale mode:"), m_scaleMode); layout->addWidget(formWidget); layout->addStretch(1); - // Enable scaleMode only if the file is to be rasterized before printing - m_scaleMode->setEnabled( false ); - - connect( m_forceRaster, &QCheckBox::stateChanged, this, &PDFOptionsPage::enableOrDisableScaleMode ); - #if defined(Q_OS_WIN) && !defined HAVE_POPPLER_0_60 m_printAnnots->setVisible( false ); #endif @@ -1488,11 +1472,16 @@ userMutex()->unlock(); delete psConverter; tf.close(); + + const Okular::FilePrinter::ScaleMode filePrinterScaleMode = + (scaleMode == PDFOptionsPage::None) ? Okular::FilePrinter::ScaleMode::None : Okular::FilePrinter::ScaleMode::FitToPrintArea; + int ret = Okular::FilePrinter::printFile( printer, tempfilename, document()->orientation(), + filePrinterScaleMode, Okular::FilePrinter::SystemDeletesFiles, Okular::FilePrinter::ApplicationSelectsPages, - document()->bookmarkedPageRange() ); + document()->bookmarkedPageRange()); lastPrintError = Okular::FilePrinter::printError( ret );