remove special handling of base 14 fonts

This commit is contained in:
Lu Wang 2013-05-04 03:29:10 +08:00
parent 8bad93c8e5
commit bcf3bd793e
8 changed files with 25 additions and 77 deletions

4
TODO
View File

@ -1,5 +1,9 @@
- dots issue
- AdobeXML*.pdf
- font issue
- cjkmix2*.pdf
- space issue
- python简明*.pdf
- smarter space-as-offset
- show hints about possible useful parameters
- optimization levels

View File

@ -133,18 +133,11 @@ Output in fallback mode, for better accuracy and browser compatibility, but the
.SS Fonts
.TP
.B --embed-base-font <0|1> (Default: 1)
Whether to embed base 14 fonts.
There are several base font defined in PDF standards, which are supposed to be provided by the PDF reader.
If this switch is on, local matched font will be used and embedded; otherwise only font names are exported such that web browsers may try to find proper fonts themselves.
.TP
.B --embed-external-font <0|1> (Default: 1)
Similar as `--embed-base-font` but for non-base fonts. If this switch is off, the corresponding fonts must be installed in the client side.
Specify whether the local matched fonts, for fonts not embedded in PDF, should be embedded into HTML.
If this switch is off, only font names are exported such that web browsers may try to find proper fonts themselves, and that might cause issues about incorrect font metrics.
.TP
.B --font-suffix <suffix> (Default: .ttf)

View File

@ -152,7 +152,6 @@ protected:
*
* In PDF: (install_*)
* embedded font: fonts embedded in PDF
* base font: standard 14 fonts defined in PDF spec
* external font: fonts that have only names provided in PDF, the viewer should find a local font to match with
*
* In HTML: (export_*)
@ -165,7 +164,6 @@ protected:
void embed_font(const std::string & filepath, GfxFont * font, FontInfo & info, bool get_metric_only = false);
const FontInfo * install_font(GfxFont * font);
void install_embedded_font(GfxFont * font, FontInfo & info);
void install_base_font(GfxFont * font, GfxFontLoc * font_loc, FontInfo & info);
void install_external_font (GfxFont * font, FontInfo & info);
void export_remote_font(const FontInfo & info, const std::string & suffix, GfxFont * font);
void export_remote_default_font(long long fn_id);

View File

