使用MuPDF C API将PDF写入缓冲区触发SIGSEGV错误求助
问题分析与修复
你的代码在调用fz_close_document_writer时触发段错误,核心原因是未注册MuPDF的文档处理程序,导致PDF写入器的内部依赖结构未正确初始化,最终在追加数据时访问空指针。另外代码缺少资源释放和错误检查,也会加剧内存问题。
修复后的代码
#include <mupdf/fitz.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char **argv) { fz_matrix ctm; ctm = fz_scale(1, 1); ctm = fz_pre_rotate(ctm, 0); // 创建上下文并注册文档处理程序,这是关键修复点 fz_context *ctx = fz_new_context(NULL, NULL, FZ_STORE_UNLIMITED); if (!ctx) { fprintf(stderr, "Failed to create context\n"); return 1; } fz_register_document_handlers(ctx); fz_buffer *output = fz_new_buffer(ctx, 0); if (!output) { fprintf(stderr, "Failed to create output buffer\n"); fz_drop_context(ctx); return 1; } fz_document_writer *wri = fz_new_document_writer_with_buffer(ctx, output, "pdf", NULL); if (!wri) { fprintf(stderr, "Failed to create document writer\n"); fz_drop_buffer(ctx, output); fz_drop_context(ctx); return 1; } fz_rect mediabox = {0, 0, 600, 800}; fz_device *begin = fz_begin_page(ctx, wri, mediabox); if (!begin) { fprintf(stderr, "Failed to begin page\n"); fz_close_document_writer(ctx, wri); fz_drop_buffer(ctx, output); fz_drop_context(ctx); return 1; } fz_rect where = {50, 50, 250, 250}; const char *html = "<h1>Hello World!</h1>"; fz_buffer *buf = fz_new_buffer(ctx, 0); if (!buf) { fprintf(stderr, "Failed to create html buffer\n"); fz_end_page(ctx, wri); fz_close_document_writer(ctx, wri); fz_drop_buffer(ctx, output); fz_drop_context(ctx); return 1; } fz_append_string(ctx, buf, html); fz_story *story = fz_new_story(ctx, buf, NULL, 12.0, NULL); if (!story) { fprintf(stderr, "Failed to create story\n"); fz_drop_buffer(ctx, buf); fz_end_page(ctx, wri); fz_close_document_writer(ctx, wri); fz_drop_buffer(ctx, output); fz_drop_context(ctx); return 1; } int out = fz_place_story(ctx, story, where, &where); fz_draw_story(ctx, story, begin, ctm); // 释放story和HTML缓冲区 fz_drop_story(ctx, story); fz_drop_buffer(ctx, buf); fz_end_page(ctx, wri); fz_close_document_writer(ctx, wri); // 可选:将缓冲区数据写入文件 // FILE *f = fopen("output.pdf", "wb"); // if (f) { // fwrite(fz_buffer_data(ctx, output), 1, fz_buffer_size(ctx, output), f); // fclose(f); // } // 释放剩余资源 fz_drop_buffer(ctx, output); fz_drop_context(ctx); return 0; }
关键修复点说明
注册文档处理程序
必须调用fz_register_document_handlers(ctx),MuPDF的PDF读写功能依赖该函数注册对应的处理模块,缺少这一步会导致写入器内部组件未初始化,触发空指针访问。添加错误检查
对所有MuPDF API的返回值做校验,避免因某个步骤失败后继续使用空指针,引发连锁错误。正确释放资源
所有创建的fz_story、fz_buffer、fz_context等资源,都要在使用完毕后调用对应的fz_drop_*函数释放,避免内存泄漏和野指针问题。
内容的提问来源于stack exchange,提问作者Googlebot
相关产品推荐
相关产品推荐

