aboutsummaryrefslogtreecommitdiff
path: root/src-qt5/desktop-utils/lumina-pdf/Renderer-poppler.cpp
blob: 62548f7832d391df13f4a84c475283af19f8dd04 (plain)
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include "Renderer.h"
#include <poppler/qt5/poppler-qt5.h>
#include <QThread>

static Poppler::Document *DOC;
QHash<int, QImage> loadingHash;

Renderer::Renderer(){
  DOC = 0;
  needpass = false;
  pnum = 0;
	degrees = 0;
}

Renderer::~Renderer(){
  //qDeleteAll(loadingHash);
  loadingHash.clear();
}

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;
    docpath = path;
  }
  //Load the Document (if needed);
  if(DOC==0){
    //qDebug() << "Loading Document";
    DOC = Poppler::Document::load(path);
    docpath = 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
}

void Renderer::renderPage(int pagenum, QSize DPI, int degrees){
  //qDebug() << "Render Page:" << pagenum << DPI << degrees;
  if(DOC!=0){
    Poppler::Page *PAGE = DOC->page(pagenum);
    QImage img;
    if(PAGE!=0){
			Poppler::Page::Rotation rotation;
			switch(degrees) {
				case 90:
					rotation = Poppler::Page::Rotation::Rotate90;
					break;
				case 180:
					rotation = Poppler::Page::Rotation::Rotate180;
					break;
				case 270:
					rotation = Poppler::Page::Rotation::Rotate270;
					break;
				default:
					rotation = Poppler::Page::Rotation::Rotate0;
			}
      img = PAGE->renderToImage(DPI.width(),DPI.height(), -1, -1, -1, -1, rotation);
      loadingHash.insert(pagenum, img);
      delete PAGE;
    }
    //qDebug() << "Done Render Page:" << pagenum << img.size();
  }else{
    loadingHash.insert(pagenum, QImage());
  }
  emit PageLoaded(pagenum);
}

QList<TextData*> Renderer::searchDocument(QString text, bool matchCase){
  QList<TextData*> results;
  for(int i = 0; i < pnum; i++) {
    QList<Poppler::TextBox*> textList = DOC->page(i)->textList();
    for(int j = 0; j < textList.size(); j++) {
      if(textList[j]->text().contains(text, 
      (matchCase) ? Qt::CaseSensitive : Qt::CaseInsensitive)) {
        TextData *t = new TextData(textList[j]->boundingBox(), i+1, text, degrees);
        results.append(t);
      }
    }
  }
  return results;
}

QImage Renderer::imageHash(int pagenum) {
  return loadingHash[pagenum];
}

int Renderer::hashSize() {
  return loadingHash.keys().length();
}

void Renderer::clearHash() {
  loadingHash.clear();
}
bgstack15