UBExportPDF.cpp 4.21 KB
Newer Older
Claudio Valerio's avatar
Claudio Valerio committed
1
/*
2
 * Copyright (C) 2010-2013 Groupement d'Intérêt Public pour l'Education Numérique en Afrique (GIP ENA)
Claudio Valerio's avatar
Claudio Valerio committed
3
 *
4 5
 * This file is part of Open-Sankoré.
 *
Claudio Valerio's avatar
Claudio Valerio committed
6 7 8
 * Open-Sankoré is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, version 3 of the License,
9 10 11 12 13
 * with a specific linking exception for the OpenSSL project's
 * "OpenSSL" library (or with modified versions of it that use the
 * same license as the "OpenSSL" library).
 *
 * Open-Sankoré is distributed in the hope that it will be useful,
Claudio Valerio's avatar
Claudio Valerio committed
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Claudio Valerio's avatar
Claudio Valerio committed
15 16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
Claudio Valerio's avatar
Claudio Valerio committed
17
 *
Claudio Valerio's avatar
Claudio Valerio committed
18 19
 * You should have received a copy of the GNU General Public License
 * along with Open-Sankoré.  If not, see <http://www.gnu.org/licenses/>.
Claudio Valerio's avatar
Claudio Valerio committed
20 21
 */

22

Claudio Valerio's avatar
Claudio Valerio committed
23

Claudio Valerio's avatar
Claudio Valerio committed
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
#include "UBExportPDF.h"

#include <QtCore>
#include <QtSvg>

#include "core/UBApplication.h"
#include "core/UBSettings.h"
#include "core/UBSetting.h"
#include "core/UBPersistenceManager.h"

#include "domain/UBGraphicsScene.h"
#include "domain/UBGraphicsSvgItem.h"

#include "document/UBDocumentProxy.h"

#include "pdf/GraphicsPDFItem.h"

41
#include "core/memcheck.h"
Claudio Valerio's avatar
Claudio Valerio committed
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73

UBExportPDF::UBExportPDF(QObject *parent)
    : UBExportAdaptor(parent)
{
    // NOOP
}

UBExportPDF::~UBExportPDF()
{
    // NOOP
}

void UBExportPDF::persist(UBDocumentProxy* pDocumentProxy)
{
    if (!pDocumentProxy)
        return;

    QString filename = askForFileName(pDocumentProxy, tr("Export as PDF File"));

    if (filename.length() > 0)
    {
        QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
        UBApplication::showMessage(tr("Exporting document..."));

        persistsDocument(pDocumentProxy, filename);

        UBApplication::showMessage(tr("Export successful."));
        QApplication::restoreOverrideCursor();
    }
}


74
void UBExportPDF::persistsDocument(UBDocumentProxy* pDocumentProxy, const QString& filename)
Claudio Valerio's avatar
Claudio Valerio committed
75 76 77 78 79 80 81 82
{
    QPrinter pdfPrinter;

    qDebug() << "exporting document to PDF" << filename;

    pdfPrinter.setOutputFormat(QPrinter::PdfFormat);
    pdfPrinter.setResolution(UBSettings::settings()->pdfResolution->get().toInt());
    pdfPrinter.setOutputFileName(filename);
Claudio Valerio's avatar
Claudio Valerio committed
83
    pdfPrinter.setFullPage(true);
Claudio Valerio's avatar
Claudio Valerio committed
84

85
    //need to calculate screen resolution
Claudio Valerio's avatar
Claudio Valerio committed
86 87 88 89
    QDesktopWidget* desktop = UBApplication::desktop();
    int dpiCommon = (desktop->physicalDpiX() + desktop->physicalDpiY()) / 2;
    float scaleFactor = 72.0f / dpiCommon;
    
90
    QPainter pdfPainter;
Claudio Valerio's avatar
Claudio Valerio committed
91
    bool painterNeedsBegin = true;
Claudio Valerio's avatar
Claudio Valerio committed
92 93 94 95 96 97 98 99 100 101 102 103

    int existingPageCount = pDocumentProxy->pageCount();

    for(int pageIndex = 0 ; pageIndex < existingPageCount; pageIndex++)
    {
        UBGraphicsScene* scene = UBPersistenceManager::persistenceManager()->loadDocumentScene(pDocumentProxy, pageIndex);
        UBApplication::showMessage(tr("Exporting page %1 of %2").arg(pageIndex + 1).arg(existingPageCount));
        // set background to white, no crossing for PDF output
        bool isDark = scene->isDarkBackground();
        bool isCrossed = scene->isCrossedBackground();
        scene->setBackground(false, false);

Claudio Valerio's avatar
Claudio Valerio committed
104
        QSize pageSize = scene->nominalSize();
Claudio Valerio's avatar
Claudio Valerio committed
105 106 107 108 109

        // set high res rendering
        scene->setRenderingQuality(UBItem::RenderingQualityHigh);
        scene->setRenderingContext(UBGraphicsScene::NonScreen);

Claudio Valerio's avatar
Claudio Valerio committed
110 111 112
        //setting page size to appropriate value
        pdfPrinter.setPaperSize(QSizeF(pageSize.width()*scaleFactor, pageSize.height()*scaleFactor), QPrinter::Point);
        if(painterNeedsBegin) painterNeedsBegin = !pdfPainter.begin(&pdfPrinter);
Claudio Valerio's avatar
Claudio Valerio committed
113
        //render to PDF
Claudio Valerio's avatar
Claudio Valerio committed
114
        scene->render(&pdfPainter, QRectF(), scene->normalizedSceneRect());
Claudio Valerio's avatar
Claudio Valerio committed
115

116
        if (pageIndex < existingPageCount - 1) pdfPrinter.newPage();
Claudio Valerio's avatar
Claudio Valerio committed
117 118 119 120 121 122 123 124

        //restore screen rendering quality
        scene->setRenderingContext(UBGraphicsScene::Screen);
        scene->setRenderingQuality(UBItem::RenderingQualityNormal);

        //restore background state
        scene->setBackground(isDark, isCrossed);
    }
Claudio Valerio's avatar
Claudio Valerio committed
125
    if(!painterNeedsBegin) pdfPainter.end();
Claudio Valerio's avatar
Claudio Valerio committed
126 127 128 129 130 131 132 133 134 135 136
}

QString UBExportPDF::exportExtention()
{
    return QString(".pdf");
}

QString UBExportPDF::exportName()
{
    return tr("Export to PDF");
}