首页 > 编程语言 >C++ pdf库总结

C++ pdf库总结

时间:2024-07-09 17:26:50浏览次数:17  
标签:总结 Widget render fz C++ poppler pdf include page

 mupdf
#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>
#include <QDebug>
#include <QImage>
#include <QPixmap>
#include <QLabel>
 
#include "mupdf/fitz.h"
#include "mupdf/pdf.h"
 
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
 
    char *input = const_cast< char* >("document.pdf");
    float zoom, rotate;
    int page_number, page_count;
    fz_context *ctx;
    fz_document *doc;
    fz_pixmap *pix;
    fz_matrix ctm;//第一页为0
    page_number=0;
    //100%缩放比
    zoom=;
    //旋转为0
    rotate=;
 
    //创建上下文
    ctx = fz_new_context(NULL, NULL, FZ_STORE_UNLIMITED);
    if (!ctx)
    {
        qDebug()<<stderr<<"cannot create mupdf context";
        return;
    }
 
    //注册文档控制
    fz_try(ctx)
            fz_register_document_handlers(ctx);
    fz_catch(ctx)
    {
        qDebug()<<stderr<<"cannot register document handlers:"<< fz_caught_message(ctx);
        fz_drop_context(ctx);
        return;
    }
 
    //打开文档
    fz_try(ctx)
        doc = fz_open_document(ctx, input);
    fz_catch(ctx)
    {
        qDebug()<<stderr<< "cannot open document:"<< fz_caught_message(ctx);
        fz_drop_context(ctx);
        return;
    }
 
    //取得总的页数
    fz_try(ctx)
        page_count = fz_count_pages(ctx, doc);
    fz_catch(ctx)
    {
        qDebug()<<stderr<< "cannot count number of pages:"<< fz_caught_message(ctx);
        fz_drop_document(ctx, doc);
        fz_drop_context(ctx);
        return;
    }
 
    if (page_number <  || page_number >= page_count)
    {
        qDebug()<<stderr<< "page number out of range: "<< page_number + <<"page count:"<<page_count;
        fz_drop_document(ctx, doc);
        fz_drop_context(ctx);
        return;
    }
 
    //计算缩放以及旋转
    fz_scale(&ctm, zoom / , zoom / );
    fz_pre_rotate(&ctm, rotate);
 
    //渲染pixmap
    fz_try(ctx)
        pix = fz_new_pixmap_from_page_number(ctx, doc, page_number, &ctm, fz_device_rgb(ctx), );
    fz_catch(ctx)
    {
        qDebug()<<stderr<< "cannot render page: %s\n"<< fz_caught_message(ctx);
        fz_drop_document(ctx, doc);
        fz_drop_context(ctx);
        return;
    }
 
    //渲染成图片
//   unsigned char *samples = fz_pixmap_samples(ctx, pix);
       unsigned char *samples = pix->samples;
   int width = fz_pixmap_width(ctx, pix);
   int height = fz_pixmap_height(ctx, pix);
 
   QImage image(samples, width, height,pix->stride,QImage::Format_RGB888); QLabel *label=new QLabel; label->setPixmap(QPixmap::fromImage(image)); ui->layout->addWidget(label); // if (!image.save("a.png")) { // return; // } //回收内存  fz_drop_pixmap(ctx, pix); fz_drop_document(ctx, doc); fz_drop_context(ctx); } Widget::~Widget() { delete ui; }
pdfium 
#include "src/pdfium_aux.h"
#include <iostream>
#include <filesystem>

int main(int argc, char* argv[]) 
{
	try {
		RenderPdfOptions options(argc, argv);
		if (options.invalid()) {
			std::cout << "usage:\nrender_pdf.exe inputfile.pdf [output_file.png]" << std::endl;
			return -1;
		}
		InitPdfium(options);
		ScopedFPDFDocument doc(FPDF_LoadDocument(options.inputFile().c_str(), options.password().c_str()));

		std::cout << "rendering " << std::filesystem::path(options.inputFile()).filename() << "...\n";

		auto[from_page_index, to_page_index] = options.range().get(doc.get());
		int num_pages = to_page_index - from_page_index + 1;
		for (auto index = from_page_index; index <= to_page_index; index++) {

			ScopedFPDFPage page(FPDF_LoadPage(doc.get(), index));
			auto bitmap = RenderPage(page.get(), options.scale());
			auto out_filename = options.outputFile( (num_pages > 1) ? std::optional<int>(index) : std::nullopt);
			WriteImage( bitmap.get(), options.imageFormat(), out_filename );
			std::cout << "    generated " << std::filesystem::path(out_filename).filename() << ".\n";
		}
		std::cout << "complete.\n";
	} catch (std::runtime_error e) {
		std::cout << "error: " << e.what() << std::endl;
		return -1;
	} catch (...) {
		std::cout << "error: unkown fatal error occurred" << std::endl;
		return -1;
	}

	return 0;
}
popper

