c++ mupdf编译

本文介绍了如何编译mupdf源码,特别是当遇到glfw未找到的问题时,详细说明了编译glfw的步骤,并展示了编译完成后mupdf的目录结构。此外,还提供了将pdf页面转换为图片的C++代码示例及编译方法。

mupdf用于将pdf转化为图片

版本:/home/zjm/activemq/mupdf-1.11-source

编译 make prefix=/usr/local install
prefix后面跟的是目标目录,正常应为/usr/local/mupdf

现象:
1、无权限:用sudo
2、glfw未找到,需要自己编译glfw
编译步骤:1、在mupdf-1.11-source目录下cd ./thirdparty/glfw
2、mkdir glfw-build
cd glfw-build
cmake (glfw源码所在目录)
make
make install(可能需要sudo)
(编译时可能会遇到第三方库缺失,将错误自行百度即可)

ps:mupdf-1.11-source/thirdparty目录下包含的就是编译mupdf所用到的第三方库。我只遇到了glfw没有,若遇到别的没有,则自己进行编译。

编译结果:
/usr/local/mupdf的目录结构
├── bin
│?? ├── mujstest
│?? ├── mupdf-gl
│?? ├── mupdf-x11
│?? ├── mupdf-x11-curl
│?? ├── muraster
│?? └── mutool
├── include
│?? └── mupdf
│?? ├── fitz
│?? │?? ├── annotation.h
│?? │?? ├── archive.h
│?? │?? ├── band-writer.h
│?? │?? ├── bidi.h
│?? │?? ├── bitmap.h
│?? │?? ├── buffer.h
│?? │?? ├── colorspace.h
│?? │?? ├── compressed-buffer.h
│?? │?? ├── config.h
│??

