mirror of
https://github.com/pdf2htmlEX/pdf2htmlEX.git
synced 2024-12-22 13:00:08 +00:00
working on dumping type 3 glyphs
This commit is contained in:
parent
2d1b810c4e
commit
ea4fb47f04
@ -166,7 +166,8 @@ protected:
|
|||||||
* local font: to be substituted with a local (client side) font
|
* 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);
|
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);
|
||||||
|
@ -21,6 +21,8 @@
|
|||||||
#include "HTMLRenderer.h"
|
#include "HTMLRenderer.h"
|
||||||
#include "Base64Stream.h"
|
#include "Base64Stream.h"
|
||||||
|
|
||||||
|
#include "pdf2htmlEX-config.h"
|
||||||
|
|
||||||
#include "util/namespace.h"
|
#include "util/namespace.h"
|
||||||
#include "util/math.h"
|
#include "util/math.h"
|
||||||
#include "util/misc.h"
|
#include "util/misc.h"
|
||||||
@ -29,6 +31,13 @@
|
|||||||
#include "util/unicode.h"
|
#include "util/unicode.h"
|
||||||
#include "util/css_const.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 {
|
namespace pdf2htmlEX {
|
||||||
|
|
||||||
using std::min;
|
using std::min;
|
||||||
@ -166,6 +175,83 @@ string HTMLRenderer::dump_embedded_font (GfxFont * font, long long fn_id)
|
|||||||
return filepath;
|
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)
|
void HTMLRenderer::embed_font(const string & filepath, GfxFont * font, FontInfo & info, bool get_metric_only)
|
||||||
{
|
{
|
||||||
if(param.debug)
|
if(param.debug)
|
||||||
@ -631,7 +717,11 @@ const FontInfo * HTMLRenderer::install_font(GfxFont * font)
|
|||||||
<< endl;
|
<< 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;
|
cerr << "Type 3 fonts are unsupported and will be rendered as Image" << endl;
|
||||||
export_remote_default_font(new_fn_id);
|
export_remote_default_font(new_fn_id);
|
||||||
return &new_font_info;
|
return &new_font_info;
|
||||||
|
@ -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
|
// For type 3 fonts, due to the font matrix, still it's hard to show it on HTML
|
||||||
if( (font == nullptr)
|
if( (font == nullptr)
|
||||||
|| (font->getWMode())
|
|| (font->getWMode())
|
||||||
|| (font->getType() == fontType3)
|
// || (font->getType() == fontType3)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
|
Loading…
Reference in New Issue
Block a user