";
if(param->process_nontext)
{
- f_pages.fs << "background-image:url(";
-
+ f_pages.fs << "
![\"\"](\"";)
single_html)
{
- if(param->single_html)
- {
- auto path = str_fmt("%s/p%x.png", param->tmp_dir.c_str(), pageNum);
- ifstream fin((char*)path, ifstream::binary);
- if(!fin)
- throw string("Cannot read background image ") + (char*)path;
- f_pages.fs << "'data:image/png;base64," << base64stream(fin) << "'";
- }
- else
- {
- f_pages.fs << str_fmt("p%x.png", pageNum);
- }
+ auto path = str_fmt("%s/bg%x.png", param->tmp_dir.c_str(), pageNum);
+ ifstream fin((char*)path, ifstream::binary);
+ if(!fin)
+ throw string("Cannot read background image ") + (char*)path;
+ f_pages.fs << "data:image/png;base64," << base64stream(fin);
}
-
- // TODO print css
- f_pages.fs << ");background-position:0 0;background-size:"
- << state->getPageWidth() << "px "
- << state->getPageHeight() << "px;background-repeat:no-repeat;";
+ else
+ {
+ f_pages.fs << str_fmt("bg%x.png", pageNum);
+ }
+ f_pages.fs << "\"/>";
}
- f_pages.fs << "\">";
-
reset_state();
}
@@ -462,22 +456,24 @@ void HTMLRenderer::dump_css (void)
width_manager .dump_css(f_css.fs);
rise_manager .dump_css(f_css.fs);
left_manager .dump_css(f_css.fs);
+ bgimage_size_manager.dump_css(f_css.fs);
// print css
- double print_scale = 96.0 / DEFAULT_DPI / text_zoom_factor();
+ double ps = print_scale();
f_css.fs << CSS::PRINT_ONLY << "{" << endl;
- transform_matrix_manager.dump_print_css(f_css.fs, print_scale);
- letter_space_manager .dump_print_css(f_css.fs, print_scale);
- stroke_color_manager .dump_print_css(f_css.fs, print_scale);
- word_space_manager .dump_print_css(f_css.fs, print_scale);
- whitespace_manager .dump_print_css(f_css.fs, print_scale);
- fill_color_manager .dump_print_css(f_css.fs, print_scale);
- font_size_manager .dump_print_css(f_css.fs, print_scale);
- bottom_manager .dump_print_css(f_css.fs, print_scale);
- height_manager .dump_print_css(f_css.fs, print_scale);
- width_manager .dump_print_css(f_css.fs, print_scale);
- rise_manager .dump_print_css(f_css.fs, print_scale);
- left_manager .dump_print_css(f_css.fs, print_scale);
+ transform_matrix_manager.dump_print_css(f_css.fs, ps);
+ letter_space_manager .dump_print_css(f_css.fs, ps);
+ stroke_color_manager .dump_print_css(f_css.fs, ps);
+ word_space_manager .dump_print_css(f_css.fs, ps);
+ whitespace_manager .dump_print_css(f_css.fs, ps);
+ fill_color_manager .dump_print_css(f_css.fs, ps);
+ font_size_manager .dump_print_css(f_css.fs, ps);
+ bottom_manager .dump_print_css(f_css.fs, ps);
+ height_manager .dump_print_css(f_css.fs, ps);
+ width_manager .dump_print_css(f_css.fs, ps);
+ rise_manager .dump_print_css(f_css.fs, ps);
+ left_manager .dump_print_css(f_css.fs, ps);
+ bgimage_size_manager.dump_print_css(f_css.fs, ps);
f_css.fs << "}" << endl;
}
diff --git a/src/HTMLRenderer/state.cc b/src/HTMLRenderer/state.cc
index 92ceabb..aea5113 100644
--- a/src/HTMLRenderer/state.cc
+++ b/src/HTMLRenderer/state.cc
@@ -346,7 +346,7 @@ void HTMLRenderer::check_state_change(GfxState * state)
}
// fill color
- if(all_changed || fill_color_changed)
+ if((!(param->fallback)) && (all_changed || fill_color_changed))
{
// * PDF Spec. Table 106 – Text rendering modes
static const char FILL[8] = { true, false, true, false, true, false, true, false };
@@ -369,7 +369,7 @@ void HTMLRenderer::check_state_change(GfxState * state)
}
// stroke color
- if(all_changed || stroke_color_changed)
+ if((!(param->fallback)) && (all_changed || stroke_color_changed))
{
// * PDF Spec. Table 106 – Text rendering modes
static const char STROKE[8] = { false, true, true, false, false, true, true, false };
diff --git a/src/Param.h b/src/Param.h
index 2155f8a..c6e9964 100644
--- a/src/Param.h
+++ b/src/Param.h
@@ -32,6 +32,7 @@ struct Param
std::string outline_filename;
int process_nontext;
int process_outline;
+ int fallback;
// fonts
int embed_base_font;
diff --git a/src/css_class_names.cmakelists.txt b/src/css_class_names.cmakelists.txt
index c48dbd7..0eb0ec7 100644
--- a/src/css_class_names.cmakelists.txt
+++ b/src/css_class_names.cmakelists.txt
@@ -2,19 +2,21 @@
# Note
# don't use: (otherwise conflicted with others when there is an ID suffix)
-# p f
+# p f s
set(CSS_INVALID_ID "_")
-set(CSS_LINE_CN "tl") # text line
-set(CSS_TRANSFORM_MATRIX_CN "tm") # transform matrix
+set(CSS_LINE_CN "t") # text
+set(CSS_TRANSFORM_MATRIX_CN "m") # matrix
set(CSS_PAGE_DECORATION_CN "pd") # page decoration
set(CSS_PAGE_FRAME_CN "pf") # page frame
set(CSS_PAGE_CONTENT_BOX_CN "pc") # page content
set(CSS_PAGE_DATA_CN "pi") # page info
-set(CSS_FONT_NAME_CN "fn") # font name
+set(CSS_BACKGROUND_IMAGE_CN "bi") # background image
+
+set(CSS_FONT_FAMILY_CN "ff") # font family
set(CSS_FONT_SIZE_CN "fs") # font size
set(CSS_FILL_COLOR_CN "fc") # fill color
diff --git a/src/pdf2htmlEX.cc b/src/pdf2htmlEX.cc
index a54d5bf..01ae39f 100644
--- a/src/pdf2htmlEX.cc
+++ b/src/pdf2htmlEX.cc
@@ -64,7 +64,7 @@ void parse_options (int argc, char **argv)
.add("zoom", ¶m.zoom, 0, "zoom ratio", nullptr, true)
.add("fit-width", ¶m.fit_width, 0, "fit width to
pixels", nullptr, true)
.add("fit-height", ¶m.fit_height, 0, "fit height to pixels", nullptr, true)
- .add("use-cropbox", ¶m.use_cropbox, 0, "use CropBox instead of MediaBox")
+ .add("use-cropbox", ¶m.use_cropbox, 1, "use CropBox instead of MediaBox")
.add("hdpi", ¶m.h_dpi, 144.0, "horizontal resolution for graphics in DPI")
.add("vdpi", ¶m.v_dpi, 144.0, "vertical resolution for graphics in DPI")
@@ -76,6 +76,7 @@ void parse_options (int argc, char **argv)
.add("outline-filename", ¶m.outline_filename, "", "filename of the generated outline file")
.add("process-nontext", ¶m.process_nontext, 1, "render graphics in addition to text")
.add("process-outline", ¶m.process_outline, 1, "show outline in HTML")
+ .add("fallback", ¶m.fallback, 0, "output in fallback mode")
// fonts
.add("embed-base-font", ¶m.embed_base_font, 0, "embed local match for standard 14 fonts")
@@ -104,7 +105,8 @@ void parse_options (int argc, char **argv)
// misc.
.add("clean-tmp", ¶m.clean_tmp, 1, "remove temporary files after conversion")
.add("data-dir", ¶m.data_dir, PDF2HTMLEX_DATA_PATH, "specify data directory")
- .add("css-draw", ¶m.css_draw, 0, "[experimental and unsupported] CSS drawing")
+ // TODO: css drawings are hidden on print, for annot links, need to fix it for other drawings
+// .add("css-draw", ¶m.css_draw, 0, "[experimental and unsupported] CSS drawing")
.add("debug", ¶m.debug, 0, "print debugging information")
// meta
diff --git a/src/util/StateManager.h b/src/util/StateManager.h
index e9415ee..5b3ff33 100644
--- a/src/util/StateManager.h
+++ b/src/util/StateManager.h
@@ -453,6 +453,43 @@ public:
}
};
+/////////////////////////////////////
+/*
+ * Manage the background image sizes
+ * Kind of similar with StateManager, but not exactly the same
+ * anyway temporarly leave it here
+ */
+class BGImageSizeManager
+{
+public:
+ void install(int page_no, double width, double height){
+ value_map.insert(std::make_pair(page_no, std::make_pair(width, height)));
+ }
+
+ void dump_css(std::ostream & out) {
+ for(auto iter = value_map.begin(); iter != value_map.end(); ++iter)
+ {
+ const auto & s = iter->second;
+ out << "." << CSS::PAGE_CONTENT_BOX_CN << iter->first << "{";
+ out << "background-size:" << round(s.first) << "px " << round(s.second) << "px;";
+ out << "}" << std::endl;
+ }
+ }
+
+ void dump_print_css(std::ostream & out, double scale) {
+ for(auto iter = value_map.begin(); iter != value_map.end(); ++iter)
+ {
+ const auto & s = iter->second;
+ out << "." << CSS::PAGE_CONTENT_BOX_CN << iter->first << "{";
+ out << "background-size:" << round(s.first * scale) << "pt " << round(s.second * scale) << "pt;";
+ out << "}" << std::endl;
+ }
+ }
+
+private:
+ std::unordered_map> value_map;
+};
+
} // namespace pdf2htmlEX
#endif //STATEMANAGER_H__
diff --git a/src/util/css_const.h.in b/src/util/css_const.h.in
index ff585e1..ed3221d 100644
--- a/src/util/css_const.h.in
+++ b/src/util/css_const.h.in
@@ -35,7 +35,9 @@ const char * const PAGE_FRAME_CN = "@CSS_PAGE_FRAME_CN@";
const char * const PAGE_CONTENT_BOX_CN = "@CSS_PAGE_CONTENT_BOX_CN@";
const char * const PAGE_DATA_CN = "@CSS_PAGE_DATA_CN@";
-const char * const FONT_NAME_CN = "@CSS_FONT_NAME_CN@";
+const char * const BACKGROUND_IMAGE_CN = "@CSS_BACKGROUND_IMAGE_CN@";
+
+const char * const FONT_FAMILY_CN = "@CSS_FONT_FAMILY_CN@";
const char * const FONT_SIZE_CN = "@CSS_FONT_SIZE_CN@";
const char * const FILL_COLOR_CN = "@CSS_FILL_COLOR_CN@";
const char * const STROKE_COLOR_CN = "@CSS_STROKE_COLOR_CN@";
diff --git a/src/util/ffw.c b/src/util/ffw.c
index 1e6dbb8..706cbd1 100644
--- a/src/util/ffw.c
+++ b/src/util/ffw.c
@@ -260,12 +260,14 @@ void ffw_cidflatten(void)
SFFlatten(cur_fv->sf->cidmaster);
}
+/*
+ * There is no check if a glyph with the same unicode exists!
+ */
void ffw_add_empty_char(int32_t unicode, int width)
{
- // append the new char to Enc
SplineChar * sc = SFMakeChar(cur_fv->sf, cur_fv->map, cur_fv->map->enccount);
- sc->unicodeenc = unicode;
- sc->width = width;
+ SCSetMetaData(sc, sc->name, unicode, sc->comment);
+ SCSynchronizeWidth(sc, width, sc->width, cur_fv);
}
int ffw_get_em_size(void)
@@ -319,6 +321,13 @@ void ffw_metric(double * ascent, double * descent)
sf->descent = em - bb.maxy;
*/
+ /*
+ * The embedded fonts are likely to have inconsistent values for the 3 sets of ascent/descent
+ * PDF viewers don't care, since they don't even use these values
+ * But have to unify them, for different browsers on different platforms
+ * Things may become easier when there are CSS rules for baseline-based positioning.
+ */
+
info->os2_winascent = a;
info->os2_typoascent = a;
info->hhead_ascent = a;