Как создать PDF-документ с mupdf document_writer в C ++ - PullRequest
0 голосов
/ 17 марта 2020

Я пытаюсь создать одностраничный PDF-документ на C ++ с библиотекой MuPDF. Эта страница содержит только одно изображение (в градациях серого или RGB) размера страницы (которое фактически является обработанным изображением opencv). Я не нашел много документации по этому поводу, но я в основном основывал свой пробный код на «MuPDF исследовательский» Робин Уоттс и что еще я мог найти в исходном коде MuPDF. Единственное, что я создаю до сих пор, - это документ размером около 26 МБ (кажется, не зависящий от изображения), который отображается как пустая (белая) страница в средстве просмотра PDF (например, Просмотр в MacOS или emacs).

Кто-нибудь знает, как это можно сделать, чтобы работать? Я знаю, что изображение, которое я создаю, является правильным, потому что, если я преобразую его обратно в изображение opencv, я могу его правильно визуализировать. Может быть, fz_image сделан неправильно или я что-то упустил при записи изображения в документ?

Ниже приведен соответствующий код.

// turn cv::Mat into a pixmap
fz_pixmap * pix = NULL;
fz_image * fz_img = NULL;
int alpha = 0;
fz_try(ctx) {
  fz_colorspace * color_space = NULL;
  if (channels == 1) { color_space = fz_device_gray(ctx); }
  else  { color_space = fz_device_rgb(ctx); }
  int stride = (fz_colorspace_n(ctx, color_space) + alpha) * w;
  pix = fz_new_pixmap_with_data(ctx, color_space, w, h, NULL, 0, stride, (uchar *)(cv_img->datastart));
}
fz_catch(ctx) {
  cout << "save_doc: pixmap from cv::Mat failed! " << endl;
}
// then make an fz_image form the pixmap
fz_try(ctx) {
  fz_img = fz_new_image_from_pixmap(ctx, pix, NULL);
}
fz_catch(ctx) {
  cout << "save_doc: image from pixmap failed! " << endl;
}

// write the image to a document
fz_rect mediabox = { 0, 0, 595, 842 };
fz_document_writer * wri = NULL;
fz_device * dev = NULL;
// create a document writer, begin page and write image to page
fz_try(ctx) {
  wri = fz_new_pdf_writer(ctx, fn.c_str(),NULL);
  dev = fz_begin_page(ctx, wri, mediabox);
  fz_fill_image(ctx, dev, fz_img, fz_identity, static_cast<float>(alpha), fz_default_color_params);
  fz_end_page(ctx, wri);
}
fz_catch(ctx) {
  cout << "save_doc: page writing failed! " << endl;
}
// wrap up
fz_try(ctx) {
  fz_close_document_writer(ctx, wri);
  fz_drop_device(ctx, dev);
  fz_drop_document_writer(ctx, wri);
}
fz_catch(ctx) {
  cout << "save_doc: wrapping up failed! " << endl;
}

В настоящее время я работаю на MacOS, но цель - быть независимым от платформы.

Любая помощь будет принята с благодарностью.

...