Subversion Repositories Scribus

Rev

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

Rev Author Line No. Line
4430 cbradney 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
*/
3133 fschmid 7
/***************************************************************************
10601 mrdocs 8
                          pdflib_core.cpp  -  description
3133 fschmid 9
                             -------------------
10
    begin                : Sat Jan 19 2002
11
    copyright            : (C) 2002 by Franz Schmid
12
    email                : Franz.Schmid@altmuehlnet.de
13
 ***************************************************************************/
14
 
15
/***************************************************************************
16
 *                                                                         *
17
 *   This program is free software; you can redistribute it and/or modify  *
18
 *   it under the terms of the GNU General Public License as published by  *
19
 *   the Free Software Foundation; either version 2 of the License, or     *
20
 *   (at your option) any later version.                                   *
21
 *                                                                         *
22
 ***************************************************************************/
23
 
10054 craig 24
#include "pdflib_core.h"
3133 fschmid 25
 
26
#include "scconfig.h"
27
 
4229 craig 28
#include <string>
10223 cbradney 29
#include <QString>
30
#include <QRect>
31
#include <QImage>
32
#include <QRegExp>
33
#include <QDateTime>
34
#include <QFileInfo>
10004 fschmid 35
#include <QDataStream>
10223 cbradney 36
#include <QDir>
9803 fschmid 37
#include <QList>
9535 fschmid 38
#include <QByteArray>
11453 fschmid 39
#include <QPainterPath>
8501 cbradney 40
#include <QPixmap>
10614 cbradney 41
#include <QTextCodec>
3133 fschmid 42
#include <cstdlib>
43
#include <cmath>
9922 fschmid 44
#include <QStack>
3133 fschmid 45
#ifdef HAVE_UNISTD_H
46
#include <unistd.h>
47
#endif
48
#include "rc4.h"
49
 
10212 cbradney 50
 
51
#include "bookmwin.h"
10862 cbradney 52
#include "bookmarkpalette.h"
10601 mrdocs 53
#include "cmsettings.h"
4028 cbradney 54
#include "commonstrings.h"
10212 cbradney 55
#include "multiprogressdialog.h"
3670 cbradney 56
#include "page.h"
3133 fschmid 57
#include "pageitem.h"
10601 mrdocs 58
#include "pageitem_textframe.h"
10212 cbradney 59
#include "pdfoptions.h"
60
#include "prefscontext.h"
61
#include "prefsmanager.h"
62
#include "sccolor.h"
63
#include "sccolorengine.h"
64
#include "scfonts.h"
5917 jghali 65
#include "scpaths.h"
10212 cbradney 66
#include "scpattern.h"
3133 fschmid 67
#include "scribus.h"
5243 cbradney 68
#include "scribuscore.h"
3699 cbradney 69
#include "scribusdoc.h"
10212 cbradney 70
#include "text/nlsconfig.h"
3133 fschmid 71
#include "util.h"
10212 cbradney 72
#include "util_formats.h"
10203 cbradney 73
#include "util_math.h"
3133 fschmid 74
 
5184 avox 75
 
3133 fschmid 76
using namespace std;
77
 
6562 fschmid 78
#include <tiffio.h>
3133 fschmid 79
 
6562 fschmid 80
 
10054 craig 81
PDFLibCore::PDFLibCore(ScribusDoc & docu)
4264 craig 82
        : QObject(&docu),
4223 craig 83
        doc(docu),
84
        ActPageP(0),
4264 craig 85
        Options(doc.PDF_Options),
4223 craig 86
        Bvie(0),
87
        ObjCounter(7),
88
        ResNam("RE"),
89
        ResCount(0),
90
        NDnam("LI"),
91
        NDnum(0),
10553 fschmid 92
        KeyGen(""),
93
        OwnerKey(""),
94
        UserKey(""),
95
        FileID(""),
96
        EncryKey(""),
4223 craig 97
        Encrypt(0),
