Я пытаюсь экспортировать PDF-файл как данные SVG, используя библиотеку MuPDF.
Я написал следующую функцию для этой задачи:
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;
}
То, что я обнаружил, это то, что там всегда отсутствует вложение </svg>
тег в конце буфера данных. Я проверил это с различными файлами PDF и с MuPDF 1.3 и 1.5 с тем же результатом
Итак, мой вопрос: я делаю это неправильно или есть ошибка в устройстве MuPDF SVG? Есть кто-нибудь опыт с этим?
Спасибо!
Вы, вероятно, будете лучше сообщать об этом как об ошибке, я бы посоветовал вам зайти на bugs.ghostscript.com и сообщить об этом там.