#include "widget.h"
#include <QDebug>
 
 
 
 
Widget::Widget(QWidget *parent)
    : QWidget(parent),
      Cur_Page(0)
{
    int numPages = 0;
    scale = 1;
 
    document = poppler::document::load_from_file("a.pdf");
 
    Total_page = document->pages();
    qDebug() << "PDF pages: " << numPages;
 
 
 
    label = new QLabel(this);
    label->setGeometry(0,0,1024,600);
 
 
    label->setAlignment(Qt::AlignCenter);
    //label->setPixmap(QPixmap::fromImage(qimage));
    label->setVisible(true);
 
    QPushButton* prevBtn = new QPushButton(this);
    prevBtn->setText("Prev");
    prevBtn->setGeometry(910, 240, 60,100);
    connect( prevBtn, SIGNAL(pressed()), this, SLOT(onPrev()));
    QPushButton* nextBtn = new QPushButton(this);
    nextBtn->setText("Next");
    nextBtn->setGeometry(910, 340, 60,100);
    connect( nextBtn, SIGNAL(pressed()), this, SLOT(onNext()));
 
 
    QPushButton* plusBtn = new QPushButton(this);
    plusBtn->setText("+");
    plusBtn->setGeometry(910, 50, 20, 20);
    connect( plusBtn, SIGNAL(pressed()), this, SLOT(onZoomIn()));
    QPushButton* minBtn = new QPushButton(this);
    minBtn->setText("-");
    minBtn->setGeometry(940, 50, 20, 20);
    connect( minBtn, SIGNAL(pressed()), this, SLOT(onZoomOut()));
    updatePage();
 
}
 
Widget::~Widget()
{
 
}
 
void Widget::resizeEvent(QResizeEvent *event)
{
    this->setGeometry(0,0,1024,600);
}
 
 
void Widget::updatePage()
{
    poppler::page_renderer* render = new poppler::page_renderer();
    //render->set_render_hint(poppler::page_renderer::render_hint::antialiasing);
    //render->set_render_hint(poppler::page_renderer::render_hint::text_antialiasing);
 
 
    render->set_render_hints(poppler::page_renderer::render_hint::antialiasing |
                             poppler::page_renderer::render_hint::text_antialiasing
                             );
 
    poppler::page* page = document->create_page(Cur_Page);
 
    poppler::image image = render->render_page(page, 72, 72, -1,-1,-1, -1);
    qDebug() << "image format: " << image.format();
 
    int width = render->render_page(page).width();
    int height = render->render_page(page).height();
    qDebug() << "width: " << width;
    qDebug() << "height: " << height;
 
    qDebug()<< "scale: "<< scale * 100 << "\%";
    QImage qimage((uchar*)image.data(), width, height, QImage::Format::Format_ARGB32);
    qDebug() << "image format: "<<qimage.format();
    label->setPixmap(QPixmap::fromImage(qimage.scaledToWidth(width*scale)));
 
}
 
 
void Widget::onPrev()
{
    if(Cur_Page == 0)
        Cur_Page = 0;
    else
        Cur_Page--;
   //load page
    updatePage();
}
 
void Widget::onNext()
{
    if(Cur_Page == Total_page -1)
        Cur_Page = Total_page -1;
    else
        Cur_Page++;
    //load page
    updatePage();
}
 
void Widget::onZoomIn()
{
    scale += 0.15;
    updatePage();
}
 
void Widget::onZoomOut()
{
    scale -= 0.15;
    updatePage();
}
 xpdf

参考

GitHub - xiangxw/mupdf-qt: Qt5 interface of the popular PDF library MuPDF

GitHub - ylzf0000/Mini-Pdf-Reader: 一个简单的PDF阅读器,利用Qt + Mupdf

https://gitee.com/liupeng2018my/mupdf

GitHub - coolwanglu/pdf2htmlEX: Convert PDF to HTML without losing text or format.

GitHub - paulovap/qtpdfium: Pdf Redening on Qt

http://code.qt.io/qt-labs/qtpdf.git

PDFCreator - Browse /PDFCreator at SourceForge.net

https://github.com/dannyedel/dspdfviewer

https://github.com/CryFeiFei/pdfdemo

Poppler Win32 download | SourceForge.net

GitHub - CryFeiFei/Reader: Reader for PDF,use Qt5 and Poppler

