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
|
||||
----------------------------
|
||||
cmake . && make
|
||||
cmake . && make && sudo make install
|
||||
|
||||
HOW TO USE
|
||||
----------------------------
|
||||
bin/pdf2htmlEX /path/to/sample.pdf
|
||||
pdf2htmlEX /path/to/sample.pdf
|
||||
|
||||
|
||||
LICENSE
|
||||
|
@ -30,6 +30,31 @@
|
||||
#include "Param.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
|
||||
{
|
||||
public:
|
||||
|
@ -15,25 +15,6 @@
|
||||
|
||||
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)
|
||||
{
|
||||
|
||||
|
@ -3,8 +3,6 @@
|
||||
*
|
||||
* Hanlding general stuffs
|
||||
*
|
||||
* TODO: better name for this file?
|
||||
*
|
||||
* by WangLu
|
||||
* 2012.08.14
|
||||
*/
|
||||
@ -20,8 +18,6 @@
|
||||
|
||||
using std::flush;
|
||||
|
||||
using boost::filesystem::file_size;
|
||||
|
||||
HTMLRenderer::HTMLRenderer(const Param * param)
|
||||
:line_opened(false)
|
||||
,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);
|
||||
}
|
||||
|
||||
|
||||
doc->displayPage(this, i, param->h_dpi, param->v_dpi,
|
||||
0, true, false, false,
|
||||
nullptr, nullptr, nullptr, nullptr);
|
||||
@ -90,7 +85,8 @@ void HTMLRenderer::process(PDFDoc *doc)
|
||||
|
||||
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);
|
||||
fontscript_fout.open(tmp_dir / "pdf2htmlEX.pe", ofstream::binary);
|
||||
|
||||
@ -129,26 +125,24 @@ void HTMLRenderer::startPage(int pageNum, GfxState *state)
|
||||
|
||||
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();
|
||||
if(param->single_html)
|
||||
{
|
||||
auto path = tmp_dir / fn;
|
||||
html_fout << "'data:image/png;base64,";
|
||||
copy_base64(html_fout, ifstream(path), file_size(path));
|
||||
html_fout << "'";
|
||||
allcss_fout << "'data:image/png;base64," << base64_filter(ifstream(path, ifstream::binary)) << "'";
|
||||
}
|
||||
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;
|
||||
|
||||
html_fout << "\">" << endl;
|
||||
allcss_fout << format(");background-position:0 0;background-size:%1%px %2%px;background-repeat:no-repeat;}") % pageWidth % pageHeight;
|
||||
|
||||
cur_fn_id = cur_fs_id = cur_tm_id = cur_color_id = 0;
|
||||
cur_tx = cur_ty = 0;
|
||||
|
92
src/util.h
92
src/util.h
@ -14,10 +14,10 @@
|
||||
#include <istream>
|
||||
#include <ostream>
|
||||
#include <iterator>
|
||||
#include <iomanip>
|
||||
|
||||
#include <boost/archive/iterators/transform_width.hpp>
|
||||
#include <boost/archive/iterators/base64_from_binary.hpp>
|
||||
|
||||
#include <GfxState.h>
|
||||
#include <CharTypes.h>
|
||||
#include <UTF8.h>
|
||||
|
||||
#include "Consts.h"
|
||||
@ -25,11 +25,8 @@
|
||||
using std::istream;
|
||||
using std::ostream;
|
||||
using std::istream_iterator;
|
||||
using std::ostream_iterator;
|
||||
using std::copy;
|
||||
|
||||
using boost::archive::iterators::base64_from_binary;
|
||||
using boost::archive::iterators::transform_width;
|
||||
using std::endl;
|
||||
using std::noskipws;
|
||||
|
||||
// mute gcc warning of unused function
|
||||
namespace
|
||||
@ -123,40 +120,61 @@ public:
|
||||
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;
|
||||
copy(base64_iter(istream_iterator<char>(in)), base64_iter(istream_iterator<char>()), ostream_iterator<char>(out));
|
||||
switch(length % 3)
|
||||
public:
|
||||
|
||||
base64_filter(istream & in)
|
||||
: in_iter(istream_iterator<char>(in >> noskipws))
|
||||
{ }
|
||||
|
||||
base64_filter(istream && in)
|
||||
: in_iter(istream_iterator<char>(in >> noskipws))
|
||||
{ }
|
||||
|
||||
ostream & dumpto(ostream & out)
|
||||
{
|
||||
case 1:
|
||||
out << '=';
|
||||
// fall through
|
||||
case 2:
|
||||
out << '=';
|
||||
// fall through
|
||||
case 0:
|
||||
default:
|
||||
break;
|
||||
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 << '=';
|
||||
}
|
||||
|
||||
static inline void copy_base64 (ostream & out, istream && in, size_t length)
|
||||
{
|
||||
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)
|
||||
{
|
||||
case 1:
|
||||
out << '=';
|
||||
// fall through
|
||||
case 2:
|
||||
out << '=';
|
||||
// fall through
|
||||
case 0:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
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__
|
||||
|
Loading…
Reference in New Issue
Block a user