Add support for pdfium

This commit is contained in:
Felix Kauselmann 2016-10-18 00:48:56 +02:00
parent f05ac77fc2
commit c74934c822
7 changed files with 268 additions and 147 deletions

View File

@ -58,9 +58,17 @@ win32 {
} }
unix:!macx{ unix:!macx{
!CONFIG(pdfium){
INCLUDEPATH += /usr/include/poppler/qt5 INCLUDEPATH += /usr/include/poppler/qt5
LIBS += -L/usr/lib -lpoppler-qt5 LIBS += -L/usr/lib -lpoppler-qt5
} else {
DEFINES += "USE_PDFIUM"
INCLUDEPATH += /usr/include/pdfium
LIBS += -L/usr/lib/pdfium -Wl,--start-group -lpdfium -lfpdfapi -lfxge -lfpdfdoc \
-lfxcrt -lfx_agg -lfxcodec -lfx_lpng -lfx_libopenjpeg -lfx_lcms2 -ljpeg \
-lfx_zlib -lfdrm -lfxedit -lformfiller -lpdfwindow -lpdfium -lbigint -ljavascript \
-lfxedit -Wl,--end-group -lfreetype
}
!CONFIG(no_opengl) { !CONFIG(no_opengl) {
LIBS += -lGLU LIBS += -lGLU
@ -172,6 +180,7 @@ SOURCES += ../common/comic.cpp \
../common/library_item.cpp \ ../common/library_item.cpp \
yacreader_local_client.cpp \ yacreader_local_client.cpp \
../common/http_worker.cpp \ ../common/http_worker.cpp \
../common/pdf_comic.cpp \
../common/yacreader_global.cpp \ ../common/yacreader_global.cpp \
../common/yacreader_global_gui.cpp \ ../common/yacreader_global_gui.cpp \
../common/exit_check.cpp \ ../common/exit_check.cpp \

View File

@ -46,9 +46,18 @@ win32 {
} }
unix:!macx{ unix:!macx{
!CONFIG(pdfium) {
INCLUDEPATH += /usr/include/poppler/qt5 INCLUDEPATH += /usr/include/poppler/qt5
LIBS += -L/usr/lib -lpoppler-qt5 LIBS += -L/usr/lib -lpoppler-qt5
}
else {
DEFINES += "USE_PDFIUM"
INCLUDEPATH += /usr/include/pdfium
LIBS += -L/usr/lib/pdfium -Wl,--start-group -lpdfium -lfpdfapi -lfxge -lfpdfdoc \
-lfxcrt -lfx_agg -lfxcodec -lfx_lpng -lfx_libopenjpeg -lfx_lcms2 -ljpeg \
-lfx_zlib -lfdrm -lfxedit -lformfiller -lpdfwindow -lpdfium -lbigint -ljavascript \
-lfxedit -Wl,--end-group -lfreetype
}
!CONFIG(no_opengl) { !CONFIG(no_opengl) {
LIBS += -lGLU LIBS += -lGLU
@ -202,6 +211,7 @@ SOURCES += comic_flow.cpp \
../common/yacreader_global_gui.cpp \ ../common/yacreader_global_gui.cpp \
yacreader_libraries.cpp \ yacreader_libraries.cpp \
../common/exit_check.cpp \ ../common/exit_check.cpp \
../common/pdf_comic.cpp \
comics_view.cpp \ comics_view.cpp \
classic_comics_view.cpp \ classic_comics_view.cpp \
empty_folder_widget.cpp \ empty_folder_widget.cpp \

View File

@ -14,7 +14,7 @@
#include "compressed_archive.h" #include "compressed_archive.h"
#include "comic.h" #include "comic.h"
#include "pdf_comic.h"
#include "yacreader_global.h" #include "yacreader_global.h"
#include "QsLog.h" #include "QsLog.h"
@ -22,18 +22,6 @@
#include <algorithm> #include <algorithm>
using namespace std; using namespace std;
#ifdef Q_OS_MAC
#include "pdf_comic.h"
#else
#if QT_VERSION >= 0x050000
#include "poppler-qt5.h"
#else
#include "poppler-qt4.h"
#endif
#endif
//-------------------------------------------------------------------------------- //--------------------------------------------------------------------------------
LibraryCreator::LibraryCreator() LibraryCreator::LibraryCreator()
:creation(false), partialUpdate(false) :creation(false), partialUpdate(false)
@ -594,8 +582,7 @@ void ThumbnailCreator::create()
if(fi.suffix().compare("pdf",Qt::CaseInsensitive) == 0) if(fi.suffix().compare("pdf",Qt::CaseInsensitive) == 0)
{ {
#if defined Q_OS_MAC && defined USE_PDFKIT
#ifdef Q_OS_MAC
MacOSXPDFComic * pdfComic = new MacOSXPDFComic(); MacOSXPDFComic * pdfComic = new MacOSXPDFComic();
if(!pdfComic->openComic(_fileSource)) if(!pdfComic->openComic(_fileSource))
{ {
@ -605,9 +592,17 @@ void ThumbnailCreator::create()
//p.save(_target); //p.save(_target);
return; return;
} }
#elif defined USE_PDFIUM
PdfiumComic * pdfComic = new PdfiumComic();
if(!pdfComic->openComic(_fileSource))
{
delete pdfComic;
return;
}
#else #else
Poppler::Document * pdfComic = Poppler::Document::load(_fileSource); Poppler::Document * pdfComic = Poppler::Document::load(_fileSource);
#endif #endif
if (!pdfComic) if (!pdfComic)
{ {
QLOG_WARN() << "Extracting cover: unable to open PDF file " << _fileSource; QLOG_WARN() << "Extracting cover: unable to open PDF file " << _fileSource;
@ -618,7 +613,7 @@ void ThumbnailCreator::create()
//p.save(_target); //p.save(_target);
return; return;
} }
#ifndef Q_OS_MAC #if !defined USE_PDFKIT && !defined USE_PDFIUM
//poppler only, not mac //poppler only, not mac
if (pdfComic->isLocked()) if (pdfComic->isLocked())
{ {
@ -630,9 +625,11 @@ void ThumbnailCreator::create()
_numPages = pdfComic->numPages(); _numPages = pdfComic->numPages();
if(_numPages >= _coverPage) if(_numPages >= _coverPage)
{ {
#ifdef Q_OS_MAC #if defined Q_OS_MAC || defined USE_PDFIUM
{ //TODO is this "{" one too much?
QImage p = pdfComic->getPage(_coverPage-1); //TODO check if the page is valid QImage p = pdfComic->getPage(_coverPage-1); //TODO check if the page is valid
#ifdef USE_PDFKIT
pdfComic->releaseLastPageData();
#endif
#else #else
QImage p = pdfComic->page(_coverPage-1)->renderToImage(72,72); QImage p = pdfComic->page(_coverPage-1)->renderToImage(72,72);
#endif #endif
@ -650,11 +647,6 @@ void ThumbnailCreator::create()
} }
scaled.save(_target,0,75); scaled.save(_target,0,75);
} }
#ifdef Q_OS_MAC
} //TODO is this "{" one too much?
pdfComic->releaseLastPageData();
#endif
}
else if(_target!="") else if(_target!="")
{ {
QLOG_WARN() << "Extracting cover: requested cover index greater than numPages " << _fileSource; QLOG_WARN() << "Extracting cover: requested cover index greater than numPages " << _fileSource;
@ -662,9 +654,9 @@ void ThumbnailCreator::create()
//p.load(":/images/notCover.png"); //p.load(":/images/notCover.png");
//p.save(_target); //p.save(_target);
} }
delete pdfComic; delete pdfComic;
} }
}
else else
{ {

View File

@ -769,7 +769,7 @@ bool PDFComic::load(const QString & path, const ComicDB & comic)
void PDFComic::process() void PDFComic::process()
{ {
#ifdef Q_OS_MAC #if defined Q_OS_MAC && defined USE_PDFKIT
pdfComic = new MacOSXPDFComic(); pdfComic = new MacOSXPDFComic();
if(!pdfComic->openComic(_path)) if(!pdfComic->openComic(_path))
{ {
@ -777,8 +777,15 @@ void PDFComic::process()
emit errorOpening(); emit errorOpening();
return; return;
} }
#elif defined USE_PDFIUM
pdfComic = new PdfiumComic();
if(!pdfComic->openComic(_path))
{
delete pdfComic;
emit errorOpening();
return;
}
#else #else
pdfComic = Poppler::Document::load(_path); pdfComic = Poppler::Document::load(_path);
if (!pdfComic) if (!pdfComic)
{ {
@ -840,12 +847,15 @@ void PDFComic::process()
void PDFComic::renderPage(int page) void PDFComic::renderPage(int page)
{ {
#ifdef Q_OS_MAC #if defined Q_OS_MAC && defined USE_PDFKIT
QImage img = pdfComic->getPage(page); QImage img = pdfComic->getPage(page);
if(!img.isNull()) if(!img.isNull())
{ {
pdfComic->releaseLastPageData(); pdfComic->releaseLastPageData();
#elif defined USE_PDFIUM
QImage img = pdfComic->getPage(page);
if(!img.isNull())
{
#else #else
Poppler::Page* pdfpage = pdfComic->page(page); Poppler::Page* pdfpage = pdfComic->page(page);
if (pdfpage) if (pdfpage)

View File

@ -154,14 +154,16 @@ class PDFComic : public Comic
Q_OBJECT Q_OBJECT
private: private:
//pdf
#ifdef Q_OS_MAC
MacOSXPDFComic * pdfComic;
#else
Poppler::Document * pdfComic;
#endif
void renderPage(int page);
//pdf
#if defined Q_OS_MAC && defined USE_PDFKIT
MacOSXPDFComic * pdfComic;
#elif defined USE_PDFIUM
PdfiumComic * pdfComic;
#else
Poppler::Document * pdfComic;
#endif
void renderPage(int page);
//void run(); //void run();
public: public:

81
common/pdf_comic.cpp Normal file
View File

@ -0,0 +1,81 @@
#include "comic.h"
#include "pdf_comic.h"
#ifdef USE_PDFIUM
PdfiumComic::PdfiumComic()
{
FPDF_InitLibrary();
}
PdfiumComic::~PdfiumComic()
{
if (doc)
{
FPDF_CloseDocument(doc);
}
FPDF_DestroyLibrary();
}
bool PdfiumComic::openComic(const QString & path)
{
doc = FPDF_LoadDocument(path.toStdString().c_str(), NULL);
if (doc)
{
return true;
}
else
{
qDebug() << FPDF_GetLastError();
return false;
}
}
void PdfiumComic::closeComic()
{
FPDF_CloseDocument(doc);
}
unsigned int PdfiumComic::numPages()
{
if (doc)
{
return FPDF_GetPageCount(doc);
}
else
{
return 0; //-1?
}
}
QImage PdfiumComic::getPage(const int page)
{
QTime time;
time.start();
QImage image;
FPDF_PAGE pdfpage;
FPDF_BITMAP bitmap;
pdfpage = FPDF_LoadPage(doc, page);
if (!pdfpage)
{
qDebug() << FPDF_GetLastError();
return QImage();
}
//TODO: make target DPI configurable
double width = (FPDF_GetPageWidth(pdfpage)/72)*150;
double height = (FPDF_GetPageHeight(pdfpage)/72)*150;
image = QImage(width, height, QImage::Format_RGB888);// QImage::Format_RGBX8888);
image.fill(0xFFFFFFFF);
bitmap = FPDFBitmap_CreateEx(image.width(), image.height(), FPDFBitmap_BGR, image.scanLine(0), image.bytesPerLine());
//TODO: make render flags costumizable
FPDF_RenderPageBitmap(bitmap, pdfpage, 0,0, image.width(), image.height(), 0, (FPDF_REVERSE_BYTE_ORDER | FPDF_LCD_TEXT));
FPDFBitmap_Destroy(bitmap);
FPDF_ClosePage(pdfpage);
qDebug()<< "Render time:" << time.elapsed();
return image;
}
#endif //USE_PDFIUM

View File

@ -4,10 +4,10 @@
#include <QObject> #include <QObject>
#include <QImage> #include <QImage>
#ifdef Q_OS_MAC #if defined Q_OS_MAC && defined USE_PDFKIT
class MacOSXPDFComic class MacOSXPDFComic
{ {
public: public:
MacOSXPDFComic(); MacOSXPDFComic();
~MacOSXPDFComic(); ~MacOSXPDFComic();
bool openComic(const QString & path); bool openComic(const QString & path);
@ -15,13 +15,30 @@ public:
unsigned int numPages(); unsigned int numPages();
QImage getPage(const int page); QImage getPage(const int page);
void releaseLastPageData(); void releaseLastPageData();
private:
private:
void * document; void * document;
void * lastPageData; void * lastPageData;
}; };
#elif defined USE_PDFIUM
#include <fpdfview.h>
class PdfiumComic
{
public:
PdfiumComic();
~PdfiumComic();
bool openComic(const QString & path);
void closeComic();
unsigned int numPages();
QImage getPage(const int page);
private:
FPDF_LIBRARY_CONFIG config;
FPDF_DOCUMENT doc;
};
#else #else
#include "poppler-qt5.h" #include "poppler-qt5.h"
#endif // Q_OS_MAC #endif // Q_OS_MAC
#endif // PDF_COMIC_H #endif // PDF_COMIC_H