https://github.com/flexpaper/pdf2image

https://github.com/flexpaper/pdf2json

GitHub - Archie3d/qpdf: PDF viewer widget for Qt


创作不易,小小的支持一下吧!

标签:总结,Widget,render,fz,C++,poppler,pdf,include,page
From: https://blog.csdn.net/qq_30220519/article/details/140299181

相关文章

  • Vue3 pdf.js将二进制文件流转成pdf预览
    好久没写东西,19年之前写过一篇Vue2将pdf二进制文件流转换成pdf文件,如果Vue2换成Vue3了,顺带来一篇文章,pdf.js这个东西用来解决内网pdf预览,是个不错的选择。首先去pdfjs官网,下载需要的文件然后将下载的东西放到public文件下接下来看一下代码<auto-dialogtitle="PDF预......
  • 背包题型总结
    概述大致分为以下几类:01背包完全背包混合背包二维背包分组背包以及一个变式:跳楼梯模型,本质是转移顺序的改变。01背包特点:无序加入,每个物品加一次。完全背包特点:无序加入,每个物品无限加。变式:跳楼梯模型:问跳完一段楼梯有多少种不同的方案数。这两者的区别就在于:......
  • C++OCR API减轻人们文字录入的负担
    曾几何时,许多大企业会设立文字录入专员的岗位。相信有不少人第一份实习工作就是录入资料,文档、发票、证件等形形色色的文件堆积如山,日积月累的敲击键盘,一张一张的录入电脑系统。这种工作是枯燥的,可以练就文字录入的速度,但是就现在的科技发展的形势来看,录入的工作还是交给OCR来......
  • C++发票识别接口轻松管理财务、发票识别sdk、增值税发票识别
    “营”“增”两种税是主流的流转税种,是两个独立而不能交叉的税种。也就是说交增值税的话就不交营业税,而交了营业税就不需要交增值税。而且,两者在征收的对象、征税范围、计税的依据、税目、税率以及征收管理等都有所不同,增值税在一些方面与营业税相比具有不少优势。营业税......
  • 推荐一款去除PDF水印的工具:PDF水印去除工具
    PDF水印去除工具是一款针对色差较大的水印进行去除,什么叫色差较大,就是水印的颜色跟你文档的颜色相差很大,这样就非常容易去除。这款软件是由吾爱的@Rongerr使用ChatGPT 4o+ Python开发的,软件是绿色免安装版本。使用方法选择需要去除水印的PDF,点击“选择PDF文件”进行选择......
  • Excel表格如何免费转成PDF的3种方法
    很多时候我们会将各种各样的文档转换成pdf的格式,然后发送给别人,因为pdf格式在阅读上既能保持很好的效果,又不会编辑到里面的内容,那么要怎么excel表格转换成pdf呢?方法一:使用Excel软件自带的“另存为”功能大多数版本的MicrosoftExcel都提供了将文档另存为PDF的功能,这是最简单直接......
  • PPT如何转换PDF格式?3种简单方法
    不知道经常需要进行演讲的小伙伴们,你们平时在制作完PPT文稿后,将文稿发送到其它设备上的时候,会不会出现格式错乱的问题呢?如果会的话也不用太过担心,我们只要将PPT文件转换为PDF格式就可以了,PDF格式的兼容性比较好。那你们知道如何将ppt转换成pdf吗?下面为大家介绍几种PPT转换PDF格式......
  • Java基础知识总结
    一、什么是JavaJava是一种高级编程语言,由SunMicrosystems公司于1995年推出。Java具有跨平台性、面向对象、健壮性、安全性、可移植性等特点,被广泛应用于企业级应用开发、移动应用开发、大数据处理、云计算等领域。Java程序可以在不同的操作系统上运行,只需编译一次,就可以在任......
  • Java知识体系总结
    IO流待整理:File、递归字节流、字节缓冲流编码表、编码方式、转换流、序列化、序列化流、打印流、commons-io网络编程网络概述、网络模型Socket原理机制资源下载:python33UDPTCP/IP协议、OSI七层协议、HTTP、HTTP2.0、HTTPS网络安全​XSS、CSRF、SQL注入、Hash......
  • 【Py/Java/C++三种语言OD独家2024D卷真题】20天拿下华为OD笔试之【前缀和/固定滑窗】2
    有LeetCode算法/华为OD考试扣扣交流群可加948025485可上欧弟OJ系统练习华子OD、大厂真题绿色聊天软件戳od1441了解算法冲刺训练(备注【CSDN】否则不通过)文章目录题目描述与示例题目描述输入描述输出描述示例一输入输出说明示例二输入输出说明解题思路贪心思想......