QImage PdfPlug::readThumbnail(QString fName) { QString tmp, cmd1, cmd2; QString pdfFile = QDir::toNativeSeparators(fName); QString tmpFile = QDir::toNativeSeparators(ScPaths::getTempFileDir() + "sc.png"); int ret = -1; tmp.setNum(1); QStringList args; args.append("-r72"); args.append("-sOutputFile="+tmpFile); args.append("-dFirstPage="+tmp); args.append("-dLastPage="+tmp); args.append(pdfFile); ret = callGS(args); if (ret == 0) { QImage image; image.load(tmpFile); QFile::remove(tmpFile); image.setText("XSize", QString("%1").arg(image.width())); image.setText("YSize", QString("%1").arg(image.height())); return image; } return QImage(); }
bool ScImgDataLoader_PDF::preloadAlphaChannel(const QString& fn, int page, int gsRes, bool& hasAlpha) { float xres, yres; // short resolutionunit = 0; initialize(); m_imageInfoRecord.actualPageNumber = page; hasAlpha = false; QFileInfo fi = QFileInfo(fn); if (!fi.exists()) return false; QString tmp, BBox; QString tmpFile = QDir::convertSeparators(ScPaths::getTempFileDir() + "sc.png"); QString picFile = QDir::convertSeparators(fn); QStringList args; xres = gsRes; yres = gsRes; args.append("-r"+QString::number(gsRes)); // args.append("-sOutputFile=\""+tmpFile + "\""); args.append("-sOutputFile="+tmpFile); args.append("-dFirstPage=" + QString::number(qMax(1, page))); args.append("-dLastPage=" + QString::number(qMax(1, page))); // args.append("\""+picFile+"\""); args.append(picFile); // qDebug() << "scimgdataloader_pdf(alpha):" << args; int retg = callGS(args); if (retg == 0) { m_image.load(tmpFile); QFile::remove(tmpFile); if (!ScCore->havePNGAlpha()) { QRgb *s; for( int yi=0; yi < m_image.height(); ++yi ) { s = (QRgb*)(m_image.scanLine( yi )); for(int xi=0; xi < m_image.width(); ++xi ) { if((*s) == 0xffffffff) (*s) &= 0x00ffffff; s++; } } } hasAlpha = true; return true; } return false; }
QPixmap LoadPS(QString fn , const QString arguments_append) { const QString pdfFile = convertPath(fn); QChar letter('A' + (qrand() % 26)); QDateTime timer1(QDateTime::currentDateTime()); const QString qttmpFile = _GSCACHE_+QString("%2_%1.png").arg(timer1.toString("yyyy-MM-dd-HH-mm-ss-zzz")).arg(letter); QFileInfo fitmp(qttmpFile); const int VersionGS = getGSVersion(); QFile lastaction(fitmp.absoluteFilePath()); lastaction.remove(); QPixmap pm; int ret = -1; QStringList args; if (arguments_append.size() > 3) { args.append(arguments_append); } if (VersionGS >=8) { args.append("-sDEVICE=png16m"); args.append("-dGraphicsAlphaBits=4"); args.append("-r72"); args.append("-o"); args.append(fitmp.fileName()); args.append(pdfFile); } else { args.append("-sDEVICE=pnggray"); args.append("-r72x72"); args.append("-sOutputFile="+fitmp.fileName()); args.append("-q"); args.append(pdfFile); } ret = callGS(args); //////////qDebug() << "### ret " << ret << " VersionGS->" << VersionGS; if (ret == 0) { QPixmap tmpimage(fitmp.absoluteFilePath()); lastaction.remove(); return tmpimage; } return pm; }
QPixmap LoadPDF(QString fn, int Page, int w ) { QString tmp, cmd1, cmd2; const QString pdfFile = PathConvert(fn); const QString tmpFile = PathConvert(QDir::homePath()+"/sctodaytmps.png"); const QString qttmpFile = QDir::homePath()+"/sctodaytmps.png"; QPixmap pm; tmp.setNum(Page); int ret = -1; tmp.setNum(Page); QStringList args; args.append("-sDEVICE=png16m"); args.append("-r72"); args.append("-dGraphicsAlphaBits=4"); args.append("-o"); args.append(tmpFile); args.append("-dFirstPage="+tmp); args.append("-dLastPage="+tmp); args.append(pdfFile); ret = callGS(args); ////////qDebug() << "### ret " << ret; if (ret == 0) { QPixmap tmpimage(qttmpFile); QPixmap penna = tmpimage.scaledToWidth(w); tmpimage.detach(); QFile lastaction(qttmpFile); lastaction.remove(); QPainter p; p.begin(&penna); p.setBrush(Qt::NoBrush); p.setPen(QPen(QBrush(Qt::black),2,Qt::SolidLine)); p.drawRect(0, 0, penna.width(), penna.height()); p.end(); return penna; } return pm; }
bool ScImgDataLoader_PDF::loadPicture(const QString& fn, int page, int gsRes, bool /*thumbnail*/) { QStringList args; if (!QFile::exists(fn)) return false; QString tmpFile = QDir::convertSeparators(ScPaths::getTempFileDir() + "sc.png"); QString picFile = QDir::convertSeparators(fn); float xres = gsRes; float yres = gsRes; initialize(); m_imageInfoRecord.actualPageNumber = page; m_imageInfoRecord.type = ImageTypePDF; m_imageInfoRecord.exifDataValid = false; m_imageInfoRecord.numberOfPages = 99; // FIXME #ifdef HAVE_PODOFO try { PoDoFo::PdfError::EnableDebug( false ); #if (PODOFO_VERSION == 0 && PODOFO_MINOR > 6) PoDoFo::PdfError::EnableLogging( false ); #endif #if (PODOFO_VERSION == 0 && PODOFO_MINOR == 5 && PODOFO_REVISION == 99) || PODOFO_MINOR > 5 PoDoFo::PdfMemDocument doc( fn.toLocal8Bit().data() ); #else PoDoFo::PdfDocument doc( fn.toLocal8Bit().data() ); #endif m_imageInfoRecord.numberOfPages = doc.GetPageCount(); if (page > m_imageInfoRecord.numberOfPages) { qDebug() << "Incorrect page number specified!"; m_imageInfoRecord.actualPageNumber = page = 0; } } catch(PoDoFo::PdfError& e) { qDebug() << "PoDoFo error while reading page count!"; e.PrintErrorMsg(); } #endif args.append("-r"+QString::number(gsRes)); args.append("-sOutputFile="+tmpFile); args.append("-dFirstPage=" + QString::number(qMax(1, page))); args.append("-dLastPage=" + QString::number(qMax(1, page))); args.append(picFile); // qDebug() << "scimgdataloader_pdf:" << args; int retg = callGS(args); if (retg == 0) { m_image.load(tmpFile); QFile::remove(tmpFile); if (!ScCore->havePNGAlpha()) { for( int yi=0; yi < m_image.height(); ++yi ) { QRgb *s = (QRgb*)(m_image.scanLine( yi )); for(int xi=0; xi < m_image.width(); ++xi ) { if((*s) == 0xffffffff) (*s) &= 0x00ffffff; s++; } } } m_imageInfoRecord.BBoxX = 0; m_imageInfoRecord.BBoxH = m_image.height(); m_imageInfoRecord.xres = qRound(gsRes); m_imageInfoRecord.yres = qRound(gsRes); m_imageInfoRecord.colorspace = ColorSpaceRGB; m_image.setDotsPerMeterX ((int) (xres / 0.0254)); m_image.setDotsPerMeterY ((int) (yres / 0.0254)); return true; } return false; }