mirror of
https://github.com/pdf2htmlEX/pdf2htmlEX.git
synced 2024-07-05 09:38:40 +00:00
Merge branch 'devv'
Conflicts: README.md
This commit is contained in:
commit
3b54f1a019
|
@ -1,5 +1,7 @@
|
||||||
Latest v0.5
|
Latest v0.5
|
||||||
|
|
||||||
|
* New options: --stretch-narrow-glyph, --squeeze-wide-glyph
|
||||||
|
|
||||||
v0.4
|
v0.4
|
||||||
2012.09.26
|
2012.09.26
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
### [**Donate Now**](http://coolwanglu.github.com/pdf2htmlEX/donate.html)
|
### [**Donate Now**](http://coolwanglu.github.com/pdf2htmlEX/donate.html)
|
||||||
|
|
||||||
|
### [**Feature Commision**](https://github.com/coolwanglu/pdf2htmlEX/wiki/FAQ#wiki-feature_commission) are now accepted.
|
||||||
|
|
||||||
A beautiful demo is worth a thousand words:
|
A beautiful demo is worth a thousand words:
|
||||||
|
|
||||||
[**Typography**](http://coolwanglu.github.com/pdf2htmlEX/demo/geneve.html) [Original](https://github.com/raphink/geneve_1564/raw/master/geneve_1564.pdf)
|
[**Typography**](http://coolwanglu.github.com/pdf2htmlEX/demo/geneve.html) [Original](https://github.com/raphink/geneve_1564/raw/master/geneve_1564.pdf)
|
||||||
|
|
14
TODO
14
TODO
|
@ -1,6 +1,18 @@
|
||||||
|
|
||||||
|
about glyph width:
|
||||||
|
- IE
|
||||||
|
- stretching ratio might not be correct.. letter 'f'
|
||||||
|
|
||||||
|
draw lines with CSS
|
||||||
|
|
||||||
|
create a glyph for ' ', if there is not in a font
|
||||||
|
|
||||||
|
position history stack (popstate)
|
||||||
|
|
||||||
|
==Wait until someone asks==
|
||||||
|
|
||||||
try harder finding glyph names (using fontforge) for CID Type 0
|
try harder finding glyph names (using fontforge) for CID Type 0
|
||||||
rename single-html -> embed-font/image/css ...
|
rename single-html -> embed-font/image/css ...
|
||||||
create a glyph for ' ', if there is not in a font
|
|
||||||
|
|
||||||
merge sub/sup into one line
|
merge sub/sup into one line
|
||||||
bug found in baidu(ubuntu...)
|
bug found in baidu(ubuntu...)
|
||||||
|
|
|
@ -35,7 +35,7 @@ Specify owner password
|
||||||
.B -u, --user-password <password>
|
.B -u, --user-password <password>
|
||||||
Specify user password
|
Specify user password
|
||||||
.TP
|
.TP
|
||||||
.B --dest-dir <dir> (Default: ".")
|
.B --dest-dir <dir> (Default: .)
|
||||||
Specify destination folder
|
Specify destination folder
|
||||||
.TP
|
.TP
|
||||||
.B --data-dir <dir> (Default: @CMAKE_INSTALL_PREFIX@/share/pdf2htmlEX)
|
.B --data-dir <dir> (Default: @CMAKE_INSTALL_PREFIX@/share/pdf2htmlEX)
|
||||||
|
@ -117,15 +117,21 @@ Treat space characters as offsets, which may increase the size of the output.
|
||||||
|
|
||||||
Turn it on if space characters are not displayed correctly, or you want to remove positional spaces.
|
Turn it on if space characters are not displayed correctly, or you want to remove positional spaces.
|
||||||
.TP
|
.TP
|
||||||
.B --css-filename <filename> (Default: "")
|
.B --stretch-narrow-glyph <0|1> (Default: 0)
|
||||||
|
If set to 1, glyphs narrower than described in PDF will be strecth; otherwise space will be padded to the right of the glyphs
|
||||||
|
.TP
|
||||||
|
.B --squeeze_wide_glyph <0|1> (Default: 0)
|
||||||
|
If set to 1, glyphs wider than described in PDF will be squeezed; otherwise it will be truncated.
|
||||||
|
.TP
|
||||||
|
.B --css-filename <filename> (Default: <none>)
|
||||||
Specify the filename of the generated css file, if not embedded.
|
Specify the filename of the generated css file, if not embedded.
|
||||||
|
|
||||||
If it's empty, the file name will be determined automatically.
|
If it's empty, the file name will be determined automatically.
|
||||||
.TP
|
.TP
|
||||||
.B --font-suffix <suffix> (Default: ".ttf"), --font-format <format> (Default: "truetype")
|
.B --font-suffix <suffix> (Default: .ttf), --font-format <format> (Default: truetype)
|
||||||
Specify the suffix and format of fonts extracted from the PDF file. They should be consistent.
|
Specify the suffix and format of fonts extracted from the PDF file. They should be consistent.
|
||||||
.TP
|
.TP
|
||||||
.B --external-hint-tool <tool> (Default: "")
|
.B --external-hint-tool <tool> (Default: <none>)
|
||||||
If specified, the tool will be called in order to enhanced hinting for fonts, this will precede --auto-hint.
|
If specified, the tool will be called in order to enhanced hinting for fonts, this will precede --auto-hint.
|
||||||
|
|
||||||
The tool will be called as '<tool> <in.suffix> <out.suffix>', where suffix will be the same as specified for --font-suffix.
|
The tool will be called as '<tool> <in.suffix> <out.suffix>', where suffix will be the same as specified for --font-suffix.
|
||||||
|
@ -141,10 +147,10 @@ If switched off, intermediate files won't be cleaned in the end.
|
||||||
.B pdf2htmlEX /path/to/file.pdf
|
.B pdf2htmlEX /path/to/file.pdf
|
||||||
Convert file.pdf into file.html
|
Convert file.pdf into file.html
|
||||||
.TP
|
.TP
|
||||||
.B pdf2htmlEX --tmp-dir tmp --clean-tmp 0 --debug 1 /path/to/file.pdf
|
.B pdf2htmlEX --clean-tmp 0 --debug 1 /path/to/file.pdf
|
||||||
Convert file.pdf and leave all intermediate files.
|
Convert file.pdf and leave all intermediate files.
|
||||||
.TP
|
.TP
|
||||||
.B pdf2htmlEX --dest-dir out --single-html 0 --debug 1 /path/to/file.pdf
|
.B pdf2htmlEX --dest-dir out --single-html 0 /path/to/file.pdf
|
||||||
Convert file.pdf into out/file.html and leave font/image files separated.
|
Convert file.pdf into out/file.html and leave font/image files separated.
|
||||||
|
|
||||||
.SH COPYRIGHT
|
.SH COPYRIGHT
|
||||||
|
|
|
@ -11,8 +11,9 @@
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
#include "Param.h"
|
#include <GlobalParams.h>
|
||||||
|
|
||||||
|
#include "Param.h"
|
||||||
#include "HTMLRenderer.h"
|
#include "HTMLRenderer.h"
|
||||||
#include "namespace.h"
|
#include "namespace.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
@ -114,7 +115,7 @@ void HTMLRenderer::install_base_font(GfxFont * font, GfxFontLoc * font_loc, Font
|
||||||
{
|
{
|
||||||
if(localfontloc != nullptr)
|
if(localfontloc != nullptr)
|
||||||
{
|
{
|
||||||
embed_font(string(localfontloc->path->getCString()), font, info);
|
embed_font(localfontloc->path->getCString(), font, info);
|
||||||
export_remote_font(info, param->font_suffix, param->font_format, font);
|
export_remote_font(info, param->font_suffix, param->font_format, font);
|
||||||
delete localfontloc;
|
delete localfontloc;
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -25,7 +25,7 @@ namespace pdf2htmlEX {
|
||||||
using std::unordered_set;
|
using std::unordered_set;
|
||||||
using std::min;
|
using std::min;
|
||||||
using std::all_of;
|
using std::all_of;
|
||||||
using std::round;
|
using std::floor;
|
||||||
using std::swap;
|
using std::swap;
|
||||||
|
|
||||||
string HTMLRenderer::dump_embedded_font (GfxFont * font, long long fn_id)
|
string HTMLRenderer::dump_embedded_font (GfxFont * font, long long fn_id)
|
||||||
|
@ -189,14 +189,17 @@ void HTMLRenderer::embed_font(const string & filepath, GfxFont * font, FontInfo
|
||||||
info.em_size = ffw_get_em_size();
|
info.em_size = ffw_get_em_size();
|
||||||
|
|
||||||
if(get_metric_only)
|
if(get_metric_only)
|
||||||
|
{
|
||||||
|
ffw_metric(&info.ascent, &info.descent);
|
||||||
|
ffw_close();
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
used_map = preprocessor.get_code_map(hash_ref(font->getID()));
|
used_map = preprocessor.get_code_map(hash_ref(font->getID()));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Step 1
|
* Step 1
|
||||||
* dump the font file directly from the font descriptor and put the glyphs into the correct slots
|
* dump the font file directly from the font descriptor and put the glyphs into the correct slots *
|
||||||
*
|
|
||||||
* for 8bit + nonTrueType
|
* for 8bit + nonTrueType
|
||||||
* re-encoding the font using a PostScript encoding list (glyph id <-> glpyh name)
|
* re-encoding the font using a PostScript encoding list (glyph id <-> glpyh name)
|
||||||
*
|
*
|
||||||
|
@ -384,19 +387,19 @@ void HTMLRenderer::embed_font(const string & filepath, GfxFont * font, FontInfo
|
||||||
|
|
||||||
if(font_8bit)
|
if(font_8bit)
|
||||||
{
|
{
|
||||||
width_list[k] = (int)round(font_8bit->getWidth(i) * info.em_size);
|
width_list[k] = (int)floor(font_8bit->getWidth(i) * info.em_size + 0.5);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
char buf[2];
|
char buf[2];
|
||||||
buf[0] = (i >> 8) & 0xff;
|
buf[0] = (i >> 8) & 0xff;
|
||||||
buf[1] = (i & 0xff);
|
buf[1] = (i & 0xff);
|
||||||
width_list[k] = (int)round(font_cid->getWidth(buf, 2) * info.em_size);
|
width_list[k] = (int)floor(font_cid->getWidth(buf, 2) * info.em_size + 0.5);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ffw_set_widths(width_list, max_key + 1, param->stretch_narrow_glyph, param->squeeze_wide_glyph);
|
||||||
ffw_reencode_raw(cur_mapping, max_key + 1, 1);
|
ffw_reencode_raw(cur_mapping, max_key + 1, 1);
|
||||||
ffw_set_widths(width_list, max_key + 1);
|
|
||||||
|
|
||||||
if(ctu)
|
if(ctu)
|
||||||
ctu->decRefCnt();
|
ctu->decRefCnt();
|
||||||
|
@ -458,6 +461,7 @@ void HTMLRenderer::embed_font(const string & filepath, GfxFont * font, FontInfo
|
||||||
ffw_load_font(cur_tmp_fn.c_str());
|
ffw_load_font(cur_tmp_fn.c_str());
|
||||||
ffw_metric(&info.ascent, &info.descent);
|
ffw_metric(&info.ascent, &info.descent);
|
||||||
ffw_save(fn.c_str());
|
ffw_save(fn.c_str());
|
||||||
|
|
||||||
ffw_close();
|
ffw_close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -522,14 +526,22 @@ void HTMLRenderer::drawString(GfxState * state, GooString * s)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if((param->decompose_ligature) && all_of(u, u+uLen, isLegalUnicode))
|
if((param->decompose_ligature) && (uLen > 1) && all_of(u, u+uLen, isLegalUnicode))
|
||||||
{
|
{
|
||||||
line_buf.append_unicodes(u, uLen);
|
line_buf.append_unicodes(u, uLen);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Unicode uu = (cur_font_info->use_tounicode ? check_unicode(u, uLen, code, font) : unicode_from_font(code, font));
|
if(cur_font_info->use_tounicode)
|
||||||
line_buf.append_unicodes(&uu, 1);
|
{
|
||||||
|
Unicode uu = check_unicode(u, uLen, code, font);
|
||||||
|
line_buf.append_unicodes(&uu, 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Unicode uu = unicode_from_font(code, font);
|
||||||
|
line_buf.append_unicodes(&uu, 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
29
src/ffw.c
29
src/ffw.c
|
@ -19,6 +19,8 @@
|
||||||
|
|
||||||
#include "ffw.h"
|
#include "ffw.h"
|
||||||
|
|
||||||
|
static real EPS=1e-6;
|
||||||
|
|
||||||
static inline int min(int a, int b)
|
static inline int min(int a, int b)
|
||||||
{
|
{
|
||||||
return (a<b)?a:b;
|
return (a<b)?a:b;
|
||||||
|
@ -268,8 +270,10 @@ void ffw_metric(double * ascent, double * descent)
|
||||||
if(a < 0) a = 0;
|
if(a < 0) a = 0;
|
||||||
if(d > 0) d = 0;
|
if(d > 0) d = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
sf->ascent = min(a, em);
|
sf->ascent = min(a, em);
|
||||||
sf->descent = em - bb.maxy;
|
sf->descent = em - bb.maxy;
|
||||||
|
*/
|
||||||
|
|
||||||
info->os2_winascent = a;
|
info->os2_winascent = a;
|
||||||
info->os2_typoascent = a;
|
info->os2_typoascent = a;
|
||||||
|
@ -292,8 +296,17 @@ void ffw_metric(double * ascent, double * descent)
|
||||||
/*
|
/*
|
||||||
* TODO:bitmap, reference have not been considered in this function
|
* TODO:bitmap, reference have not been considered in this function
|
||||||
*/
|
*/
|
||||||
void ffw_set_widths(int * width_list, int mapping_len)
|
void ffw_set_widths(int * width_list, int mapping_len, int stretch_narrow, int squeeze_wide)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* Disabled, because it causes crashing
|
||||||
|
|
||||||
|
memset(cur_fv->selected, 1, cur_fv->map->enccount);
|
||||||
|
// remove kern
|
||||||
|
FVRemoveKerns(cur_fv);
|
||||||
|
FVRemoveVKerns(cur_fv);
|
||||||
|
*/
|
||||||
|
|
||||||
SplineFont * sf = cur_fv->sf;
|
SplineFont * sf = cur_fv->sf;
|
||||||
|
|
||||||
if(sf->onlybitmaps
|
if(sf->onlybitmaps
|
||||||
|
@ -319,6 +332,20 @@ void ffw_set_widths(int * width_list, int mapping_len)
|
||||||
SplineChar * sc = sf->glyphs[j];
|
SplineChar * sc = sf->glyphs[j];
|
||||||
if(sc == NULL) continue;
|
if(sc == NULL) continue;
|
||||||
|
|
||||||
|
DBounds bb;
|
||||||
|
SplineCharFindBounds(sc, &bb);
|
||||||
|
|
||||||
|
double glyph_width = bb.maxx - bb.minx;
|
||||||
|
if((glyph_width > EPS)
|
||||||
|
&& (((glyph_width > width_list[i] + EPS) && (squeeze_wide))
|
||||||
|
|| ((glyph_width < width_list[i] - EPS) && (stretch_narrow))))
|
||||||
|
{
|
||||||
|
real transform[6]; transform[0] = ((double)width_list[i]) / glyph_width;
|
||||||
|
transform[3] = 1.0;
|
||||||
|
transform[1] = transform[2] = transform[4] = transform[5] = 0;
|
||||||
|
FVTrans(cur_fv, sc, transform, NULL, fvt_alllayers | fvt_dontmovewidth);
|
||||||
|
}
|
||||||
|
|
||||||
sc->width = width_list[i];
|
sc->width = width_list[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,9 +40,13 @@ struct Param
|
||||||
double h_eps, v_eps;
|
double h_eps, v_eps;
|
||||||
double space_threshold;
|
double space_threshold;
|
||||||
double font_size_multiplier;
|
double font_size_multiplier;
|
||||||
|
|
||||||
int auto_hint;
|
int auto_hint;
|
||||||
int tounicode;
|
int tounicode;
|
||||||
int space_as_offset;
|
int space_as_offset;
|
||||||
|
|
||||||
|
int stretch_narrow_glyph;
|
||||||
|
int squeeze_wide_glyph;
|
||||||
|
|
||||||
std::string css_filename;
|
std::string css_filename;
|
||||||
std::string font_suffix, font_format;
|
std::string font_suffix, font_format;
|
||||||
|
|
|
@ -34,7 +34,7 @@ int ffw_get_em_size(void);
|
||||||
// fix metrics and get them
|
// fix metrics and get them
|
||||||
void ffw_metric(double * ascent, double * descent);
|
void ffw_metric(double * ascent, double * descent);
|
||||||
|
|
||||||
void ffw_set_widths(int * width_list, int mapping_len);
|
void ffw_set_widths(int * width_list, int mapping_len, int stretch_narrow, int squeeze_wide);
|
||||||
|
|
||||||
void ffw_auto_hint(void);
|
void ffw_auto_hint(void);
|
||||||
|
|
||||||
|
|
|
@ -41,6 +41,8 @@ void show_usage_and_exit(const char * dummy = nullptr)
|
||||||
cerr << "Options:" << endl;
|
cerr << "Options:" << endl;
|
||||||
argparser.show_usage(cerr);
|
argparser.show_usage(cerr);
|
||||||
cerr << endl;
|
cerr << endl;
|
||||||
|
cerr << "Run 'man pdf2htmlEX' for detailed information" << endl;
|
||||||
|
cerr << endl;
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,6 +81,8 @@ void parse_options (int argc, char **argv)
|
||||||
.add("auto-hint", ¶m.auto_hint, 0, "Whether to generate hints for fonts")
|
.add("auto-hint", ¶m.auto_hint, 0, "Whether to generate hints for fonts")
|
||||||
.add("tounicode", ¶m.tounicode, 0, "Specify how to deal with ToUnicode map, 0 for auto, 1 for forced, -1 for disabled")
|
.add("tounicode", ¶m.tounicode, 0, "Specify how to deal with ToUnicode map, 0 for auto, 1 for forced, -1 for disabled")
|
||||||
.add("space-as-offset", ¶m.space_as_offset, 0, "treat space characters as offsets")
|
.add("space-as-offset", ¶m.space_as_offset, 0, "treat space characters as offsets")
|
||||||
|
.add("stretch_narrow_glyph", ¶m.stretch_narrow_glyph, 0, "stretch narrow glyphs instead of padding space")
|
||||||
|
.add("squeeze_wide_glyph", ¶m.squeeze_wide_glyph, 0, "squeeze wide glyphs instead of truncating")
|
||||||
|
|
||||||
.add("css-filename", ¶m.css_filename, "", "Specify the file name of the generated css file")
|
.add("css-filename", ¶m.css_filename, "", "Specify the file name of the generated css file")
|
||||||
.add("font-suffix", ¶m.font_suffix, ".ttf", "suffix for extracted font files")
|
.add("font-suffix", ¶m.font_suffix, ".ttf", "suffix for extracted font files")
|
||||||
|
|
Loading…
Reference in New Issue
Block a user