1
0
mirror of https://github.com/pdf2htmlEX/pdf2htmlEX.git synced 2024-12-22 04:50:09 +00:00

working on dumping type 3 glyphs

This commit is contained in:
Lu Wang 2013-09-19 02:41:00 +08:00
parent 2d1b810c4e
commit ea4fb47f04
3 changed files with 94 additions and 3 deletions

View File

@ -166,7 +166,8 @@ protected:
* local font: to be substituted with a local (client side) font
*/
////////////////////////////////////////////////////
std::string dump_embedded_font (GfxFont * font, long long fn_id);
std::string dump_embedded_font(GfxFont * font, long long fn_id);
std::string dump_type3_font(GfxFont * font, long long fn_id);
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);

View File

@ -21,6 +21,8 @@
#include "HTMLRenderer.h"
#include "Base64Stream.h"
#include "pdf2htmlEX-config.h"
#include "util/namespace.h"
#include "util/math.h"
#include "util/misc.h"
@ -29,6 +31,13 @@
#include "util/unicode.h"
#include "util/css_const.h"
#if ENABLE_SVG
#include <cairo.h>
#include <cairo-ft.h>
#include <cairo-svg.h>
#include "BackgroundRenderer/CairoOutputDev/CairoFontEngine.h"
#endif
namespace pdf2htmlEX {
using std::min;
@ -166,6 +175,83 @@ string HTMLRenderer::dump_embedded_font (GfxFont * font, long long fn_id)
return filepath;
}
string HTMLRenderer::dump_type3_font (GfxFont * font, long long fn_id)
{
assert(font->getFontType() == fontType3);
#if ENABLE_SVG
FT_Library ft_lib;
FT_Init_FreeType(&ft_lib);
CairoFontEngine font_engine(ft_lib);
auto * cur_font = font_engine.getFont(font, cur_doc, true, xref);
auto used_map = preprocessor.get_code_map(hash_ref(font->getID()));
double * font_bbox = font->getFontBBox();
double glyph_width = font_bbox[2] - font_bbox[0];
double glyph_height = font_bbox[3] - font_bbox[1];
glyph_width /= 10;
glyph_height /= 10;
for(int i = 0; i < 256; ++i)
{
if(!used_map[i]) continue;
cairo_glyph_t glyph;
glyph.index = cur_font->getGlyph(i, nullptr, 0);
glyph.x = 0;
glyph.y = glyph_height;
cairo_surface_t * surface = nullptr;
{
auto fn = str_fmt("/tmp/pdf2htmlEX/f%x-%x.svg", fn_id, i);
surface = cairo_svg_surface_create((char*)fn, glyph_height, glyph_width);
}
cairo_svg_surface_restrict_to_version(surface, CAIRO_SVG_VERSION_1_2);
cairo_surface_set_fallback_resolution(surface, param.h_dpi, param.v_dpi);
cairo_t * cr = cairo_create(surface);
// zoom the image to prevent CairoOutputDev from rounding/increasing thin borders
//cairo_matrix_t matrix;
/*
double * font_matrix = font->getFontMatrix();
cairo_matrix_init(&matrix, font_matrix[0], font_matrix[1], font_matrix[2], font_matrix[3], font_matrix[4], font_matrix[5]);
cairo_set_font_matrix(cr, &matrix);
*/
/*
cairo_matrix_init_identity(&matrix);
// cairo_matrix_scale(&matrix, 10, 10);
cairo_transform(cr, &matrix);
*/
cairo_set_font_size(cr, 100);
cairo_set_source_rgb(cr, 0., 0., 0.);
cairo_set_font_face(cr, cur_font->getFontFace());
cairo_show_glyphs(cr, &glyph, 1);
{
auto status = cairo_status(cr);
cairo_destroy(cr);
if(status)
throw string("Cairo error: ") + cairo_status_to_string(status);
}
cairo_surface_finish(surface);
{
auto status = cairo_surface_status(surface);
cairo_surface_destroy(surface);
surface = nullptr;
if(status)
throw string("Error in cairo: ") + cairo_status_to_string(status);
}
}
return "";
#else
return "";
#endif
}
void HTMLRenderer::embed_font(const string & filepath, GfxFont * font, FontInfo & info, bool get_metric_only)
{
if(param.debug)
@ -631,7 +717,11 @@ const FontInfo * HTMLRenderer::install_font(GfxFont * font)
<< endl;
}
if(font->getType() == fontType3) {
if(font->getType() == fontType3)
{
//test
dump_type3_font(font, new_fn_id);
cerr << "Type 3 fonts are unsupported and will be rendered as Image" << endl;
export_remote_default_font(new_fn_id);
return &new_font_info;

View File

@ -35,7 +35,7 @@ void HTMLRenderer::drawString(GfxState * state, GooString * s)
// For type 3 fonts, due to the font matrix, still it's hard to show it on HTML
if( (font == nullptr)
|| (font->getWMode())
|| (font->getType() == fontType3)
// || (font->getType() == fontType3)
)
{
return;