mirror of
https://github.com/pdf2htmlEX/pdf2htmlEX.git
synced 2024-12-22 04:50:09 +00:00
remove special handling of base 14 fonts
This commit is contained in:
parent
8bad93c8e5
commit
bcf3bd793e
4
TODO
4
TODO
@ -1,5 +1,9 @@
|
|||||||
|
- dots issue
|
||||||
|
- AdobeXML*.pdf
|
||||||
- font issue
|
- font issue
|
||||||
- cjkmix2*.pdf
|
- cjkmix2*.pdf
|
||||||
|
- space issue
|
||||||
|
- python简明*.pdf
|
||||||
- smarter space-as-offset
|
- smarter space-as-offset
|
||||||
- show hints about possible useful parameters
|
- show hints about possible useful parameters
|
||||||
- optimization levels
|
- optimization levels
|
||||||
|
@ -133,18 +133,11 @@ Output in fallback mode, for better accuracy and browser compatibility, but the
|
|||||||
|
|
||||||
.SS Fonts
|
.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
|
.TP
|
||||||
.B --embed-external-font <0|1> (Default: 1)
|
.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
|
.TP
|
||||||
.B --font-suffix <suffix> (Default: .ttf)
|
.B --font-suffix <suffix> (Default: .ttf)
|
||||||
|
@ -152,7 +152,6 @@ protected:
|
|||||||
*
|
*
|
||||||
* In PDF: (install_*)
|
* In PDF: (install_*)
|
||||||
* embedded font: fonts embedded in PDF
|
* 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
|
* external font: fonts that have only names provided in PDF, the viewer should find a local font to match with
|
||||||
*
|
*
|
||||||
* In HTML: (export_*)
|
* In HTML: (export_*)
|
||||||
@ -165,7 +164,6 @@ protected:
|
|||||||
void embed_font(const std::string & filepath, GfxFont * font, FontInfo & info, bool get_metric_only = false);
|
void embed_font(const std::string & filepath, GfxFont * font, FontInfo & info, bool get_metric_only = false);
|
||||||
const FontInfo * install_font(GfxFont * font);
|
const FontInfo * install_font(GfxFont * font);
|
||||||
void install_embedded_font(GfxFont * font, FontInfo & info);
|
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 install_external_font (GfxFont * font, FontInfo & info);
|
||||||
void export_remote_font(const FontInfo & info, const std::string & suffix, GfxFont * font);
|
void export_remote_font(const FontInfo & info, const std::string & suffix, GfxFont * font);
|
||||||
void export_remote_default_font(long long fn_id);
|
void export_remote_default_font(long long fn_id);
|
||||||
|
@ -326,6 +326,7 @@ void HTMLRenderer::embed_font(const string & filepath, GfxFont * font, FontInfo
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// TODO: add an option to load the table?
|
||||||
ffw_cidflatten();
|
ffw_cidflatten();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -612,7 +613,12 @@ const FontInfo * HTMLRenderer::install_font(GfxFont * font)
|
|||||||
return &new_font_info;
|
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)
|
switch(font_loc -> locType)
|
||||||
{
|
{
|
||||||
@ -620,14 +626,13 @@ const FontInfo * HTMLRenderer::install_font(GfxFont * font)
|
|||||||
new_font_info.is_embeded = true;
|
new_font_info.is_embeded = true;
|
||||||
install_embedded_font(font, new_font_info);
|
install_embedded_font(font, new_font_info);
|
||||||
break;
|
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:
|
case gfxFontLocExternal:
|
||||||
new_font_info.is_embeded = false;
|
new_font_info.is_embeded = false;
|
||||||
install_external_font(font, new_font_info);
|
install_external_font(font, new_font_info);
|
||||||
break;
|
break;
|
||||||
case gfxFontLocResident:
|
|
||||||
new_font_info.is_embeded = false;
|
|
||||||
install_base_font(font, font_loc, new_font_info);
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
cerr << "TODO: other font loc" << endl;
|
cerr << "TODO: other font loc" << endl;
|
||||||
export_remote_default_font(new_fn_id);
|
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)
|
void HTMLRenderer::install_external_font(GfxFont * font, FontInfo & info)
|
||||||
{
|
{
|
||||||
string fontname(font->getName()->getCString());
|
string fontname(font->getName()->getCString());
|
||||||
|
@ -37,7 +37,6 @@ struct Param
|
|||||||
int fallback;
|
int fallback;
|
||||||
|
|
||||||
// fonts
|
// fonts
|
||||||
int embed_base_font;
|
|
||||||
int embed_external_font;
|
int embed_external_font;
|
||||||
std::string font_suffix;
|
std::string font_suffix;
|
||||||
int decompose_ligature;
|
int decompose_ligature;
|
||||||
|
@ -36,6 +36,12 @@ using namespace pdf2htmlEX;
|
|||||||
Param param;
|
Param param;
|
||||||
ArgParser argparser;
|
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)
|
void show_usage_and_exit(const char * dummy = nullptr)
|
||||||
{
|
{
|
||||||
cerr << "Usage: pdf2htmlEX [options] <input.pdf> [<output.html>]" << endl;
|
cerr << "Usage: pdf2htmlEX [options] <input.pdf> [<output.html>]" << endl;
|
||||||
@ -82,7 +88,6 @@ void parse_options (int argc, char **argv)
|
|||||||
.add("fallback", ¶m.fallback, 0, "output in fallback mode")
|
.add("fallback", ¶m.fallback, 0, "output in fallback mode")
|
||||||
|
|
||||||
// fonts
|
// fonts
|
||||||
.add("embed-base-font", ¶m.embed_base_font, 1, "embed local match for standard 14 fonts")
|
|
||||||
.add("embed-external-font", ¶m.embed_external_font, 1, "embed local match for external fonts")
|
.add("embed-external-font", ¶m.embed_external_font, 1, "embed local match for external fonts")
|
||||||
.add("font-suffix", ¶m.font_suffix, ".ttf", "suffix for embedded font files (.ttf,.otf,.woff,.svg)")
|
.add("font-suffix", ¶m.font_suffix, ".ttf", "suffix for embedded font files (.ttf,.otf,.woff,.svg)")
|
||||||
.add("decompose-ligature", ¶m.decompose_ligature, 0, "decompose ligatures, such as \uFB01 -> fi")
|
.add("decompose-ligature", ¶m.decompose_ligature, 0, "decompose ligatures, such as \uFB01 -> fi")
|
||||||
@ -117,6 +122,9 @@ void parse_options (int argc, char **argv)
|
|||||||
.add("version,v", "print copyright and version info", &show_version_and_exit)
|
.add("version,v", "print copyright and version info", &show_version_and_exit)
|
||||||
.add("help,h", "print usage information", &show_usage_and_exit)
|
.add("help,h", "print usage information", &show_usage_and_exit)
|
||||||
|
|
||||||
|
// deprecated
|
||||||
|
.add("embed-base-font", "", &deprecated_embed_base_font)
|
||||||
|
|
||||||
.add("", ¶m.input_filename, "", "")
|
.add("", ¶m.input_filename, "", "")
|
||||||
.add("", ¶m.output_filename, "", "")
|
.add("", ¶m.output_filename, "", "")
|
||||||
;
|
;
|
||||||
|
@ -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 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({
|
const map<string, string> GB_ENCODED_FONT_NAME_MAP({
|
||||||
{"\xCB\xCE\xCC\xE5", "SimSun"},
|
{"\xCB\xCE\xCC\xE5", "SimSun"},
|
||||||
{"\xBA\xDA\xCC\xE5", "SimHei"},
|
{"\xBA\xDA\xCC\xE5", "SimHei"},
|
||||||
|
@ -21,8 +21,6 @@ static const double EPS = 1e-6;
|
|||||||
static const double DEFAULT_DPI = 72.0;
|
static const double DEFAULT_DPI = 72.0;
|
||||||
extern const double ID_MATRIX[6];
|
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
|
// For GB encoded font names
|
||||||
extern const std::map<std::string, std::string> GB_ENCODED_FONT_NAME_MAP;
|
extern const std::map<std::string, std::string> GB_ENCODED_FONT_NAME_MAP;
|
||||||
// map to embed files into html
|
// map to embed files into html
|
||||||
|
Loading…
Reference in New Issue
Block a user