mirror of
https://github.com/pdf2htmlEX/pdf2htmlEX.git
synced 2024-12-22 13:00:08 +00:00
install.cc export.cc -> font.cc
This commit is contained in:
parent
31861e7acb
commit
75c2c8cba1
@ -147,10 +147,9 @@ add_executable(pdf2htmlEX
|
|||||||
src/pdf2htmlEX.cc
|
src/pdf2htmlEX.cc
|
||||||
src/HTMLRenderer/HTMLRenderer.h
|
src/HTMLRenderer/HTMLRenderer.h
|
||||||
src/HTMLRenderer/draw.cc
|
src/HTMLRenderer/draw.cc
|
||||||
src/HTMLRenderer/export.cc
|
|
||||||
src/HTMLRenderer/general.cc
|
src/HTMLRenderer/general.cc
|
||||||
src/HTMLRenderer/image.cc
|
src/HTMLRenderer/image.cc
|
||||||
src/HTMLRenderer/install.cc
|
src/HTMLRenderer/font.cc
|
||||||
src/HTMLRenderer/TextLineBuffer.h
|
src/HTMLRenderer/TextLineBuffer.h
|
||||||
src/HTMLRenderer/TextLineBuffer.cc
|
src/HTMLRenderer/TextLineBuffer.cc
|
||||||
src/HTMLRenderer/link.cc
|
src/HTMLRenderer/link.cc
|
||||||
|
@ -1,133 +0,0 @@
|
|||||||
/*
|
|
||||||
* export.cc
|
|
||||||
*
|
|
||||||
* Export styles to HTML
|
|
||||||
*
|
|
||||||
* Copyright (C) 2012,2013 Lu Wang <coolwanglu@gmail.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <sstream>
|
|
||||||
#include <cctype>
|
|
||||||
|
|
||||||
#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
|
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* install.cc
|
* font.cc
|
||||||
*
|
*
|
||||||
* maintaining all known styles
|
* Font processing
|
||||||
*
|
*
|
||||||
* Copyright (C) 2012,2013 Lu Wang <coolwanglu@gmail.com>
|
* Copyright (C) 2012,2013 Lu Wang <coolwanglu@gmail.com>
|
||||||
*/
|
*/
|
||||||
@ -9,6 +9,8 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <sstream>
|
||||||
|
#include <cctype>
|
||||||
|
|
||||||
#include <GlobalParams.h>
|
#include <GlobalParams.h>
|
||||||
|
|
||||||
@ -17,6 +19,7 @@
|
|||||||
#include "util/namespace.h"
|
#include "util/namespace.h"
|
||||||
#include "util/math.h"
|
#include "util/math.h"
|
||||||
#include "util/misc.h"
|
#include "util/misc.h"
|
||||||
|
#include "util/base64stream.h"
|
||||||
|
|
||||||
namespace pdf2htmlEX {
|
namespace pdf2htmlEX {
|
||||||
|
|
||||||
@ -211,5 +214,115 @@ void HTMLRenderer::install_external_font(GfxFont * font, FontInfo & info)
|
|||||||
|
|
||||||
export_local_font(info, font, fontname, "");
|
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
|
Loading…
Reference in New Issue
Block a user