98
        KeyLen(5),
99
        colorsToUse(),
100
        spotNam("Spot"),
101
        spotCount(0),
4225 craig 102
        progressDialog(0),
4223 craig 103
        abortExport(false),
5243 cbradney 104
        usingGUI(ScCore->usingGUI())
3133 fschmid 105
{
10553 fschmid 106
        KeyGen.resize(32);
107
        OwnerKey.resize(32);
108
        UserKey.resize(32);
109
        FileID.resize(16);
110
        EncryKey.resize(5);
3133 fschmid 111
        Catalog.Outlines = 2;
112
        Catalog.PageTree = 3;
113
        Catalog.Dest = 4;
114
        PageTree.Count = 0;
115
        Outlines.First = 0;
116
        Outlines.Last = 0;
117
        Outlines.Count = 0;
118
        Seite.ObjNum = 0;
119
        Seite.Thumb = 0;
120
        int kg_array[] = {0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41, 0x64, 0x00, 0x4e, 0x56, 0xff, 0xfa,
121
                          0x01, 0x08, 0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80, 0x2f, 0x0c, 0xa9, 0xfe,
122
                          0x64, 0x53, 0x69, 0x7a};
123
        for (int a = 0; a < 32; ++a)
124
                KeyGen[a] = kg_array[a];
4028 cbradney 125
        if (usingGUI)
126
        {
10508 cbradney 127
                progressDialog = new MultiProgressDialog( tr("Saving PDF"), CommonStrings::tr_Cancel, doc.scMW());
4224 craig 128
                Q_CHECK_PTR(progressDialog);
129
                QStringList barNames, barTexts;
130
                barNames << "EMP" << "EP" << "ECPI";
5370 cbradney 131
                barTexts << tr("Exporting Master Page:") << tr("Exporting Page:") << tr("Exporting Items on Current Page:");
9803 fschmid 132
                QList<bool> barsNumeric;
5370 cbradney 133
                barsNumeric << true << true << false;
134
                progressDialog->addExtraProgressBars(barNames, barTexts, barsNumeric);
8559 subik 135
                connect(progressDialog, SIGNAL(canceled()), this, SLOT(cancelRequested()));
4028 cbradney 136
        }
3133 fschmid 137
}
138
 
10054 craig 139
PDFLibCore::~PDFLibCore()
4224 craig 140
{
141
        delete progressDialog;
142
}
143
 
4229 craig 144
static inline QString FToStr(double c)
145
{
146
        return QString::number(c, 'f', 5);
147
};
148
 
10054 craig 149
bool PDFLibCore::doExport(const QString& fn, const QString& nam, int Components,
4264 craig 150
                                          const std::vector<int> & pageNs, const QMap<int,QPixmap> & thumbs)
