#include "Renderer.h" #include #include static Poppler::Document *DOC; QHash 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 Renderer::searchDocument(QString text, bool matchCase){ QList results; for(int i = 0; i < pnum; i++) { QList 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); 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(); } //Highlighting found text, bookmarks, and page properties disabled for Poppler bool Renderer::supportsExtraFeatures() { return false; } void Renderer::traverseOutline(void *, int) { } void Renderer::handleLink(QString link) { }