26 #ifndef MLN_IO_PDF_LOAD_HH
27 # define MLN_IO_PDF_LOAD_HH
34 #include <mln/core/image/image2d.hh>
35 #include <poppler/cpp/poppler-document.h>
36 #include <poppler/cpp/poppler-page-renderer.h>
59 void load(util::array<I>& arr,
const std::string&
filename,
78 void load(util::array<I>& arr,
const std::string&
filename,
79 int first_page,
int last_page,
float dpi);
97 void load(util::array<I>& arr,
const std::string&
filename,
98 util::array<int> pages,
float dpi);
114 template <
typename I>
116 int page,
float dpi);
131 template <
typename I>
132 void load(util::array<I>& arr,
const std::string&
filename);
148 template <
typename I>
149 void load(util::array<I>& arr,
const std::string&
filename,
150 util::array<int> pages);
153 # ifndef MLN_INCLUDE_ONLY
158 template <
typename I>
159 void copy_data_argb32(I& ima,
const poppler::image& pima)
161 mln_value(I) *vima = &ima(ima.domain().pmin());
162 const unsigned char *
163 nsites = (
unsigned char *)pima.const_data()
164 + pima.width() * pima.height() * 4;
167 for (
const unsigned char *v = (
unsigned char *)pima.const_data();
168 v <
nsites; v += next, ++vima)
170 vima->red() = *(v + 2);
171 vima->green() = *(v + 1);
176 template <
typename I>
177 void copy_data_rgb24(I& ima,
const poppler::image& pima)
179 mln_value(I) *vima = &ima(ima.domain().pmin());
180 const unsigned char *
181 nsites = (
unsigned char *)pima.const_data()
182 + pima.width() * pima.height() * 3;
185 for (
const unsigned char *v = (
unsigned char *)pima.const_data();
186 v <
nsites; v += next, ++vima)
189 vima->green() = *(v + 1);
190 vima->blue() = *(v + 2);
195 template <
typename I>
196 void copy_data(I& ima,
const poppler::image& pima)
198 mln_precondition(ima.is_valid());
200 switch(pima.format())
202 case poppler::image::format_invalid:
203 case poppler::image::format_mono:
204 std::cerr <<
"Loading black and white pdf is not implemented!";
207 case poppler::image::format_rgb24:
208 copy_data_rgb24(ima, pima);
210 case poppler::image::format_argb32:
211 copy_data_argb32(ima, pima);
217 template <
typename I>
218 void extract_page(
const poppler::document* pdf,
int i,
219 util::array<I>& arr,
float dpi)
222 poppler::page*
p = pdf->create_page(i);
225 poppler::page_renderer pr;
226 if (! pr.can_render())
228 std::cerr <<
"PDF cannot be rendered! Make sure libpoppler is "
229 <<
"compiled with a render backend." << std::endl;
232 poppler::image pima = pr.render_page(p, dpi, dpi);
235 I ima(
make::box2d(pima.height(), pima.width()), 0);
236 mln_assertion(ima.is_valid());
239 internal::copy_data(ima, pima);
248 template <
typename I>
249 void load(util::array<I>& arr,
const std::string&
filename,
float dpi)
251 mln_trace(
"mln::io::pdf::load");
254 poppler::document *pdf = poppler::document::load_from_file(filename);
257 std::cerr <<
"Error: Cannot load pdf " << filename << std::endl;
261 for (
int i = 0; i < pdf->pages(); ++i)
262 internal::extract_page(pdf, i, arr, dpi);
268 template <
typename I>
269 void load(util::array<I>& arr,
const std::string& filename,
270 int first_page,
int last_page,
float dpi)
272 mln_trace(
"mln::io::pdf::load");
275 poppler::document *pdf = poppler::document::load_from_file(filename);
278 std::cerr <<
"Error: Cannot load PDF " << filename << std::endl;
282 if (first_page < 0 || first_page > (pdf->pages() - 1)
283 || last_page < 0 || last_page > (pdf->pages() - 1))
285 std::cerr <<
"Error while loading PDF: page range is not correct!"
290 for (
int i = first_page; i <= last_page; ++i)
291 internal::extract_page(pdf, i, arr, dpi);
298 template <
typename I>
299 void load(util::array<I>& arr,
const std::string& filename,
300 util::array<int> pages,
float dpi)
302 mln_trace(
"mln::io::pdf::load");
305 poppler::document *pdf = poppler::document::load_from_file(filename);
308 std::cerr <<
"Error: Cannot load PDF " << filename << std::endl;
312 for (
unsigned i = 0; i < pages.size(); ++i)
314 if (pages[i] < 0 || pages[i] > pdf->pages() - 1)
316 std::cerr <<
"Error while loading PDF: selected page "
317 << pages[i] <<
" does not exist!" << std::endl;
321 internal::extract_page(pdf, pages[i], arr, dpi);
329 template <
typename I>
330 void load(Image<I>& ima,
const std::string& filename,
334 load(arr, filename, page, page, dpi);
335 mln_assertion(arr.size() == 1);
339 template <
typename I>
340 void load(util::array<I>& arr,
const std::string& filename)
342 load(arr, filename, 300);
346 template <
typename I>
347 void load(util::array<I>& arr,
const std::string& filename,
348 util::array<int> pages)
350 load(arr, filename, pages, 300);
354 # endif // ! MLN_INCLUDE_ONLY
363 #endif // ! MLN_IO_PDF_LOAD_HH