diff --git a/pdf2htmlEX/build.gradle.kts b/pdf2htmlEX/build.gradle.kts index 9def236..426704e 100644 --- a/pdf2htmlEX/build.gradle.kts +++ b/pdf2htmlEX/build.gradle.kts @@ -17,7 +17,7 @@ val portVersion = when(project.findProperty("packageVersion")) { } // https://github.com/pdf2htmlEX/pdf2htmlEX/pull/154 Hoping it will be named rc2 else /* "0.18.8.rc2" */ -> { - version = "0.18.8.rc2-beta-6" + version = "0.18.8.rc2-beta-7" "0.18.8.rc2" } } @@ -120,6 +120,7 @@ tasks.extractSrc { .patch("cflags.patch") .patch("missing-tests.patch") srcDir.patch("make-a-library.patch") + srcDir.patch("dump-image.patch") srcDir.patch("mismatched-tags.patch") } } diff --git a/pdf2htmlEX/patches/0.18.8.rc2/dump-image.patch b/pdf2htmlEX/patches/0.18.8.rc2/dump-image.patch new file mode 100644 index 0000000..97ec03d --- /dev/null +++ b/pdf2htmlEX/patches/0.18.8.rc2/dump-image.patch @@ -0,0 +1,161 @@ +--- pdf2htmlEX/src/BackgroundRenderer/SplashBackgroundRenderer.cc 2020-08-19 23:43:25.000000000 +0300 ++++ pdf2htmlEX/src/BackgroundRenderer/SplashBackgroundRenderer.cc 2023-12-27 04:19:36.091000000 +0200 +@@ -18,6 +18,8 @@ + #include "util/const.h" + + #include "SplashBackgroundRenderer.h" ++#include ++#include + + namespace pdf2htmlEX { + +@@ -124,27 +126,39 @@ + + void SplashBackgroundRenderer::embed_image(int pageno) + { +- // xmin->xmax is top->bottom +- int xmin, xmax, ymin, ymax; +-// poppler-0.84.0 hack to recover from the removal of *ModRegion tracking +-// +- auto * bitmap = getBitmap(); +- xmin = 0; +- xmax = bitmap->getWidth(); +- ymin = 0; +- ymax = bitmap->getHeight(); +-// +-// end of hack +- ++ auto * bitmap = getBitmap(); + // dump the background image only when it is not empty +- if((xmin <= xmax) && (ymin <= ymax)) ++ if(bitmap->getWidth() >= 0 && bitmap->getHeight() >= 0) + { + { + auto fn = html_renderer->str_fmt("%s/bg%x.%s", (param.embed_image ? param.tmp_dir : param.dest_dir).c_str(), pageno, format.c_str()); + if(param.embed_image) +- html_renderer->tmp_files.add((char*)fn); ++ html_renderer->tmp_files.add((const char *)fn); + +- dump_image((char*)fn, xmin, ymin, xmax, ymax); ++ SplashImageFileFormat splashImageFileFormat; ++ if(false) { } ++#ifdef ENABLE_LIBPNG ++ else if(format == "png") ++ { ++ splashImageFileFormat = splashFormatPng; ++ } ++#endif ++#ifdef ENABLE_LIBJPEG ++ else if(format == "jpg") ++ { ++ splashImageFileFormat = splashFormatJpeg; ++ } ++#endif ++ else ++ { ++ throw string("Image format not supported: ") + format; ++ } ++ ++ SplashError e = bitmap->writeImgFile(splashImageFileFormat, (const char *)fn, param.actual_dpi, param.actual_dpi); ++ if (e != splashOk) ++ { ++ throw string("Cannot write background image. SplashErrorCode: ") + std::to_string(e); ++ } + } + + double h_scale = html_renderer->text_zoom_factor() * DEFAULT_DPI / param.actual_dpi; +@@ -154,10 +168,10 @@ + auto & all_manager = html_renderer->all_manager; + + f_page << "getWidth()) ++ << " " << CSS::HEIGHT_CN << all_manager.height.install(v_scale * bitmap->getHeight()) + << "\" alt=\"\" src=\""; + + if(param.embed_image) +@@ -182,68 +196,4 @@ + } + } + +-// There might be mem leak when exception is thrown ! +-void SplashBackgroundRenderer::dump_image(const char * filename, int x1, int y1, int x2, int y2) +-{ +- int width = x2 - x1 + 1; +- int height = y2 - y1 + 1; +- if((width <= 0) || (height <= 0)) +- throw "Bad metric for background image"; +- +- FILE * f = fopen(filename, "wb"); +- if(!f) +- throw string("Cannot open file for background image " ) + filename; +- +- // use unique_ptr to auto delete the object upon exception +- unique_ptr writer; +- +- if(false) { } +-#ifdef ENABLE_LIBPNG +- else if(format == "png") +- { +- writer = unique_ptr(new PNGWriter); +- } +-#endif +-#ifdef ENABLE_LIBJPEG +- else if(format == "jpg") +- { +- writer = unique_ptr(new JpegWriter); +- } +-#endif +- else +- { +- throw string("Image format not supported: ") + format; +- } +- +- if(!writer->init(f, width, height, param.actual_dpi, param.actual_dpi)) +- throw "Cannot initialize image writer"; +- +- auto * bitmap = getBitmap(); +- assert(bitmap->getMode() == splashModeRGB8); +- +- SplashColorPtr data = bitmap->getDataPtr(); +- int row_size = bitmap->getRowSize(); +- +- vector pointers; +- pointers.reserve(height); +- SplashColorPtr p = data + y1 * row_size + x1 * 3; +- for(int i = 0; i < height; ++i) +- { +- pointers.push_back(p); +- p += row_size; +- } +- +- if(!writer->writePointers(pointers.data(), height)) +- { +- throw "Cannot write background image"; +- } +- +- if(!writer->close()) +- { +- throw "Cannot finish background image"; +- } +- +- fclose(f); +-} +- + } // namespace pdf2htmlEX + +--- pdf2htmlEX/src/BackgroundRenderer/SplashBackgroundRenderer.h 2020-08-19 23:43:25.000000000 +0300 ++++ pdf2htmlEX/src/BackgroundRenderer/SplashBackgroundRenderer.h 2023-12-27 04:06:27.693000000 +0200 +@@ -53,7 +53,6 @@ + void updateRender(GfxState *state); + + protected: +- void dump_image(const char * filename, int x1, int y1, int x2, int y2); + HTMLRenderer * html_renderer; + const Param & param; + std::string format;