You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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;
}

关键修复点说明

  1. 注册文档处理程序
    必须调用fz_register_document_handlers(ctx),MuPDF的PDF读写功能依赖该函数注册对应的处理模块,缺少这一步会导致写入器内部组件未初始化,触发空指针访问。

  2. 添加错误检查
    对所有MuPDF API的返回值做校验,避免因某个步骤失败后继续使用空指针,引发连锁错误。

  3. 正确释放资源
    所有创建的fz_story、fz_buffer、fz_context等资源,都要在使用完毕后调用对应的fz_drop_*函数释放,避免内存泄漏和野指针问题。

内容的提问来源于stack exchange,提问作者Googlebot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 07:00:31