diff --git a/CMakeLists.txt b/CMakeLists.txt index 0a6839d..9f37e1a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -147,10 +147,9 @@ add_executable(pdf2htmlEX src/pdf2htmlEX.cc src/HTMLRenderer/HTMLRenderer.h src/HTMLRenderer/draw.cc - src/HTMLRenderer/export.cc src/HTMLRenderer/general.cc src/HTMLRenderer/image.cc - src/HTMLRenderer/install.cc + src/HTMLRenderer/font.cc src/HTMLRenderer/TextLineBuffer.h src/HTMLRenderer/TextLineBuffer.cc src/HTMLRenderer/link.cc diff --git a/src/HTMLRenderer/export.cc b/src/HTMLRenderer/export.cc deleted file mode 100644 index a08cfe6..0000000 --- a/src/HTMLRenderer/export.cc +++ /dev/null @@ -1,133 +0,0 @@ -/* - * export.cc - * - * Export styles to HTML - * - * Copyright (C) 2012,2013 Lu Wang - */ - -#include -#include - -#include "HTMLRenderer.h" -#include "util/namespace.h" -#include "util/base64stream.h" -#include "util/math.h" -#include "util/misc.h" - -namespace pdf2htmlEX { - -using std::cerr; -using std::endl; - -void HTMLRenderer::export_remote_font(const FontInfo & info, const string & suffix, GfxFont * font) -{ - string mime_type, format; - if(suffix == ".ttf") - { - format = "truetype"; - mime_type = "application/x-font-ttf"; - } - else if(suffix == ".otf") - { - format = "opentype"; - mime_type = "application/x-font-otf"; - } - else if(suffix == ".woff") - { - format = "woff"; - mime_type = "application/font-woff"; - } - else if(suffix == ".eot") - { - format = "embedded-opentype"; - mime_type = "application/vnd.ms-fontobject"; - } - else if(suffix == ".svg") - { - format = "svg"; - mime_type = "image/svg+xml"; - } - else - { - cerr << "Warning: unknown font suffix: " << suffix << endl; - } - - f_css.fs << "@font-face{" - << "font-family:f" << info.id << ";" - << "src:url("; - - { - auto fn = str_fmt("f%llx%s", info.id, suffix.c_str()); - if(param->single_html) - { - auto path = param->tmp_dir + "/" + (char*)fn; - ifstream fin(path, ifstream::binary); - if(!fin) - throw "Cannot locate font file: " + path; - f_css.fs << "'data:font/" + mime_type + ";base64," << base64stream(fin) << "'"; - } - else - { - f_css.fs << (char*)fn; - } - } - - f_css.fs << ")" - << "format(\"" << format << "\");" - << "}" // end of @font-face - << ".f" << info.id << "{" - << "font-family:f" << info.id << ";" - << "line-height:" << round(info.ascent - info.descent) << ";" - << "font-style:normal;" - << "font-weight:normal;" - << "visibility:visible;" - << "}" // end of .f - << endl; -} - -static string general_font_family(GfxFont * font) -{ - if(font->isFixedWidth()) - return "monospace"; - else if (font->isSerif()) - return "serif"; - else - return "sans-serif"; -} - -// 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) -{ - 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) -{ - 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)) - f_css.fs << "font-weight:bold;"; - else - f_css.fs << "font-weight:normal;"; - - if(fn.find("oblique") != string::npos) - f_css.fs << "font-style:oblique;"; - else if(font->isItalic() || (fn.find("italic") != string::npos)) - f_css.fs << "font-style:italic;"; - else - f_css.fs << "font-style:normal;"; - - f_css.fs << "line-height:" << round(info.ascent - info.descent) << ";"; - - f_css.fs << "visibility:visible;"; - - f_css.fs << "}" << endl; -} - -} //namespace pdf2hmlEX diff --git a/src/HTMLRenderer/install.cc b/src/HTMLRenderer/font.cc similarity index 63% rename from src/HTMLRenderer/install.cc rename to src/HTMLRenderer/font.cc index 8d970c3..a6c24be 100644 --- a/src/HTMLRenderer/install.cc +++ b/src/HTMLRenderer/font.cc @@ -1,7 +1,7 @@ /* - * install.cc + * font.cc * - * maintaining all known styles + * Font processing * * Copyright (C) 2012,2013 Lu Wang */ @@ -9,6 +9,8 @@ #include #include #include +#include +#include #include @@ -17,6 +19,7 @@ #include "util/namespace.h" #include "util/math.h" #include "util/misc.h" +#include "util/base64stream.h" namespace pdf2htmlEX { @@ -211,5 +214,115 @@ void HTMLRenderer::install_external_font(GfxFont * font, FontInfo & info) export_local_font(info, font, fontname, ""); } - -} // namespace pdf2htmlEX + +void HTMLRenderer::export_remote_font(const FontInfo & info, const string & suffix, GfxFont * font) +{ + string mime_type, format; + if(suffix == ".ttf") + { + format = "truetype"; + mime_type = "application/x-font-ttf"; + } + else if(suffix == ".otf") + { + format = "opentype"; + mime_type = "application/x-font-otf"; + } + else if(suffix == ".woff") + { + format = "woff"; + mime_type = "application/font-woff"; + } + else if(suffix == ".eot") + { + format = "embedded-opentype"; + mime_type = "application/vnd.ms-fontobject"; + } + else if(suffix == ".svg") + { + format = "svg"; + mime_type = "image/svg+xml"; + } + else + { + cerr << "Warning: unknown font suffix: " << suffix << endl; + } + + f_css.fs << "@font-face{" + << "font-family:f" << info.id << ";" + << "src:url("; + + { + auto fn = str_fmt("f%llx%s", info.id, suffix.c_str()); + if(param->single_html) + { + auto path = param->tmp_dir + "/" + (char*)fn; + ifstream fin(path, ifstream::binary); + if(!fin) + throw "Cannot locate font file: " + path; + f_css.fs << "'data:font/" + mime_type + ";base64," << base64stream(fin) << "'"; + } + else + { + f_css.fs << (char*)fn; + } + } + + f_css.fs << ")" + << "format(\"" << format << "\");" + << "}" // end of @font-face + << ".f" << info.id << "{" + << "font-family:f" << info.id << ";" + << "line-height:" << round(info.ascent - info.descent) << ";" + << "font-style:normal;" + << "font-weight:normal;" + << "visibility:visible;" + << "}" // end of .f + << endl; +} + +static string general_font_family(GfxFont * font) +{ + if(font->isFixedWidth()) + return "monospace"; + else if (font->isSerif()) + return "serif"; + else + return "sans-serif"; +} + +// 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) +{ + 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) +{ + 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)) + f_css.fs << "font-weight:bold;"; + else + f_css.fs << "font-weight:normal;"; + + if(fn.find("oblique") != string::npos) + f_css.fs << "font-style:oblique;"; + else if(font->isItalic() || (fn.find("italic") != string::npos)) + f_css.fs << "font-style:italic;"; + else + f_css.fs << "font-style:normal;"; + + f_css.fs << "line-height:" << round(info.ascent - info.descent) << ";"; + + f_css.fs << "visibility:visible;"; + + f_css.fs << "}" << endl; +} + +} //namespace pdf2hmlEX