首页 > 编程语言 >mupdf实用操作demo,C++操作PDF文件

mupdf实用操作demo,C++操作PDF文件

时间:2023-09-08 18:00:55浏览次数:44  
标签:mupdf demo fz ctx C++ 编译 pdf PDF

前文:

最近有个项目,需要读写PDF,本来想着挺简单的,读写PDF有那么多的库可以使用,唰唰的就完成了。

忘记了我写C++的,还是在国产系统上开发的。

所以一般的东西还不好使,因为项目需要在多个架构的电脑上使用,所以必须要开源,还要支持读写才行。

 

找了很多个PDF库(libharu、mupdf、pdfium、pdflib)等,各种问题(找不到文档,不满足需求)等,好想有人能救救我。

这里不得不提的是  libharu 这个库很好使,简单,有文档,用的人多,唯一的不足是:只能写PDF文件,不支持读取PDF文件,看官方的意思,现在不支持,以后也不会支持,小小的遗憾。

有问题,找领导,嘿嘿,头天晚上提出问题,第二天上午就给了我 pdflib 和 mupdf 两个编译好的PDF库,可惜没文档,看接口猜着来用

pdflib非开源库,用的时候发现是个阉割版,只能读文件,无法写文件,哦豁一天结束了

mupdf开源库,久闻大名,功能齐全,可读可写,就是不好编译,调用复杂,反正现在有现成的编译好的库,那就直接使用呗,嘿,发现又是一个阉割版,很多接口调用不了,直接报错,跑不下去,哦豁,一天又结束了。

 

唉,求人不如求己,莫急,静下心来自己研究吧。

想着mupdf功能挺全的,就这个吧,就是有点大。

 

正文:

一、下载编译

mupdf 官网(我下载的是 mupdf-1.23.2-source.tar.gz 这个版本):https://www.mupdf.com/

不知道怎么编译,百度,忘记从哪里百度来的了,编译很简单,解压,然后直接 make,等待一会,会看到一个报错,缺个驱动,直接使用 apt 来安装就可以了,也可以忽略这个报错,这个不影响的,编译出来的库可以直接使用。

*:解压出来就是这样的

*:头文件在 include 文件夹

*:编译出来的库是静态库,在 build 文件夹,如下图

*:链接库使用的时候,这4个库都需要用到

 

                       

 

 

 

 

二、使用前的唠叨

我的项目文件夹长这个样子,写个demo而已,比较乱也没有关系。编写Makefile,使用g++来编译。

 

 

 

 

三、示例代码

/**
 * 添加一张图片到PDF的指定位置
 * 加载一张图片,作为注释,添加到PDF的指定位置
*/
void addImageToPdf()
{
    fz_context *ctx =  fz_new_context(NULL, NULL, FZ_STORE_DEFAULT);
    pdf_document *doc = pdf_open_document(ctx, "456.pdf");
    pdf_page *page = pdf_load_page(ctx, doc, 0);
    fz_image *image = fz_new_image_from_file(ctx, "2.jpg");
    pdf_annot *annot = pdf_create_annot(ctx, page, PDF_ANNOT_SQUARE);

    // point 1 必须要小于 point 2,不然两个点的坐标会对调 
    int x = 100;
    int y = pdf_bound_page(ctx, page, FZ_MEDIA_BOX).y1-300;
    fz_rect rect = fz_make_rect(x, y, x+100,y+100);
    // cout << "rect rect:" << rect.x0 << " - " << rect.y0 << " - "<< rect.x1 << " - "<< rect.y1 << endl;

    pdf_set_annot_rect(ctx, annot, rect);
    pdf_set_annot_stamp_image(ctx, annot, image);

    pdf_write_options ops = pdf_default_write_options;
    pdf_save_document(ctx, doc, "test.pdf", &ops);

    fz_drop_image(ctx, image);
    pdf_drop_annot(ctx, annot);
    pdf_drop_page_tree(ctx, doc);
    pdf_drop_document(ctx, doc);
    fz_drop_context(ctx);
}

 

