From bc80a79ac03ddbeab812ab1523f47c5e015facea Mon Sep 17 00:00:00 2001 From: Lu Wang Date: Wed, 6 Feb 2013 20:29:48 +0800 Subject: [PATCH] .. --- share/base.css | 1 + src/HTMLRenderer/HTMLRenderer.h | 7 ++-- src/HTMLRenderer/general.cc | 60 +++++++++++++++++++++++---------- src/util/CSSClassNames.h | 1 + src/util/StateManager.h | 28 +++++++++++++++ 5 files changed, 77 insertions(+), 20 deletions(-) diff --git a/share/base.css b/share/base.css index 4d28490..b941eb5 100644 --- a/share/base.css +++ b/share/base.css @@ -58,6 +58,7 @@ } @media print { @page { margin:0; } + html { margin:0; } body { margin:0; /* enable printing background images for WebKit */ diff --git a/src/HTMLRenderer/HTMLRenderer.h b/src/HTMLRenderer/HTMLRenderer.h index 0735e8d..2a36792 100644 --- a/src/HTMLRenderer/HTMLRenderer.h +++ b/src/HTMLRenderer/HTMLRenderer.h @@ -139,13 +139,15 @@ protected: // misc //////////////////////////////////////////////////// void pre_process(PDFDoc * doc); - void post_process(); + void post_process(void); - void process_outline(); + void process_outline(void); void process_outline_items(GooList * items); void set_stream_flags (std::ostream & out); + void dump_css(void); + // convert a LinkAction to a string that our Javascript code can understand std::string get_linkaction_str(LinkAction *, std::string & detail); @@ -222,6 +224,7 @@ protected: XRef * xref; PDFDoc * cur_doc; Catalog * cur_catalog; + int pageNum; double default_ctm[6]; diff --git a/src/HTMLRenderer/general.cc b/src/HTMLRenderer/general.cc index 07085d4..96630b5 100644 --- a/src/HTMLRenderer/general.cc +++ b/src/HTMLRenderer/general.cc @@ -160,8 +160,10 @@ void HTMLRenderer::startPage(int pageNum, GfxState *state, XRef * xref) { assert((!line_opened) && "Open line in startPage detected!"); - height_manager.install(state->getPageWidth()); - width_maanger.install(state->getPageHeight()); + this->pageNum = pageNum; + + width_manager.install(state->getPageWidth()); + height_manager.install(state->getPageHeight()); f_pages.fs << "
getPageWidth() << "px " + << state->getPageHeight() << "px;background-repeat:no-repeat;"; } f_pages.fs << "\">"; @@ -340,22 +344,9 @@ void HTMLRenderer::pre_process(PDFDoc * doc) } } -void HTMLRenderer::post_process() +void HTMLRenderer::post_process(void) { - // dump css - transform_matrix_manager.dump_css(f_css.fs); - letter_space_manager .dump_css(f_css.fs); - stroke_color_manager .dump_css(f_css.fs); - word_space_manager .dump_css(f_css.fs); - whitespace_manager .dump_css(f_css.fs); - fill_color_manager .dump_css(f_css.fs); - font_size_manager .dump_css(f_css.fs); - bottom_manager .dump_css(f_css.fs); - height_manager .dump_css(f_css.fs); - width_manager .dump_css(f_css.fs); - rise_manager .dump_css(f_css.fs); - left_manager .dump_css(f_css.fs); - + dump_css(); // close files f_outline.fs.close(); f_pages.fs.close(); @@ -447,6 +438,39 @@ void HTMLRenderer::set_stream_flags(std::ostream & out) out << hex << fixed; } +void HTMLRenderer::dump_css (void) +{ + transform_matrix_manager.dump_css(f_css.fs); + letter_space_manager .dump_css(f_css.fs); + stroke_color_manager .dump_css(f_css.fs); + word_space_manager .dump_css(f_css.fs); + whitespace_manager .dump_css(f_css.fs); + fill_color_manager .dump_css(f_css.fs); + font_size_manager .dump_css(f_css.fs); + bottom_manager .dump_css(f_css.fs); + height_manager .dump_css(f_css.fs); + width_manager .dump_css(f_css.fs); + rise_manager .dump_css(f_css.fs); + left_manager .dump_css(f_css.fs); + + // print css + double print_scale = 96.0 / DEFAULT_DPI / text_zoom_factor(); + 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); + f_css.fs << "}" << endl; +} + void HTMLRenderer::embed_file(ostream & out, const string & path, const string & type, bool copy) { string fn = get_filename(path); diff --git a/src/util/CSSClassNames.h b/src/util/CSSClassNames.h index 98d6140..8de4394 100644 --- a/src/util/CSSClassNames.h +++ b/src/util/CSSClassNames.h @@ -23,6 +23,7 @@ const char * const INVALID_ID = "_"; // work around strings // TODOsince we have this string, should this file be named as general "css.h" ? const char * const WEBKIT_ONLY = "@media screen and (-webkit-min-device-pixel-ratio:0)"; +const char * const PRINT_ONLY = "@media print"; // TODO: better names, remove collission (i.e LINE_CN vs LETTER_SPACE_CN) diff --git a/src/util/StateManager.h b/src/util/StateManager.h index db4a4bc..b84f94a 100644 --- a/src/util/StateManager.h +++ b/src/util/StateManager.h @@ -65,6 +65,15 @@ public: } } + void dump_print_css(std::ostream & out, double scale) { + for(auto iter = value_map.begin(); iter != value_map.end(); ++iter) + { + out << "." << imp->get_css_class_name() << iter->second << "{"; + imp->dump_print_value(out, iter->first, scale); + out << "}" << std::endl; + } + } + protected: // this version of install does not check if value has been updated // return if a new entry has been created @@ -128,6 +137,8 @@ public: } } + void dump_print_css(std::ostream & out, double scale) {} + protected: // return if a new entry has been created bool _install(const double * new_value) { @@ -214,6 +225,8 @@ public: } } + void dump_print_css(std::ostream & out, double scale) {} + protected: bool _install(const GfxRGB & new_value) { is_transparent = false; @@ -276,6 +289,7 @@ public: static const char * get_css_class_name (void) { return CSS::FONT_SIZE_CN; } double default_value(void) { return 0; } void dump_value(std::ostream & out, double value) { out << "font-size:" << round(value) << "px;"; } + void dump_print_value(std::ostream & out, double value, double scale) { out << "font-size:" << round(value*scale) << "pt;"; } }; class LetterSpaceManager : public StateManager @@ -284,6 +298,7 @@ public: static const char * get_css_class_name (void) { return CSS::LETTER_SPACE_CN; } double default_value(void) { return 0; } void dump_value(std::ostream & out, double value) { out << "letter-spacing:" << round(value) << "px;"; } + void dump_print_value(std::ostream & out, double value, double scale) { out << "letter-spacing:" << round(value*scale) << "pt;"; } }; class WordSpaceManager : public StateManager @@ -292,6 +307,7 @@ public: static const char * get_css_class_name (void) { return CSS::WORD_SPACE_CN;} double default_value(void) { return 0; } void dump_value(std::ostream & out, double value) { out << "word-spacing:" << round(value) << "px;"; } + void dump_print_value(std::ostream & out, double value, double scale) { out << "word-spacing:" << round(value*scale) << "pt;"; } }; class RiseManager : public StateManager @@ -300,6 +316,7 @@ public: static const char * get_css_class_name (void) { return CSS::RISE_CN; } double default_value(void) { return 0; } void dump_value(std::ostream & out, double value) { out << "top:" << round(-value) << "px;"; } + void dump_print_value(std::ostream & out, double value, double scale) { out << "top:" << round(-value*scale) << "pt;"; } }; class WhitespaceManager : public StateManager @@ -312,6 +329,13 @@ public: : "display:inline;margin-left:") << round(value) << "px;"; } + void dump_print_value(std::ostream & out, double value, double scale) + { + value *= scale; + out << ((value > 0) ? "display:inline-block;width:" + : "display:inline;margin-left:") + << round(value) << "pt;"; + } }; class WidthManager : public StateManager @@ -320,6 +344,7 @@ public: static const char * get_css_class_name (void) { return CSS::WIDTH_CN; } double default_value(void) { return 0; } void dump_value(std::ostream & out, double value) { out << "width:" << round(value) << "px;"; } + void dump_print_value(std::ostream & out, double value, double scale) { out << "width:" << round(value*scale) << "pt;"; } }; class BottomManager : public StateManager @@ -328,6 +353,7 @@ public: static const char * get_css_class_name (void) { return CSS::BOTTOM_CN; } double default_value(void) { return 0; } void dump_value(std::ostream & out, double value) { out << "bottom:" << round(value) << "px;"; } + void dump_print_value(std::ostream & out, double value, double scale) { out << "bottom:" << round(value*scale) << "pt;"; } }; class HeightManager : public StateManager @@ -336,6 +362,7 @@ public: static const char * get_css_class_name (void) { return CSS::HEIGHT_CN; } double default_value(void) { return 0; } void dump_value(std::ostream & out, double value) { out << "height:" << round(value) << "px;"; } + void dump_print_value(std::ostream & out, double value, double scale) { out << "height:" << round(value*scale) << "pt;"; } }; class LeftManager : public StateManager @@ -344,6 +371,7 @@ public: static const char * get_css_class_name (void) { return CSS::LEFT_CN; } double default_value(void) { return 0; } void dump_value(std::ostream & out, double value) { out << "left:" << round(value) << "px;"; } + void dump_print_value(std::ostream & out, double value, double scale) { out << "left:" << round(value*scale) << "pt;"; } }; class TransformMatrixManager : public StateManager