From d38697d890bf0d6e918fac8c62749c0b1a141330 Mon Sep 17 00:00:00 2001 From: Lu Wang Date: Mon, 28 Jan 2013 18:46:44 +0800 Subject: [PATCH] refactor file objects --- share/manifest | 7 ++++ src/HTMLRenderer/HTMLRenderer.h | 7 +++- src/HTMLRenderer/TextLineBuffer.cc | 2 +- src/HTMLRenderer/draw.cc | 26 ++++++------- src/HTMLRenderer/export.cc | 58 ++++++++++++++-------------- src/HTMLRenderer/general.cc | 62 +++++++++++++++--------------- src/HTMLRenderer/link.cc | 38 +++++++++--------- 7 files changed, 105 insertions(+), 95 deletions(-) diff --git a/share/manifest b/share/manifest index 6be8300..abffd73 100644 --- a/share/manifest +++ b/share/manifest @@ -39,6 +39,13 @@ new pdf2htmlEX.Viewer('pdf-main'); +
+""" + +$outlines + +""" +
""" diff --git a/src/HTMLRenderer/HTMLRenderer.h b/src/HTMLRenderer/HTMLRenderer.h index 59f17b3..09e6ec9 100644 --- a/src/HTMLRenderer/HTMLRenderer.h +++ b/src/HTMLRenderer/HTMLRenderer.h @@ -428,8 +428,11 @@ class HTMLRenderer : public OutputDev std::map left_map; const Param * param; - std::ofstream html_fout, css_fout; - std::string html_path, css_path; + + struct { + std::ofstream fs; + std::string path; + } f_pages, f_css, f_outlines; static const std::string MANIFEST_FILENAME; }; diff --git a/src/HTMLRenderer/TextLineBuffer.cc b/src/HTMLRenderer/TextLineBuffer.cc index 4c17afe..7fefea5 100644 --- a/src/HTMLRenderer/TextLineBuffer.cc +++ b/src/HTMLRenderer/TextLineBuffer.cc @@ -83,7 +83,7 @@ void HTMLRenderer::TextLineBuffer::flush(void) max_ascent = max(max_ascent, s.ascent * s.draw_font_size); } - ostream & out = renderer->html_fout; + ostream & out = renderer->f_pages.fs; out << "
0) html_fout << ' '; + if(i > 0) f_pages.fs << ' '; double lw = line_width_array[i] * scale; - html_fout << round(lw); - if(is_positive(lw)) html_fout << "px"; + f_pages.fs << round(lw); + if(is_positive(lw)) f_pages.fs << "px"; } - html_fout << ";"; + f_pages.fs << ";"; } else { - html_fout << "border:none;"; + f_pages.fs << "border:none;"; } if(fill_color) { - html_fout << "background-color:" << (*fill_color) << ";"; + f_pages.fs << "background-color:" << (*fill_color) << ";"; } else { - html_fout << "background-color:transparent;"; + f_pages.fs << "background-color:transparent;"; } if(style_function) { - style_function(style_function_data, html_fout); + style_function(style_function_data, f_pages.fs); } - html_fout << "bottom:" << round(y) << "px;" + f_pages.fs << "bottom:" << round(y) << "px;" << "left:" << round(x) << "px;" << "width:" << round(w * scale) << "px;" << "height:" << round(h * scale) << "px;"; - html_fout << "\">
"; + f_pages.fs << "\">
"; } diff --git a/src/HTMLRenderer/export.cc b/src/HTMLRenderer/export.cc index ef69417..148f741 100644 --- a/src/HTMLRenderer/export.cc +++ b/src/HTMLRenderer/export.cc @@ -20,7 +20,7 @@ namespace pdf2htmlEX { void HTMLRenderer::export_remote_font(const FontInfo & info, const string & suffix, const string & fontfileformat, GfxFont * font) { - css_fout << "@font-face{" + f_css.fs << "@font-face{" << "font-family:f" << info.id << ";" << "src:url("; @@ -32,15 +32,15 @@ void HTMLRenderer::export_remote_font(const FontInfo & info, const string & suff ifstream fin(path, ifstream::binary); if(!fin) throw "Cannot locate font file: " + path; - css_fout << "'data:font/" + fontfileformat + ";base64," << base64stream(fin) << "'"; + f_css.fs << "'data:font/" + fontfileformat + ";base64," << base64stream(fin) << "'"; } else { - css_fout << (char*)fn; + f_css.fs << (char*)fn; } } - css_fout << ")" + f_css.fs << ")" << "format(\"" << fontfileformat << "\");" << "}" // end of @font-face << ".f" << info.id << "{" @@ -66,45 +66,45 @@ static string general_font_family(GfxFont * font) // TODO: this function is called when some font is unable to process, may use the name there as a hint void HTMLRenderer::export_remote_default_font(long long fn_id) { - css_fout << ".f" << fn_id << "{font-family:sans-serif;visibility:hidden;}" << endl; + f_css.fs << ".f" << fn_id << "{font-family:sans-serif;visibility:hidden;}" << endl; } void HTMLRenderer::export_local_font(const FontInfo & info, GfxFont * font, const string & original_font_name, const string & cssfont) { - css_fout << ".f" << info.id << "{"; - css_fout << "font-family:" << ((cssfont == "") ? (original_font_name + "," + general_font_family(font)) : cssfont) << ";"; + f_css.fs << ".f" << info.id << "{"; + f_css.fs << "font-family:" << ((cssfont == "") ? (original_font_name + "," + general_font_family(font)) : cssfont) << ";"; string fn = original_font_name; for(auto iter = fn.begin(); iter != fn.end(); ++iter) *iter = tolower(*iter); if(font->isBold() || (fn.find("bold") != string::npos)) - css_fout << "font-weight:bold;"; + f_css.fs << "font-weight:bold;"; else - css_fout << "font-weight:normal;"; + f_css.fs << "font-weight:normal;"; if(fn.find("oblique") != string::npos) - css_fout << "font-style:oblique;"; + f_css.fs << "font-style:oblique;"; else if(font->isItalic() || (fn.find("italic") != string::npos)) - css_fout << "font-style:italic;"; + f_css.fs << "font-style:italic;"; else - css_fout << "font-style:normal;"; + f_css.fs << "font-style:normal;"; - css_fout << "line-height:" << round(info.ascent - info.descent) << ";"; + f_css.fs << "line-height:" << round(info.ascent - info.descent) << ";"; - css_fout << "visibility:visible;"; + f_css.fs << "visibility:visible;"; - css_fout << "}" << endl; + f_css.fs << "}" << endl; } void HTMLRenderer::export_font_size (long long fs_id, double font_size) { - css_fout << ".s" << fs_id << "{font-size:" << round(font_size) << "px;}" << endl; + f_css.fs << ".s" << fs_id << "{font-size:" << round(font_size) << "px;}" << endl; } void HTMLRenderer::export_transform_matrix (long long tm_id, const double * tm) { - css_fout << ".t" << tm_id << "{"; + f_css.fs << ".t" << tm_id << "{"; // always ignore tm[4] and tm[5] because // we have already shifted the origin @@ -114,7 +114,7 @@ void HTMLRenderer::export_transform_matrix (long long tm_id, const double * tm) { auto prefixes = {"", "-ms-", "-moz-", "-webkit-", "-o-"}; for(auto iter = prefixes.begin(); iter != prefixes.end(); ++iter) - css_fout << *iter << "transform:none;"; + f_css.fs << *iter << "transform:none;"; } else { @@ -122,53 +122,53 @@ void HTMLRenderer::export_transform_matrix (long long tm_id, const double * tm) for(auto iter = prefixes.begin(); iter != prefixes.end(); ++iter) { // PDF use a different coordinate system from Web - css_fout << *iter << "transform:matrix(" + f_css.fs << *iter << "transform:matrix(" << round(tm[0]) << ',' << round(-tm[1]) << ',' << round(-tm[2]) << ',' << round(tm[3]) << ','; - css_fout << "0,0);"; + f_css.fs << "0,0);"; } } - css_fout << "}" << endl; + f_css.fs << "}" << endl; } void HTMLRenderer::export_letter_space (long long ls_id, double letter_space) { - css_fout << ".l" << ls_id << "{letter-spacing:" << round(letter_space) << "px;}" << endl; + f_css.fs << ".l" << ls_id << "{letter-spacing:" << round(letter_space) << "px;}" << endl; } void HTMLRenderer::export_word_space (long long ws_id, double word_space) { - css_fout << ".w" << ws_id << "{word-spacing:" << round(word_space) << "px;}" << endl; + f_css.fs << ".w" << ws_id << "{word-spacing:" << round(word_space) << "px;}" << endl; } void HTMLRenderer::export_color (long long color_id, const GfxRGB * rgb) { - css_fout << ".c" << color_id << "{color:" << (*rgb) << ";}" << endl; + f_css.fs << ".c" << color_id << "{color:" << (*rgb) << ";}" << endl; } void HTMLRenderer::export_whitespace (long long ws_id, double ws_width) { if(ws_width > 0) - css_fout << "._" << ws_id << "{display:inline-block;width:" << round(ws_width) << "px;}" << endl; + f_css.fs << "._" << ws_id << "{display:inline-block;width:" << round(ws_width) << "px;}" << endl; else - css_fout << "._" << ws_id << "{display:inline;margin-left:" << round(ws_width) << "px;}" << endl; + f_css.fs << "._" << ws_id << "{display:inline;margin-left:" << round(ws_width) << "px;}" << endl; } void HTMLRenderer::export_rise (long long rise_id, double rise) { - css_fout << ".r" << rise_id << "{top:" << round(-rise) << "px;}" << endl; + f_css.fs << ".r" << rise_id << "{top:" << round(-rise) << "px;}" << endl; } void HTMLRenderer::export_height (long long height_id, double height) { - css_fout << ".h" << height_id << "{height:" << round(height) << "px;}" << endl; + f_css.fs << ".h" << height_id << "{height:" << round(height) << "px;}" << endl; } void HTMLRenderer::export_left (long long left_id, double left) { - css_fout << ".L" << left_id << "{left:" << round(left) << "px;}" << endl; + f_css.fs << ".L" << left_id << "{left:" << round(left) << "px;}" << endl; } } diff --git a/src/HTMLRenderer/general.cc b/src/HTMLRenderer/general.cc index f588f1b..801345f 100644 --- a/src/HTMLRenderer/general.cc +++ b/src/HTMLRenderer/general.cc @@ -89,10 +89,10 @@ void HTMLRenderer::process(PDFDoc *doc) if(param->split_pages) { auto page_fn = str_fmt("%s/%s%d.page", param->dest_dir.c_str(), param->output_filename.c_str(), i); - html_fout.open((char*)page_fn, ofstream::binary); - if(!html_fout) + f_pages.fs.open((char*)page_fn, ofstream::binary); + if(!f_pages.fs) throw string("Cannot open ") + (char*)page_fn + " for writing"; - set_stream_flags(html_fout); + set_stream_flags(f_pages.fs); } if(param->process_nontext) @@ -113,7 +113,7 @@ void HTMLRenderer::process(PDFDoc *doc) if(param->split_pages) { - html_fout.close(); + f_pages.fs.close(); } } if(page_count >= 0) @@ -141,7 +141,7 @@ void HTMLRenderer::startPage(int pageNum, GfxState *state) assert((!line_opened) && "Open line in startPage detected!"); - html_fout + f_pages.fs << "
" @@ -150,7 +150,7 @@ void HTMLRenderer::startPage(int pageNum, GfxState *state) if(param->process_nontext) { - html_fout << "background-image:url("; + f_pages.fs << "background-image:url("; { if(param->single_html) @@ -159,18 +159,18 @@ void HTMLRenderer::startPage(int pageNum, GfxState *state) ifstream fin((char*)path, ifstream::binary); if(!fin) throw string("Cannot read background image ") + (char*)path; - html_fout << "'data:image/png;base64," << base64stream(fin) << "'"; + f_pages.fs << "'data:image/png;base64," << base64stream(fin) << "'"; } else { - html_fout << str_fmt("p%x.png", pageNum); + f_pages.fs << str_fmt("p%x.png", pageNum); } } - html_fout << ");background-position:0 0;background-size:" << pageWidth << "px " << pageHeight << "px;background-repeat:no-repeat;"; + f_pages.fs << ");background-position:0 0;background-size:" << pageWidth << "px " << pageHeight << "px;background-repeat:no-repeat;"; } - html_fout << "\">"; + f_pages.fs << "\">"; draw_text_scale = 1.0; cur_font_info = install_font(nullptr); @@ -205,26 +205,26 @@ void HTMLRenderer::endPage() { cur_doc->processLinks(this, pageNum); // close box - html_fout << "
"; + f_pages.fs << ""; // dump info for js // TODO: create a function for this // BE CAREFUL WITH ESCAPES - html_fout << "
0) html_fout << ","; - html_fout << round(default_ctm[i]); + if(i > 0) f_pages.fs << ","; + f_pages.fs << round(default_ctm[i]); } - html_fout << "]"; + f_pages.fs << "]"; - html_fout << "}'>
"; + f_pages.fs << "}'>"; // close page - html_fout << "" << endl; + f_pages.fs << "" << endl; } void HTMLRenderer::pre_process(PDFDoc * doc) @@ -289,11 +289,11 @@ void HTMLRenderer::pre_process(PDFDoc * doc) if(param->single_html && (!param->split_pages)) tmp_files.add((char*)fn); - css_path = (char*)fn, - css_fout.open(css_path, ofstream::binary); - if(!css_fout) + f_css.path = (char*)fn, + f_css.fs.open(f_css.path, ofstream::binary); + if(!f_css.fs) throw string("Cannot open ") + (char*)fn + " for writing"; - set_stream_flags(css_fout); + set_stream_flags(f_css.fs); } // if split-pages is specified, open & close the file in the process loop @@ -310,21 +310,21 @@ void HTMLRenderer::pre_process(PDFDoc * doc) auto fn = str_fmt("%s/__pages", param->tmp_dir.c_str()); tmp_files.add((char*)fn); - html_path = (char*)fn; - html_fout.open(html_path, ofstream::binary); - if(!html_fout) + f_pages.path = (char*)fn; + f_pages.fs.open(f_pages.path, ofstream::binary); + if(!f_pages.fs) throw string("Cannot open ") + (char*)fn + " for writing"; - set_stream_flags(html_fout); + set_stream_flags(f_pages.fs); } } void HTMLRenderer::post_process() { // close files - html_fout.close(); - css_fout.close(); + f_pages.fs.close(); + f_css.fs.close(); - //only when split-page, do we have some work left to do + //only when split-page == 0, do we have some work left to do if(param->split_pages) return; @@ -372,11 +372,11 @@ void HTMLRenderer::post_process() { if(line == "$css") { - embed_file(output, css_path, ".css", false); + embed_file(output, f_css.path, ".css", false); } else if (line == "$pages") { - ifstream fin(html_path, ifstream::binary); + ifstream fin(f_pages.path, ifstream::binary); if(!fin) throw "Cannot open read the pages"; output << fin.rdbuf(); diff --git a/src/HTMLRenderer/link.cc b/src/HTMLRenderer/link.cc index d64d513..fb76998 100644 --- a/src/HTMLRenderer/link.cc +++ b/src/HTMLRenderer/link.cc @@ -183,15 +183,15 @@ void HTMLRenderer::processLink(AnnotLink * al) if(!dest_str.empty()) { - html_fout << ""; + f_pages.fs << ">"; } - html_fout << "
getStyle(); switch(style) { case AnnotBorder::borderSolid: - html_fout << "border-style:solid;"; + f_pages.fs << "border-style:solid;"; break; case AnnotBorder::borderDashed: - html_fout << "border-style:dashed;"; + f_pages.fs << "border-style:dashed;"; break; case AnnotBorder::borderBeveled: - html_fout << "border-style:outset;"; + f_pages.fs << "border-style:outset;"; break; case AnnotBorder::borderInset: - html_fout << "border-style:inset;"; + f_pages.fs << "border-style:inset;"; break; case AnnotBorder::borderUnderlined: - html_fout << "border-style:none;border-bottom-style:solid;"; + f_pages.fs << "border-style:none;border-bottom-style:solid;"; break; default: cerr << "Warning:Unknown annotation border style: " << style << endl; - html_fout << "border-style:solid;"; + f_pages.fs << "border-style:solid;"; } @@ -260,36 +260,36 @@ void HTMLRenderer::processLink(AnnotLink * al) r = g = b = 0; } - html_fout << "border-color:rgb(" + f_pages.fs << "border-color:rgb(" << dec << (int)dblToByte(r) << "," << (int)dblToByte(g) << "," << (int)dblToByte(b) << hex << ");"; } else { - html_fout << "border-style:none;"; + f_pages.fs << "border-style:none;"; } } else { - html_fout << "border-style:none;"; + f_pages.fs << "border-style:none;"; } tm_transform(default_ctm, x, y); - html_fout << "position:absolute;" + f_pages.fs << "position:absolute;" << "left:" << round(x) << "px;" << "bottom:" << round(y) << "px;" << "width:" << round(w) << "px;" << "height:" << round(h) << "px;"; // fix for IE - html_fout << "background-color:rgba(255,255,255,0.000001);"; + f_pages.fs << "background-color:rgba(255,255,255,0.000001);"; - html_fout << "\">
"; + f_pages.fs << "\">"; if(dest_str != "") { - html_fout << "
"; + f_pages.fs << ""; } }