/**
 * 拆分PDF
 * 将一个PDF文件,按页数拆分成多个png图片
 * 支持设置dpi,如下demo示例是300dpi
*/
void splitPdfToPng()
{
    fz_context* ctx =  fz_new_context(NULL, NULL, FZ_STORE_DEFAULT);
    fz_register_document_handlers(ctx);
    fz_document* doc =  fz_open_document(ctx, "123.pdf");

    int num = fz_count_pages(ctx, doc);
    cout << "page:" << num << endl;

    float zoom = (float)300 / (float)72;
    fz_matrix ctm = fz_scale(zoom, zoom);
    for(int i=0; i<num; i++)
    {
        string fileName = "./image/" + to_string(i) + ".png";
        fz_pixmap* pix = fz_new_pixmap_from_page_number(ctx, doc, i, ctm, fz_device_rgb(ctx), 0);
        fz_save_pixmap_as_png(ctx, pix, fileName.c_str());
        fz_drop_pixmap(ctx, pix);
    }
    
    fz_drop_document(ctx, doc);
    fz_drop_context(ctx);
}

 

 

 

 

*:网上基本搜不到一个好的文档,大多都是转载,或者压根搜不到,沮丧。

mupdf这个开源库感觉大家的需求都是拆分PDF保存成图片,这个一搜一大堆,虽然代码跑不起来。不过还是很感谢,最少知道了应该去哪个头文件查接口。

然后只写了两个简单的demo,希望能帮助到大家

 

标签:mupdf,demo,fz,ctx,C++,编译,pdf,PDF
From: https://www.cnblogs.com/shiyixirui/p/17688240.html

相关文章

  • 导入Demo工程
            ......
  • 导入Demo数据
              ......
  • C++系列十:MFC
    目录前言:Helloworld:前言:仅是简单了解,运行,看看是啥。环境:Helloworld:......
  • linux c++ tcp
    1.TCP/IP协议栈链路层:负责下图所示物理链接标准IP层(网络层):选择合适的路径传输数据,无法解决数据传输错误问题,所以需要TCP/UDP协议作为保障TCP/UDP(传输层):IP层(网络层)解决传输路径问题,确定了路径,就进行传输数据,IP层只关注一个数据包如何进行传输,至于传输过程数据包是否损坏,传输......
  • C++ 归并排序
    #include<iostream>#include<vector>usingnamespacestd;///合并voidmerge(vector<int>&nums,intl1,intr1,intl2,intr2,vector<int>&tmp){ intleft=l1,right=r2;intk=l1;while(l1<=r1&&......
  • Androidstudio现有文件中添加C、C++文件 (NDK)
    创建新的C/C++源代码文件1.如果应用的主源代码集内还没有cpp/目录,请按如下所示的方法创建一个:1.1打开AndroidStudio左侧的Project窗格,然后从菜单中选择Project视图。1.2依次选择your-module>src。1.3右键点击main目录,然后依次选择New>Dire......
  • 线程安全的队列:使用Monitor模式和C++11多线程库
    线程安全的队列:使用Monitor模式和C++11多线程库引言在多线程编程中,数据共享是一个关键的问题。如果多个线程需要访问同一个数据结构,不正确的管理会导致数据不一致甚至程序崩溃。本文将介绍如何使用C++11的多线程库和Monitor模式来实现一个线程安全的队列。Monitor模式Monitor模式......
  • 超全60000多字详解 14 种设计模式 (多图+代码+总结+Demo)
    超全60000多字详解14种设计模式(多图+代码+总结+Demo)之前读耗子叔文章时,看到过有句话没有实践,再多的理论都是扯淡,个人很赞同。你觉得自己学会了,但实践与学会之间有着很大差别。单例模式(SingletonPattern)定义或概念单例模式:保证一个类仅有一个实例,并提供一个访问的全局访......
  • effective c++笔记
    一.截图1. public继承,No32,Pg155 2.不重定义继承而来的缺省参数值,No37,Pg183 ......
  • C++中的多态和虚函数
    #include<iostream>usingnamespacestd;//基类PeopleclassPeople{public:People(char*name,intage);voiddisplay();protected:char*m_name;intm_age;};People::People(char*name,int......