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
|
#include "Renderer.h"
#include <poppler/qt5/poppler-qt5.h>
static Poppler::Document *DOC;
Renderer::Renderer(){
DOC = 0;
needpass = false;
pnum = 0;
}
Renderer::~Renderer(){
}
bool Renderer::loadMultiThread(){ return true; }
QJsonObject Renderer::properties(){
return QJsonObject(); //TO-DO
}
bool Renderer::loadDocument(QString path, QString password){
//qDebug() << "Load Document:" << path;
if(DOC!=0 && path!=docpath){
//Clear out the old document first
delete DOC;
DOC=0;
needpass = false;
pnum=0;
}
//Load the Document (if needed);
if(DOC==0){
//qDebug() << "Loading Document";
DOC = Poppler::Document::load(path);
}
if(DOC==0){
qDebug() << "Could not open file:" << path;
return false;
}else if(DOC->isLocked()){
//qDebug() << "Document Locked";
needpass = true;
if(password.isEmpty()){ return false; } //stop here - need to get password from user before continuing
needpass = !DOC->unlock(QByteArray(), password.toLocal8Bit());
if(needpass){ return false; } //invalid password
}
//qDebug() << "Opening File:" << path;
doctitle = DOC->title();
if(doctitle.isEmpty()){ doctitle = path.section("/",-1); }
pnum = DOC->numPages();
//Setup the Document
Poppler::Page *PAGE = DOC->page(0);
if(PAGE!=0){
/*switch(PAGE->orientation()){
case Poppler::Page::Landscape:
WIDGET->setOrientation(QPageLayout::Landscape); break;
default:
WIDGET->setOrientation(QPageLayout::Portrait);
}*/
delete PAGE;
return true; //could load the first page
}
return false; //nothing to load
}
QImage Renderer::renderPage(int pagenum, QSize DPI){
//qDebug() << "Render Page:" << pagenum << DPI;
if(DOC==0){ return QImage(); }
Poppler::Page *PAGE = DOC->page(pagenum);
QImage img;
if(PAGE!=0){
//qDebug() << "Render Page:" << pagenum;
img = PAGE->renderToImage(DPI.width(),DPI.height());
delete PAGE;
}
//qDebug() << "Done Render Page:" << pagenum << img.size();
return img;
}
QList<TextData*> Renderer::searchDocument(QString text, bool matchCase){
QList<TextData*> results;
/*for(int i = 0; i < pnum; i++) {
int count = fz_search_page_number(CTX, DOC, i, text.toLatin1().data(), rectBuffer, 1000);
//qDebug() << "Page " << i+1 << ": Count, " << count;
for(int j = 0; j < count; j++) {
TextData *t = new TextData(rectBuffer[j], i+1, text);
//MuPDF search does not match case, so retrieve the exact text at the location found and determine whether or not it matches the case of the search text if the user selected to match case
if(matchCase){
fz_stext_page *sPage = fz_new_stext_page_from_page_number(CTX, DOC, i, NULL);
QString currentStr = QString(fz_copy_selection(CTX, sPage, *fz_rect_min(&rectBuffer[j]), *fz_rect_max(&rectBuffer[j]), false));
if(currentStr.contains(text, Qt::CaseSensitive)){ results.append(t); }
}else{
results.append(t);
}
}
}*/
return results;
}
|