mirror of
https://github.com/pdf2htmlEX/pdf2htmlEX.git
synced 2024-12-22 13:00:08 +00:00
background image embedding works now
This commit is contained in:
parent
786ec140f4
commit
5a157def7e
@ -35,11 +35,11 @@ Dependency
|
|||||||
|
|
||||||
HOW TO COMPILE
|
HOW TO COMPILE
|
||||||
----------------------------
|
----------------------------
|
||||||
cmake . && make
|
cmake . && make && sudo make install
|
||||||
|
|
||||||
HOW TO USE
|
HOW TO USE
|
||||||
----------------------------
|
----------------------------
|
||||||
bin/pdf2htmlEX /path/to/sample.pdf
|
pdf2htmlEX /path/to/sample.pdf
|
||||||
|
|
||||||
|
|
||||||
LICENSE
|
LICENSE
|
||||||
|
@ -30,6 +30,31 @@
|
|||||||
#include "Param.h"
|
#include "Param.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Naming Convention
|
||||||
|
*
|
||||||
|
* ID
|
||||||
|
*
|
||||||
|
* p<hex> - Page
|
||||||
|
*
|
||||||
|
* CSS classes
|
||||||
|
*
|
||||||
|
* p - Page
|
||||||
|
* l - Line
|
||||||
|
* w - White space
|
||||||
|
* i - Image
|
||||||
|
*
|
||||||
|
* Reusable CSS classes
|
||||||
|
*
|
||||||
|
* f<hex> - Font (also for font names)
|
||||||
|
* s<hex> - font Size
|
||||||
|
* w<hex> - White space
|
||||||
|
* t<hex> - Transform matrix
|
||||||
|
* c<hex> - Color
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
class HTMLRenderer : public OutputDev
|
class HTMLRenderer : public OutputDev
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -15,25 +15,6 @@
|
|||||||
|
|
||||||
using boost::algorithm::ifind_first;
|
using boost::algorithm::ifind_first;
|
||||||
|
|
||||||
/*
|
|
||||||
* CSS classes
|
|
||||||
*
|
|
||||||
* p - Page
|
|
||||||
* l - Line
|
|
||||||
* w - White space
|
|
||||||
* i - Image
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Reusable CSS classes
|
|
||||||
*
|
|
||||||
* f<hex> - Font (also for font names)
|
|
||||||
* s<hex> - font Size
|
|
||||||
* w<hex> - White space
|
|
||||||
* t<hex> - Transform matrix
|
|
||||||
* c<hex> - Color
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
void HTMLRenderer::export_remote_font(long long fn_id, const string & suffix, const string & fontfileformat, GfxFont * font)
|
void HTMLRenderer::export_remote_font(long long fn_id, const string & suffix, const string & fontfileformat, GfxFont * font)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -3,8 +3,6 @@
|
|||||||
*
|
*
|
||||||
* Hanlding general stuffs
|
* Hanlding general stuffs
|
||||||
*
|
*
|
||||||
* TODO: better name for this file?
|
|
||||||
*
|
|
||||||
* by WangLu
|
* by WangLu
|
||||||
* 2012.08.14
|
* 2012.08.14
|
||||||
*/
|
*/
|
||||||
@ -20,8 +18,6 @@
|
|||||||
|
|
||||||
using std::flush;
|
using std::flush;
|
||||||
|
|
||||||
using boost::filesystem::file_size;
|
|
||||||
|
|
||||||
HTMLRenderer::HTMLRenderer(const Param * param)
|
HTMLRenderer::HTMLRenderer(const Param * param)
|
||||||
:line_opened(false)
|
:line_opened(false)
|
||||||
,image_count(0)
|
,image_count(0)
|
||||||
@ -73,7 +69,6 @@ void HTMLRenderer::process(PDFDoc *doc)
|
|||||||
bg_renderer->getBitmap()->writeImgFile(splashFormatPng, (char*)(working_dir() / (format("p%|1$x|.png")%i).str()).c_str(), param->h_dpi2, param->v_dpi2);
|
bg_renderer->getBitmap()->writeImgFile(splashFormatPng, (char*)(working_dir() / (format("p%|1$x|.png")%i).str()).c_str(), param->h_dpi2, param->v_dpi2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
doc->displayPage(this, i, param->h_dpi, param->v_dpi,
|
doc->displayPage(this, i, param->h_dpi, param->v_dpi,
|
||||||
0, true, false, false,
|
0, true, false, false,
|
||||||
nullptr, nullptr, nullptr, nullptr);
|
nullptr, nullptr, nullptr, nullptr);
|
||||||
@ -90,7 +85,8 @@ void HTMLRenderer::process(PDFDoc *doc)
|
|||||||
|
|
||||||
void HTMLRenderer::pre_process()
|
void HTMLRenderer::pre_process()
|
||||||
{
|
{
|
||||||
html_fout.open(working_dir() / param->output_filename, ofstream::binary); // we may output utf8 characters, so use binary
|
// we may output utf8 characters, so use binary
|
||||||
|
html_fout.open(working_dir() / param->output_filename, ofstream::binary);
|
||||||
allcss_fout.open(working_dir() / "all.css", ofstream::binary);
|
allcss_fout.open(working_dir() / "all.css", ofstream::binary);
|
||||||
fontscript_fout.open(tmp_dir / "pdf2htmlEX.pe", ofstream::binary);
|
fontscript_fout.open(tmp_dir / "pdf2htmlEX.pe", ofstream::binary);
|
||||||
|
|
||||||
@ -129,27 +125,25 @@ void HTMLRenderer::startPage(int pageNum, GfxState *state)
|
|||||||
|
|
||||||
assert(!line_opened);
|
assert(!line_opened);
|
||||||
|
|
||||||
html_fout << format("<div id=\"page-%3%\" class=\"p\" style=\"width:%1%px;height:%2%px;") % pageWidth % pageHeight % pageNum;
|
html_fout << format("<div id=\"p%|1$x|\" class=\"p\">") % pageNum << endl;
|
||||||
|
|
||||||
html_fout << "background-image:url(";
|
allcss_fout << format("#p%|1$x|{width:%2%px;height:%3%px;") % pageNum % pageWidth % pageHeight;
|
||||||
|
|
||||||
|
allcss_fout << "background-image:url(";
|
||||||
|
|
||||||
const std::string fn = (format("p%|1$x|.png") % pageNum).str();
|
const std::string fn = (format("p%|1$x|.png") % pageNum).str();
|
||||||
if(param->single_html)
|
if(param->single_html)
|
||||||
{
|
{
|
||||||
auto path = tmp_dir / fn;
|
auto path = tmp_dir / fn;
|
||||||
html_fout << "'data:image/png;base64,";
|
allcss_fout << "'data:image/png;base64," << base64_filter(ifstream(path, ifstream::binary)) << "'";
|
||||||
copy_base64(html_fout, ifstream(path), file_size(path));
|
|
||||||
html_fout << "'";
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
html_fout << fn;
|
allcss_fout << fn;
|
||||||
}
|
}
|
||||||
|
|
||||||
html_fout << format(");background-position:0 0;background-size:%1%px %2%px;background-repeat:no-repeat;") % pageWidth % pageHeight;
|
allcss_fout << format(");background-position:0 0;background-size:%1%px %2%px;background-repeat:no-repeat;}") % pageWidth % pageHeight;
|
||||||
|
|
||||||
html_fout << "\">" << endl;
|
|
||||||
|
|
||||||
cur_fn_id = cur_fs_id = cur_tm_id = cur_color_id = 0;
|
cur_fn_id = cur_fs_id = cur_tm_id = cur_color_id = 0;
|
||||||
cur_tx = cur_ty = 0;
|
cur_tx = cur_ty = 0;
|
||||||
cur_font_size = 0;
|
cur_font_size = 0;
|
||||||
|
94
src/util.h
94
src/util.h
@ -14,10 +14,10 @@
|
|||||||
#include <istream>
|
#include <istream>
|
||||||
#include <ostream>
|
#include <ostream>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
|
#include <iomanip>
|
||||||
|
|
||||||
#include <boost/archive/iterators/transform_width.hpp>
|
#include <GfxState.h>
|
||||||
#include <boost/archive/iterators/base64_from_binary.hpp>
|
#include <CharTypes.h>
|
||||||
|
|
||||||
#include <UTF8.h>
|
#include <UTF8.h>
|
||||||
|
|
||||||
#include "Consts.h"
|
#include "Consts.h"
|
||||||
@ -25,11 +25,8 @@
|
|||||||
using std::istream;
|
using std::istream;
|
||||||
using std::ostream;
|
using std::ostream;
|
||||||
using std::istream_iterator;
|
using std::istream_iterator;
|
||||||
using std::ostream_iterator;
|
using std::endl;
|
||||||
using std::copy;
|
using std::noskipws;
|
||||||
|
|
||||||
using boost::archive::iterators::base64_from_binary;
|
|
||||||
using boost::archive::iterators::transform_width;
|
|
||||||
|
|
||||||
// mute gcc warning of unused function
|
// mute gcc warning of unused function
|
||||||
namespace
|
namespace
|
||||||
@ -123,40 +120,61 @@ public:
|
|||||||
double _[6];
|
double _[6];
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline void copy_base64 (ostream & out, istream & in, size_t length)
|
class base64_filter
|
||||||
{
|
{
|
||||||
typedef base64_from_binary < transform_width < istream_iterator<char>, 6, 8 > > base64_iter;
|
public:
|
||||||
copy(base64_iter(istream_iterator<char>(in)), base64_iter(istream_iterator<char>()), ostream_iterator<char>(out));
|
|
||||||
switch(length % 3)
|
|
||||||
{
|
|
||||||
case 1:
|
|
||||||
out << '=';
|
|
||||||
// fall through
|
|
||||||
case 2:
|
|
||||||
out << '=';
|
|
||||||
// fall through
|
|
||||||
case 0:
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void copy_base64 (ostream & out, istream && in, size_t length)
|
base64_filter(istream & in)
|
||||||
{
|
: in_iter(istream_iterator<char>(in >> noskipws))
|
||||||
typedef base64_from_binary < transform_width < istream_iterator<char>, 6, 8 > > base64_iter;
|
{ }
|
||||||
copy(base64_iter(istream_iterator<char>(in)), base64_iter(istream_iterator<char>()), ostream_iterator<char>(out));
|
|
||||||
switch(length % 3)
|
base64_filter(istream && in)
|
||||||
|
: in_iter(istream_iterator<char>(in >> noskipws))
|
||||||
|
{ }
|
||||||
|
|
||||||
|
ostream & dumpto(ostream & out)
|
||||||
{
|
{
|
||||||
case 1:
|
unsigned char buf[3];
|
||||||
|
istream_iterator<char> end_iter;
|
||||||
|
int cnt = 0;
|
||||||
|
while(in_iter != end_iter)
|
||||||
|
{
|
||||||
|
buf[cnt++] = *(in_iter++);
|
||||||
|
if(cnt == 3)
|
||||||
|
{
|
||||||
|
out << base64_encoding[(buf[0] & 0xfc)>>2];
|
||||||
|
out << base64_encoding[((buf[0] & 0x03)<<4) | ((buf[1] & 0xf0)>>4)];
|
||||||
|
out << base64_encoding[((buf[1] & 0x0f)<<2) | ((buf[2] & 0xc0)>>6)];
|
||||||
|
out << base64_encoding[(buf[2] & 0x3f)];
|
||||||
|
cnt = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(cnt > 0)
|
||||||
|
{
|
||||||
|
for(int i = cnt; i < 3; ++i)
|
||||||
|
buf[i] = 0;
|
||||||
|
out << base64_encoding[(buf[0] & 0xfc)>>2];
|
||||||
|
out << base64_encoding[((buf[0] & 0x03)<<4) | ((buf[1] & 0xf0)>>4)];
|
||||||
|
if(cnt > 1)
|
||||||
|
{
|
||||||
|
out << base64_encoding[(buf[1] & 0x0f)<<2];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
out << '=';
|
||||||
|
}
|
||||||
out << '=';
|
out << '=';
|
||||||
// fall through
|
}
|
||||||
case 2:
|
|
||||||
out << '=';
|
return out;
|
||||||
// fall through
|
|
||||||
case 0:
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
private:
|
||||||
|
static constexpr const char * base64_encoding = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||||
|
istream_iterator<char> in_iter;
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline ostream & operator << (ostream & out, base64_filter & bf) { return bf.dumpto(out); }
|
||||||
|
static inline ostream & operator << (ostream & out, base64_filter && bf) { return bf.dumpto(out); }
|
||||||
|
|
||||||
#endif //UTIL_H__
|
#endif //UTIL_H__
|
||||||
|
Loading…
Reference in New Issue
Block a user