00001 #include "pdfpager.h"
00002 #include "common.h"
00003
00004 PDFPager::PDFPager() :
00005 pdf(NULL),
00006 pageRange(this),
00007 m_pageNum(-1),
00008 m_renderSize(600,600)
00009 {
00010 }
00011
00012 void PDFPager::openPDF(QString fpath)
00013 {
00014 m_path = fpath;
00015 pdf = Poppler::Document::load(fpath);
00016 if (!pdf || pdf->isLocked())
00017 {
00019 delete pdf;
00020 pdf = NULL;
00021 return;
00022 }
00023 qDebug("open pdf success");
00024 int pages = pdf->numPages();
00025 emit opened(fpath, pages);
00026 emit numPages(pages);
00027 for (int p = 0; p < pages; ++p)
00028 {
00029 Poppler::Page* pdfPage = pdf->page(p);
00030 if (pdfPage)
00031 emit thumbnail(p, pdfPage->thumbnail(), pdfPage->label());
00032 }
00033 page(0);
00034 pageRange.setRange(0, pages - 1);
00035 }
00036
00037 void PDFPager::page(int pnum)
00038 {
00039 if (pnum < 0)
00040 return;
00041
00042 m_pageNum = pnum;
00043 render(pnum);
00044 }
00045
00046 void PDFPager::renderSize(QSize s)
00047 {
00048 qDebug("renderSize(%d x %d)", s.width(), s.height());
00049 m_renderSize = s;
00050 page(m_pageNum);
00051 }
00052
00053 void PDFPager::render(int pnum, QSize renderSize)
00054 {
00055
00056 if (pnum >= pdf->numPages())
00057 return;
00058 if (!renderSize.isValid())
00059 renderSize = m_renderSize;
00060 emit rendering(true);
00061
00062 if (!pdf)
00063 return;
00064 Poppler::Page* pdfPage = pdf->page(pnum);
00065 if (!pdfPage)
00066 {
00067
00068 emit rendering(false);
00069 return;
00070 }
00071
00072
00073 double res = MIN(((double)(renderSize.width())) /
00074 (pdfPage->pageSizeF().width() / 72.0),
00075 ((double)(renderSize.height())) /
00076 (pdfPage->pageSizeF().height() / 72.0));
00077
00078
00079
00080
00081
00085 res = 72.0;
00086
00087 QImage image = pdfPage->renderToImage(res, res);
00088 if (image.isNull())
00089 {
00090
00091 emit rendering(false);
00092 return;
00093 }
00094
00095
00096 emit pageChanged(pnum);
00097 QString label = pdfPage->label();
00098 if (label.isEmpty())
00099 label = QString::number(pnum);
00100 emit pageChanged(label);
00101 renderDone(pnum, image);
00102 QList<Poppler::TextBox*> textBoxen = pdfPage->textList();
00103 QStringList strings;
00104 foreach(Poppler::TextBox* box, textBoxen)
00105 strings << box->text();
00106 m_text = strings.join(" ");
00107
00108 emit pageText(textBoxen);
00109
00110
00111
00112 delete pdfPage;
00113 }
00114
00115 void PDFPager::renderDone(int pnum, QImage pm)
00116 {
00117 emit rendered(pnum, pm);
00118 emit rendering(false);
00119 }