Skip to content

Commit f7aee77

Browse files
committed
draft delayed background rendering
1 parent 3eccf47 commit f7aee77

File tree

4 files changed

+70
-57
lines changed

4 files changed

+70
-57
lines changed

pdf2htmlEX/src/BackgroundRenderer/SplashBackgroundRenderer.cc

Lines changed: 41 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -111,66 +111,54 @@ bool SplashBackgroundRenderer::render_page(PDFDoc * doc, int pageno)
111111
(!(param.use_cropbox)),
112112
false, false,
113113
nullptr, nullptr, &annot_cb, &process_annotation);
114+
115+
auto * bitmap = getBitmap();
116+
117+
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());
118+
if(param.embed_image)
119+
html_renderer->tmp_files.add((const char *)fn);
120+
121+
SplashImageFileFormat splashImageFileFormat;
122+
if(format == "png")
123+
splashImageFileFormat = splashFormatPng;
124+
else if(format == "jpg")
125+
splashImageFileFormat = splashFormatJpeg;
126+
else
127+
throw string("Image format not supported: ") + format;
128+
129+
SplashError e = bitmap->writeImgFile(splashImageFileFormat, (const char *)fn, param.actual_dpi, param.actual_dpi);
130+
if (e != splashOk)
131+
throw string("Cannot write background image. SplashErrorCode: ") + std::to_string(e);
132+
114133
return true;
115134
}
116135

117136
void SplashBackgroundRenderer::embed_image(int pageno)
118137
{
119-
auto * bitmap = getBitmap();
120-
// dump the background image only when it is not empty
121-
if(bitmap->getWidth() >= 0 && bitmap->getHeight() >= 0)
138+
auto & f_page = *(html_renderer->f_curpage);
139+
140+
f_page << "<img class=\"" << CSS::FULL_BACKGROUND_IMAGE_CN
141+
<< "\" alt=\"\" src=\"";
142+
143+
if(param.embed_image)
144+
{
145+
auto path = html_renderer->str_fmt("%s/bg%x.%s", param.tmp_dir.c_str(), pageno, format.c_str());
146+
ifstream fin((char*)path, ifstream::binary);
147+
if(!fin)
148+
throw string("Cannot read background image ") + (char*)path;
149+
150+
auto iter = FORMAT_MIME_TYPE_MAP.find(format);
151+
if(iter == FORMAT_MIME_TYPE_MAP.end())
152+
throw string("Image format not supported: ") + format;
153+
154+
string mime_type = iter->second;
155+
f_page << "data:" << mime_type << ";base64," << Base64Stream(fin);
156+
}
157+
else
122158
{
123-
{
124-
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());
125-
if(param.embed_image)
126-
html_renderer->tmp_files.add((const char *)fn);
127-
128-
SplashImageFileFormat splashImageFileFormat;
129-
if(format == "png")
130-
splashImageFileFormat = splashFormatPng;
131-
else if(format == "jpg")
132-
splashImageFileFormat = splashFormatJpeg;
133-
else
134-
throw string("Image format not supported: ") + format;
135-
136-
SplashError e = bitmap->writeImgFile(splashImageFileFormat, (const char *)fn, param.actual_dpi, param.actual_dpi);
137-
if (e != splashOk)
138-
throw string("Cannot write background image. SplashErrorCode: ") + std::to_string(e);
139-
}
140-
141-
double h_scale = html_renderer->text_zoom_factor() * DEFAULT_DPI / param.actual_dpi;
142-
double v_scale = html_renderer->text_zoom_factor() * DEFAULT_DPI / param.actual_dpi;
143-
144-
auto & f_page = *(html_renderer->f_curpage);
145-
auto & all_manager = html_renderer->all_manager;
146-
147-
f_page << "<img class=\"" << CSS::BACKGROUND_IMAGE_CN
148-
<< " " << CSS::LEFT_CN << all_manager.left.install(0.0L)
149-
<< " " << CSS::BOTTOM_CN << all_manager.bottom.install(0.0L)
150-
<< " " << CSS::WIDTH_CN << all_manager.width.install(h_scale * bitmap->getWidth())
151-
<< " " << CSS::HEIGHT_CN << all_manager.height.install(v_scale * bitmap->getHeight())
152-
<< "\" alt=\"\" src=\"";
153-
154-
if(param.embed_image)
155-
{
156-
auto path = html_renderer->str_fmt("%s/bg%x.%s", param.tmp_dir.c_str(), pageno, format.c_str());
157-
ifstream fin((char*)path, ifstream::binary);
158-
if(!fin)
159-
throw string("Cannot read background image ") + (char*)path;
160-
161-
auto iter = FORMAT_MIME_TYPE_MAP.find(format);
162-
if(iter == FORMAT_MIME_TYPE_MAP.end())
163-
throw string("Image format not supported: ") + format;
164-
165-
string mime_type = iter->second;
166-
f_page << "data:" << mime_type << ";base64," << Base64Stream(fin);
167-
}
168-
else
169-
{
170-
f_page << (char*)html_renderer->str_fmt("bg%x.%s", pageno, format.c_str());
171-
}
172-
f_page << "\"/>";
159+
f_page << (char*)html_renderer->str_fmt("bg%x.%s", pageno, format.c_str());
173160
}
161+
f_page << "\"/>";
174162
}
175163

176164
} // namespace pdf2htmlEX

pdf2htmlEX/src/HTMLRenderer/HTMLRenderer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ struct HTMLRenderer : OutputDev
8080

8181
void process(PDFDoc * doc);
8282

83+
bool renderPage(PDFDoc * doc, int pageno);
84+
8385
////////////////////////////////////////////////////
8486
// OutputDev interface
8587
////////////////////////////////////////////////////

pdf2htmlEX/src/HTMLRenderer/general.cc

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,21 @@ void HTMLRenderer::process(PDFDoc *doc)
190190
cerr << endl;
191191
}
192192

193+
bool HTMLRenderer::renderPage(PDFDoc *doc, int pageno)
194+
{
195+
if (bg_renderer->render_page(cur_doc, pageNum))
196+
{
197+
return true;
198+
}
199+
else if (fallback_bg_renderer)
200+
{
201+
if (fallback_bg_renderer->render_page(cur_doc, pageNum))
202+
return true;
203+
}
204+
205+
return false;
206+
}
207+
193208
void HTMLRenderer::setDefaultCTM(const double *ctm)
194209
{
195210
memcpy(default_ctm, ctm, sizeof(default_ctm));
@@ -243,14 +258,21 @@ void HTMLRenderer::endPage() {
243258

244259
if(param.process_nontext)
245260
{
246-
if (bg_renderer->render_page(cur_doc, pageNum))
261+
if (param.delay_background)
247262
{
248263
bg_renderer->embed_image(pageNum);
249264
}
250-
else if (fallback_bg_renderer)
265+
else
251266
{
252-
if (fallback_bg_renderer->render_page(cur_doc, pageNum))
253-
fallback_bg_renderer->embed_image(pageNum);
267+
if (bg_renderer->render_page(cur_doc, pageNum))
268+
{
269+
bg_renderer->embed_image(pageNum);
270+
}
271+
else if (fallback_bg_renderer)
272+
{
273+
if (fallback_bg_renderer->render_page(cur_doc, pageNum))
274+
fallback_bg_renderer->embed_image(pageNum);
275+
}
254276
}
255277
}
256278

pdf2htmlEX/src/Param.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ struct Param
4646
int printing;
4747
int fallback;
4848
int tmp_file_size_limit;
49+
int delay_background;
4950

5051
// fonts
5152
int embed_external_font;

0 commit comments

Comments
 (0)