@ -326,6 +326,7 @@ void HTMLRenderer::embed_font(const string & filepath, GfxFont * font, FontInfo
}
else
{
// TODO: add an option to load the table?
ffw_cidflatten();
}
}
@ -612,7 +613,12 @@ const FontInfo * HTMLRenderer::install_font(GfxFont * font)
return &new_font_info;
}
if(auto * font_loc = font->locateFont(xref, gTrue))
/*
* The 2nd parameter of locateFont should be true only for PS
* which does not make much sense in our case
* If we specify gFalse here, font_loc->locaType cannot be gfxFontLocResident
*/
if(auto * font_loc = font->locateFont(xref, gFalse))
{
switch(font_loc -> locType)
{
@ -620,14 +626,13 @@ const FontInfo * HTMLRenderer::install_font(GfxFont * font)
new_font_info.is_embeded = true;
install_embedded_font(font, new_font_info);
break;
case gfxFontLocResident:
std::cerr << "Warning: Base 14 fonts should not be specially handled now. Please report a bug!" << std::endl;
/* fall through */
case gfxFontLocExternal:
new_font_info.is_embeded = false;
install_external_font(font, new_font_info);
break;
case gfxFontLocResident:
new_font_info.is_embeded = false;
install_base_font(font, font_loc, new_font_info);
break;
default:
cerr << "TODO: other font loc" << endl;
export_remote_default_font(new_fn_id);
@ -658,55 +663,6 @@ void HTMLRenderer::install_embedded_font(GfxFont * font, FontInfo & info)
}
}
void HTMLRenderer::install_base_font(GfxFont * font, GfxFontLoc * font_loc, FontInfo & info)
{
string psname(font_loc->path->getCString());
string basename = psname.substr(0, psname.find('-'));
GfxFontLoc * localfontloc = font->locateFont(xref, gFalse);
if(param.embed_base_font)
{
if(localfontloc != nullptr)
{
embed_font(localfontloc->path->getCString(), font, info);
export_remote_font(info, param.font_suffix, font);
delete localfontloc;
return;
}
else
{
cerr << "Cannot embed base font: f" << hex << info.id << dec << ' ' << psname << endl;
// fallback to exporting by name
}
}
string cssfont;
auto iter = BASE_14_FONT_CSS_FONT_MAP.find(basename);
if(iter == BASE_14_FONT_CSS_FONT_MAP.end())
{
cerr << "PS Font: " << basename << " not found in the base 14 font map" << endl;
cssfont = "";
}
else
cssfont = iter->second;
// still try to get an idea of read ascent/descent
if(localfontloc != nullptr)
{
// fill in ascent/descent only, do not embed
embed_font(string(localfontloc->path->getCString()), font, info, true);
delete localfontloc;
}
else
{
info.ascent = font->getAscent();
info.descent = font->getDescent();
}
export_local_font(info, font, psname, cssfont);
}
void HTMLRenderer::install_external_font(GfxFont * font, FontInfo & info)
{
string fontname(font->getName()->getCString());

View File

@ -37,7 +37,6 @@ struct Param
int fallback;
// fonts
int embed_base_font;
int embed_external_font;
std::string font_suffix;
int decompose_ligature;

View File

@ -36,6 +36,12 @@ using namespace pdf2htmlEX;
Param param;
ArgParser argparser;
void deprecated_embed_base_font(const char * dummy = nullptr)
{
cerr << "--embed-base-font is deprecated. Use --embed-external-font instead." << endl;
exit(EXIT_FAILURE);
}
void show_usage_and_exit(const char * dummy = nullptr)
{
cerr << "Usage: pdf2htmlEX [options] <input.pdf> [<output.html>]" << endl;
@ -82,7 +88,6 @@ void parse_options (int argc, char **argv)
.add("fallback", &param.fallback, 0, "output in fallback mode")
// fonts
.add("embed-base-font", &param.embed_base_font, 1, "embed local match for standard 14 fonts")
.add("embed-external-font", &param.embed_external_font, 1, "embed local match for external fonts")
.add("font-suffix", &param.font_suffix, ".ttf", "suffix for embedded font files (.ttf,.otf,.woff,.svg)")
.add("decompose-ligature", &param.decompose_ligature, 0, "decompose ligatures, such as \uFB01 -> fi")
@ -116,6 +121,9 @@ void parse_options (int argc, char **argv)
// meta
.add("version,v", "print copyright and version info", &show_version_and_exit)
.add("help,h", "print usage information", &show_usage_and_exit)
// deprecated
.add("embed-base-font", "", &deprecated_embed_base_font)
.add("", &param.input_filename, "", "")
.add("", &param.output_filename, "", "")

View File

@ -14,14 +14,6 @@ using std::string;
const double ID_MATRIX[6] = {1.0, 0.0, 0.0, 1.0, 0.0, 0.0};
const map<string, string> BASE_14_FONT_CSS_FONT_MAP({
{ "Courier", "Courier,monospace" },
{ "Helvetica", "Helvetica,Arial,\"Nimbus Sans L\",sans-serif" },
{ "Times", "Times,\"Time New Roman\",\"Nimbus Roman No9 L\",serif" },
{ "Symbol", "Symbol,\"Standard Symbols L\"" },
{ "ZapfDingbats", "ZapfDingbats,\"Dingbats\"" },
});
const map<string, string> GB_ENCODED_FONT_NAME_MAP({
{"\xCB\xCE\xCC\xE5", "SimSun"},
{"\xBA\xDA\xCC\xE5", "SimHei"},

View File

@ -21,8 +21,6 @@ static const double EPS = 1e-6;
static const double DEFAULT_DPI = 72.0;
extern const double ID_MATRIX[6];
// PDF base 14 font name -> CSS font name
extern const std::map<std::string, std::string> BASE_14_FONT_CSS_FONT_MAP;
// For GB encoded font names
extern const std::map<std::string, std::string> GB_ENCODED_FONT_NAME_MAP;
// map to embed files into html