【问题标题】:MuPDF SVG export bug?MuPDF SVG 导出错误?
【发布时间】:2023-03-08 16:22:01
【问题描述】:

我正在尝试使用 MuPDF 库将 PDF 文件导出为 SVG 数据。 我为此任务编写了以下函数:

PDFIMPORT_DECLSPEC int PDFImport::createSVGDataStr( const std::string & filenamePDF, Buffer & outputBuffer, Feedback* fbck )
{
    std::array<std::mutex, FZ_LOCK_MAX> mutexes;

    fz_locks_context lockCtx;
    lockCtx.user   = mutexes.data();
    lockCtx.lock   = lock;
    lockCtx.unlock = unlock;

    fz_document* doc = nullptr;
    fz_context* ctx = fz_new_context(NULL, &lockCtx, FZ_STORE_UNLIMITED);
    fz_register_document_handler(ctx, &pdf_document_handler);
    fz_try(ctx)
    {
        doc = fz_open_document(ctx, const_cast<char*>(filenamePDF.c_str()));
    }
    fz_catch(ctx)
    { 
        fz_free_context(ctx);
        return Error_OpenFile;
    }

    int pageCount = fz_count_pages(doc);
    if (pageCount < 1)
        return Error_Content;

    fz_page* page = fz_load_page(doc, 0);

    fz_rect brect;
    fz_bound_page(doc, page, &brect);

    fz_buffer* buffer = fz_new_buffer(ctx, 1024);
    fz_output* output = fz_new_output_with_buffer(ctx, buffer);
    fz_device* device = fz_new_svg_device(ctx, output, brect.x1 - brect.x0, brect.y1 - brect.y0);

    fz_cookie* fc = reinterpret_cast<fz_cookie*>(fbck);
    fz_run_page(doc, page, device, &fz_identity, fc);


    fz_buffer_printf(ctx, buffer, "</svg>");

    outputBuffer.data   = buffer->data;
    outputBuffer.length = buffer->len;

    fz_free_device(device);
    fz_close_output(output);
    fz_free_page(doc, page);
    fz_free_context(ctx);

    return Error_None;
}



我发现,在数据缓冲区的末尾总是缺少一个封闭的 &lt;/svg&gt; 标记。我已经使用各种 PDF 文件以及 MuPDF 1.3 和 1.5 对其进行了测试,结果相同

所以,我的问题是:我做错了还是 MuPDF SVG 设备中存在错误?有人有这方面的经验吗?
谢谢!

【问题讨论】:

    标签: c++ svg mupdf


    【解决方案1】:

    您可能会更好地将其报告为错误,我建议您访问 bugs.ghostscript.com 并在那里报告。

    【讨论】:

      【解决方案2】:

      这不是错误!您必须先关闭设备。如果不关闭它,它不会在文档末尾添加&lt;/svg&gt;。您也可以在没有缓冲区的情况下实例化输出。

      fz_rect brect;
      fz_bound_page(ctx, page, &brect);
      
      fz_output* output = fz_new_output_with_path(ctx, "output.svg", 0);
      fz_device* device = fz_new_svg_device(ctx, output, brect.x1 - brect.x0, brect.y1 - brect.y0, 0, 0);
      
      fz_run_page_contents(ctx, page, device, &fz_identity, NULL);
      
      fz_close_device(ctx, device);
      fz_close_output(ctx, output);
      
      fz_drop_output(ctx, output);
      

      【讨论】:

        猜你喜欢
        • 2013-06-25
        • 2013-07-18
        • 2013-11-12
        • 1970-01-01
        • 1970-01-01
        • 2014-05-27
        • 2016-03-04
        • 2016-05-11
        • 2012-08-22
        相关资源
        最近更新 更多