-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathimages2pdf.cpp
More file actions
105 lines (83 loc) · 2.41 KB
/
images2pdf.cpp
File metadata and controls
105 lines (83 loc) · 2.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include "images2pdf.h"
#include <QApplication>
#include <QRectF>
#include <QImage>
#include <QPainter>
#include <QPrinter>
Images2PDF::Images2PDF(QString source_dir, QString target_pdf) :
_aborted(false)
{
_source_dir = new QDir(source_dir);
_target_pdf = new QFileInfo(target_pdf);
QStringList imageFilter;
imageFilter << "*.jpg" << "*.jpeg" << "*.png";
_images = _source_dir->entryList(imageFilter, QDir::Files | QDir::Readable, QDir::Name);
}
Images2PDF::~Images2PDF()
{
delete _source_dir;
delete _target_pdf;
}
int Images2PDF::imageCount()
{
return _images.length();
}
const QString Images2PDF::error()
{
return _error;
}
void Images2PDF::abort()
{
_aborted = true;
}
void Images2PDF::start()
{
if(imageCount() == 0) {
_error = trUtf8("No images found!");
emit finished(false);
return;
}
QPrinter *printer = new QPrinter();
printer->setOutputFormat(QPrinter::PdfFormat);
printer->setOutputFileName(_target_pdf->absoluteFilePath());
printer->setFullPage(true);
QPainter *painter = new QPainter(printer);
for(int idx=0; !_aborted && idx < _images.length(); ++idx) {
emit processing(_images[idx]);
qApp->processEvents();
if(idx>0) {
printer->newPage();
}
addImage(idx, painter);
_processed << _images[idx];
emit progress(idx+1);
qApp->processEvents();
}
painter->end();
delete painter;
delete printer;
if(_aborted) {
_error = trUtf8("Aborted after %1 images were added to PDF.").arg(_processed.length());
emit finished(false);
return;
}
emit finished(true);
}
void Images2PDF::addImage(int imageIndex, QPainter *painter)
{
QImage img(_source_dir->filePath(_images[imageIndex]));
if(img.isNull()) {
return; // TODO: report skipped images somewhere?
}
QRect sizeOnPage(0, 0, painter->device()->width(), painter->device()->height());
QRect imageSize(0, 0, img.width(), img.height());
float scale_x = ((float) sizeOnPage.width()) / ((float) imageSize.width());
float scale_y = ((float) sizeOnPage.height()) / ((float) imageSize.height());
float scale = (scale_x < scale_y) ? scale_x : scale_y;
sizeOnPage.setWidth( imageSize.width() * scale );
sizeOnPage.setHeight( imageSize.height() * scale );
painter->drawImage(
sizeOnPage,
img,
imageSize);
}