<think>我们正在处理一个关于C++MuPDF的代码示例请求。根据之前的引用,我们知道MuPDF是一个PDF渲染库,而用户希望得到C++的示例代码。由于MuPDF主要是用C编写的,但提供了C++的接口(通过封装),我们可以展示如何使用MuPDFC++ API来打开和渲染PDF文档。 注意:MuPDFC++接口实际上是其C API的封装,因此在使用时需要包含相应的头文件并链接到MuPDF库。 以下是一个简单的C++示例,展示如何使用MuPDF打开一个PDF文件并渲染第一页到图像: ```cpp #include <iostream> #include <mupdf/fitz.h> // MuPDF的主要头文件 int main() { // 创建上下文 fz_context* ctx = fz_new_context(nullptr, nullptr, FZ_STORE_UNLIMITED); if (!ctx) { std::cerr << "Cannot create context!\n"; return 1; } // 注册PDF处理器 fz_try(ctx) { fz_register_document_handlers(ctx); } fz_catch(ctx) { std::cerr << "Cannot register document handlers: " << fz_caught_message(ctx) << std::endl; fz_drop_context(ctx); return 1; } // 打开文档 const char* filepath = "example.pdf"; fz_document* doc = nullptr; fz_try(ctx) { doc = fz_open_document(ctx, filepath); } fz_catch(ctx) { std::cerr << "Cannot open document: " << fz_caught_message(ctx) << std::endl; fz_drop_context(ctx); return 1; } // 获取页面数 int page_count = fz_count_pages(ctx, doc); std::cout << "Document has " << page_count << " pages.\n"; if (page_count > 0) { // 加载第一页 fz_page* page = fz_load_page(ctx, doc, 0); // 创建变换矩阵(单位矩阵) fz_matrix transform = fz_identity; // 设置缩放比例为72dpi(1:1) // 如果需要缩放,可以调整:例如 fz_scale(&transform, 2.0f, 2.0f); // 创建矩形区域(页面边界) fz_rect bbox; fz_bound_page(ctx, page, &bbox); // 创建一个空白图像(使用边界矩形,背景白色) fz_irect irect; fz_round_rect(&irect, &bbox); fz_pixmap* pix = fz_new_pixmap_with_bbox(ctx, fz_device_rgb(ctx), &irect, nullptr, 1); fz_clear_pixmap_with_value(ctx, pix, 0xFF); // 白色背景 // 创建渲染设备 fz_device* dev = fz_new_draw_device(ctx, transform, pix); fz_run_page(ctx, page, dev, transform, nullptr); fz_close_device(ctx, dev); fz_drop_device(ctx, dev); // 保存为PNG fz_output* out = fz_new_output_with_path(ctx, "output.png", 0); fz_write_pixmap_as_png(ctx, out, pix); fz_close_output(ctx, out); fz_drop_output(ctx, out); // 清理 fz_drop_pixmap(ctx, pix); fz_drop_page(ctx, page); } // 清理 fz_drop_document(ctx, doc); fz_drop_context(ctx); return 0; } ``` ### 代码说明 1. **上下文创建**:`fz_context`是MuPDF的核心,几乎所有操作都需要它。它管理内存、异常等。 2. **注册文档处理器**:`fz_register_document_handlers`用于支持多种文档格式(如PDF, XPS等)。 3. **打开文档**:使用`fz_open_document`打开指定路径的文档。 4. **加载页面**:使用`fz_load_page`加载指定页面(这里加载第一页,索引0)。 5. **渲染页面**: - 获取页面边界`fz_bound_page`。 - 创建一个`fz_pixmap`(图像缓冲区)用于存储渲染结果。 - 使用`fz_new_draw_device`创建一个绘制设备,然后运行页面`fz_run_page`将页面渲染到pixmap。 6. **保存图像**:将pixmap保存为PNG格式。 7. **资源释放**:MuPDF使用手动内存管理,需要显式释放资源。 ### 注意事项 - 在编译时需要链接MuPDF库(例如`-lmupdf -lmupdfthird`)。 - 异常处理:MuPDF使用类似`setjmp`/`longjmp`的异常机制,因此使用`fz_try`和`fz_catch`来捕获异常。 ### 相关问题 1. 如何编译和链接MuPDFC++程序? 2. MuPDF支持哪些文档格式? 3. 如何渲染PDF中的文本内容? 4. 如何处理PDF中的超链接或注释?</think>以下是使用C++MuPDF的示例代码,展示如何打开PDF文件并渲染页面: ```cpp #include <fitz.h> // MuPDF核心库头文件 int main() { // 1. 初始化MuPDF上下文 fz_context* ctx = fz_new_context(nullptr, nullptr, FZ_STORE_UNLIMITED); if (!ctx) { fprintf(stderr, "无法创建上下文\n"); return 1; } // 2. 注册文档处理器 (支持PDF/XPS/CBZ等) fz_register_document_handlers(ctx); // 3. 打开PDF文件 const char* filename = "document.pdf"; fz_document* doc = fz_open_document(ctx, filename); if (!doc) { fprintf(stderr, "无法打开文档: %s\n", filename); fz_drop_context(ctx); return 1; } // 4. 获取页面数量 int page_count = fz_count_pages(ctx, doc); printf("文档包含 %d 页\n", page_count); // 5. 渲染第一页 (示例) if (page_count > 0) { fz_page* page = fz_load_page(ctx, doc, 0); // 加载第一页 // 创建变换矩阵 (缩放比例1.0) fz_matrix ctm = fz_scale(1.0, 1.0); // 创建渲染设备 fz_rect bbox = fz_bound_page(ctx, page); fz_pixmap* pix = fz_new_pixmap_with_bbox(ctx, fz_device_rgb(ctx), &bbox, nullptr, 1); fz_clear_pixmap_with_value(ctx, pix, 255); // 白色背景 fz_device* dev = fz_new_draw_device(ctx, ctm, pix); fz_run_page(ctx, page, dev, ctm, nullptr); fz_close_device(ctx, dev); fz_drop_device(ctx, dev); // 6. 保存为PNG图像 fz_output* out = fz_new_output_with_path(ctx, "page1.png", 0); fz_write_pixmap_as_png(ctx, out, pix); fz_close_output(ctx, out); fz_drop_output(ctx, out); // 7. 清理资源 fz_drop_pixmap(ctx, pix); fz_drop_page(ctx, page); } // 8. 释放资源 fz_drop_document(ctx, doc); fz_drop_context(ctx); return 0; } ``` ### 关键组件说明: 1. **上下文管理** `fz_context` 是MuPDF的核心对象,管理所有内存分配和全局状态[^1]。 2. **文档处理流程** ```mermaid graph LR A[创建上下文] --> B[注册处理器] B --> C[打开文档] C --> D[加载页面] D --> E[创建渲染目标] E --> F[运行渲染设备] F --> G[保存输出] ``` 3. **渲染参数**: - `fz_matrix`:定义缩放/旋转变换 - `fz_rect`:页面边界框 - `fz_pixmap`:存储渲染结果的像素图 ### 编译注意事项: ```bash # 需要链接MuPDF库 g++ -o mupdf_example mupdf_example.cpp \ -I/path/to/mupdf/include \ -L/path/to/mupdf/lib -lmupdf -lmupdfthird ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值