3133 fschmid 151
{
152
        QPixmap pm;
11060 jghali 153
        bool ret = false, error = false;
154
        int  pc_exportpages=0;
155
        int  pc_exportmasterpages=0;
4224 craig 156
        if (usingGUI)
157
                progressDialog->show();
5387 avox 158
        QMap<QString, QMap<uint, FPointArray> > usedFonts;
159
        usedFonts.clear();
160
        doc.getUsedFonts(usedFonts);
5781 cbradney 161
        if (PDF_Begin_Doc(fn, PrefsManager::instance()->appPrefs.AvailFonts, usedFonts, doc.scMW()->bookmarkPalette->BView))
3133 fschmid 162
        {
163
                QMap<int, int> pageNsMpa;
164
                for (uint a = 0; a < pageNs.size(); ++a)
165
                {
4264 craig 166
                        pageNsMpa.insert(doc.MasterNames[doc.Pages->at(pageNs[a]-1)->MPageNam], 0);
3133 fschmid 167
                }
4028 cbradney 168
                if (usingGUI)
3133 fschmid 169
                {
4028 cbradney 170
                        progressDialog->setOverallTotalSteps(pageNsMpa.count()+pageNs.size());
171
                        progressDialog->setTotalSteps("EMP", pageNsMpa.count());
172
                        progressDialog->setTotalSteps("EP", pageNs.size());
173
                        progressDialog->setOverallProgress(0);
174
                        progressDialog->setProgress("EMP", 0);
175
                        progressDialog->setProgress("EP", 0);
176
                }
10018 fschmid 177
                for (int ap = 0; ap < doc.MasterPages.count() && !abortExport; ++ap)
4028 cbradney 178
                {
4264 craig 179
                        if (doc.MasterItems.count() != 0)
3133 fschmid 180
                        {
181
                                if (pageNsMpa.contains(ap))
182
                                {
5243 cbradney 183
                                        qApp->processEvents();
11060 jghali 184
                                        if (!PDF_TemplatePage(doc.MasterPages.at(ap)))
185
                                                error = abortExport = true;
4028 cbradney 186
                                        ++pc_exportmasterpages;
3133 fschmid 187
                                }
188
                        }
4546 subik 189
                        if (usingGUI)
190
                        {
4028 cbradney 191
                                progressDialog->setProgress("EMP", pc_exportmasterpages);
192
                                progressDialog->setOverallProgress(pc_exportmasterpages+pc_exportpages);
193
                        }
3133 fschmid 194
                }
4028 cbradney 195
                for (uint a = 0; a < pageNs.size() && !abortExport; ++a)
3133 fschmid 196
                {
4264 craig 197
                        if (doc.PDF_Options.Thumbnails)
3133 fschmid 198
                                pm = thumbs[pageNs[a]];
5243 cbradney 199
                        qApp->processEvents();
4028 cbradney 200
                        if (abortExport) break;
11060 jghali 201
 
4264 craig 202
                        PDF_Begin_Page(doc.Pages->at(pageNs[a]-1), pm);
5243 cbradney 203
                        qApp->processEvents();
4028 cbradney 204
                        if (abortExport) break;
11060 jghali 205
 
206
                        if (!PDF_ProcessPage(doc.Pages->at(pageNs[a]-1), pageNs[a]-1, doc.PDF_Options.doClip))
207
                                error = abortExport = true;
5243 cbradney 208
                        qApp->processEvents();
4028 cbradney 209
                        if (abortExport) break;
11060 jghali 210
 
3133 fschmid 211
                        PDF_End_Page();
4028 cbradney 212
                        pc_exportpages++;
213
                        if (usingGUI)
214
                        {
215
                                progressDialog->setProgress("EP", pc_exportpages);
216
                                progressDialog->setOverallProgress(pc_exportmasterpages+pc_exportpages);
217
                        }
3133 fschmid 218
                }
4028 cbradney 219
                ret = true;//Even when aborting we return true. Dont want that "couldnt write msg"
220
                if (!abortExport)
221
                {
4264 craig 222
                        if (doc.PDF_Options.Version == PDFOptions::PDFVersion_X3)
5243 cbradney 223
                                PDF_End_Doc(ScCore->PrinterProfiles[doc.PDF_Options.PrintProf], nam, Components);
4028 cbradney 224
                        else
225
                                PDF_End_Doc();
226
                }
3133 fschmid 227
                else
4028 cbradney 228
                        closeAndCleanup();
3133 fschmid 229
        }
4029 cbradney 230
        if (usingGUI)
231
                progressDialog->close();
11060 jghali 232
        return (ret && !error);
3133 fschmid 233
}
234
 
11060 jghali 235
const QString& PDFLibCore::errorMessage(void) const
236
{
237
        return ErrorMessage;
238
}
239
 
11441 jghali 240
bool PDFLibCore::exportAborted(void) const
241
{
242
        return abortExport;
243
}
244
 
10054 craig 245
void PDFLibCore::StartObj(int nr)
3133 fschmid 246
{
4229 craig