Qt5基于Poppler实现将pdf转成图片

本文所用库的资源:

链接:https://pan.baidu.com/s/1-F1Gu-ENuFle8wE92h-h5Q
提取码:a7tz

1,本文库和代码需要在Qt5的32位编译器上运行,如下图所示,如需64位,博主有使用vs2022基于pdfium库的另一项目可供参考(链接在这里插入图片描述

2,此工程流程基本参考另一篇博客(链接),只是在其代码的基础上做了一些修改,定制化了自己的需求。

3,所以在此博主仅贴出自己的代码,如需具体流程请参考上述链接。

最终工程架构如下图:
在这里插入图片描述
pdfutils.h

#ifndef PDFUTILS_H
#define PDFUTILS_H

#include <QObject>
#include <QImage>
#include <QDir>
#include "poppler-qt5.h"

class PdfUtils
{
public:
    explicit PdfUtils(QString filePath);
    ~PdfUtils();
    // @pdf_path: xxx.pdf
    void Pdf2Images();
    //获取指定页pdf图像(页码从0开始)
    QImage getPdfImage(int pageNumber);
private:
    QString filePath;
    int numPages;
    void getPdfInfo();
};

#endif // PDFUTILS_H

pdfutils.cpp

#include "pdfutils.h"

PdfUtils::PdfUtils(QString filePath) {
    this->filePath = filePath;
    getPdfInfo();
}

PdfUtils::~PdfUtils() {
}

// @pdf_path: xxx.pdf
void PdfUtils::Pdf2Images() {
    QString pdf_path = filePath;
    pdf_path.chop(4);
    QDir dir;
    if (!dir.exists(pdf_path))
    {
        dir.mkdir(pdf_path);
    }
    for(int i = 0 ; i < numPages ; i++)
    {
        QImage my_img = getPdfImage(i);
        my_img.save(pdf_path + "//" + pdf_path + "_" + QString::number(i, 10) + ".jpg");
    }
}

QImage PdfUtils::getPdfImage(int pageNumber) {
    QImage image;
    Poppler::Document* document = Poppler::Document::load(filePath);
    if (!document || document->isLocked()) {
        // ... error message ....
        delete document;
        return image;
    }
    // Document starts at page 0
    Poppler::Page* pdfPage = document->page(pageNumber);
    if (pdfPage == 0) {
        // ... error message ...
        return image;
    }
    // Generate a QImage of the rendered page
    image = pdfPage->renderToImage(576, 576, -1, -1, -1, -1);
    if (image.isNull()) {
        // ... error message ...
        return image;
    }
    // after the usage, the page must be deleted
    delete pdfPage;
    delete document;
    return image;
}

void PdfUtils::getPdfInfo() {
    numPages = 0;
    Poppler::Document* document = Poppler::Document::load(filePath);
    if (!document || document->isLocked()) {
        // ... error message ....
        delete document;
        return;
    }
    numPages = document->numPages();
    delete document;
}

main.cpp

#include "pdfutils.h"
#include <iostream>

int main(int argc, char *argv[])
{
    QString my_pdf_path("test.pdf");
    PdfUtils my_pdf(my_pdf_path);
    my_pdf.Pdf2Images();

    return 0;
}

最终运行效果为将pdf文件的所有页各生成一个图片,放在pdf文件的同名文件夹下,如下图所示:
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值