mirror of
https://github.com/pdf2htmlEX/pdf2htmlEX.git
synced 2024-10-05 19:41:40 +00:00
draw links: better integrating with poppler
This commit is contained in:
parent
f7da11cab1
commit
e42eada963
@ -211,143 +211,18 @@ void HTMLRenderer::startPage(int pageNum, GfxState *state)
|
|||||||
|
|
||||||
void HTMLRenderer::endPage() {
|
void HTMLRenderer::endPage() {
|
||||||
close_line();
|
close_line();
|
||||||
process_links();
|
|
||||||
|
// process links before the page is closed
|
||||||
|
cur_doc->processLinks(this, pageNum);
|
||||||
|
|
||||||
// close page
|
// close page
|
||||||
html_fout << "</div></div>" << endl;
|
html_fout << "</div></div>" << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
void HTMLRenderer::pre_process()
|
|
||||||
{
|
|
||||||
// we may output utf8 characters, so always use binary
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* If single-html && !split-pages
|
|
||||||
* we have to keep the generated css file into a temporary place
|
|
||||||
* and embed it into the main html later
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* If single-html && split-page
|
|
||||||
* as there's no place to embed the css file, just leave it alone (into param->dest_dir)
|
|
||||||
*
|
|
||||||
* If !single-html
|
|
||||||
* leave it in param->dest_dir
|
|
||||||
*/
|
|
||||||
|
|
||||||
auto fn = (param->single_html && (!param->split_pages))
|
|
||||||
? str_fmt("%s/__css", param->tmp_dir.c_str())
|
|
||||||
: str_fmt("%s/%s", param->dest_dir.c_str(), param->css_filename.c_str());
|
|
||||||
|
|
||||||
if(param->single_html && (!param->split_pages))
|
|
||||||
add_tmp_file((char*)fn);
|
|
||||||
|
|
||||||
css_path = (char*)fn,
|
|
||||||
css_fout.open(css_path, ofstream::binary);
|
|
||||||
fix_stream(css_fout);
|
|
||||||
}
|
|
||||||
|
|
||||||
// if split-pages is specified, open & close the file in the process loop
|
|
||||||
// if not, open the file here:
|
|
||||||
if(!param->split_pages)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* If single-html
|
|
||||||
* we have to keep the html file (for page) into a temporary place
|
|
||||||
* because we'll have to embed css before it
|
|
||||||
*
|
|
||||||
* Otherwise just generate it
|
|
||||||
*/
|
|
||||||
auto fn = str_fmt("%s/__pages", param->tmp_dir.c_str());
|
|
||||||
add_tmp_file((char*)fn);
|
|
||||||
|
|
||||||
html_path = (char*)fn;
|
|
||||||
html_fout.open(html_path, ofstream::binary);
|
|
||||||
fix_stream(html_fout);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void HTMLRenderer::post_process()
|
|
||||||
{
|
|
||||||
// close files
|
|
||||||
html_fout.close();
|
|
||||||
css_fout.close();
|
|
||||||
|
|
||||||
//only when split-page, do we have some work left to do
|
|
||||||
if(param->split_pages)
|
|
||||||
return;
|
|
||||||
|
|
||||||
ofstream output((char*)str_fmt("%s/%s", param->dest_dir.c_str(), param->output_filename.c_str()));
|
|
||||||
fix_stream(output);
|
|
||||||
|
|
||||||
// apply manifest
|
|
||||||
ifstream manifest_fin((char*)str_fmt("%s/%s", param->data_dir.c_str(), MANIFEST_FILENAME.c_str()));
|
|
||||||
if(!manifest_fin)
|
|
||||||
throw "Cannot open the manifest file";
|
|
||||||
|
|
||||||
bool embed_string = false;
|
|
||||||
string line;
|
|
||||||
while(getline(manifest_fin, line))
|
|
||||||
{
|
|
||||||
if(line == "\"\"\"")
|
|
||||||
{
|
|
||||||
embed_string = !embed_string;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(embed_string)
|
|
||||||
{
|
|
||||||
output << line << endl;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(line.empty() || line[0] == '#')
|
|
||||||
continue;
|
|
||||||
|
|
||||||
|
|
||||||
if(line[0] == '@')
|
|
||||||
{
|
|
||||||
embed_file(output, param->data_dir + "/" + line.substr(1), "", true);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(line[0] == '$')
|
|
||||||
{
|
|
||||||
if(line == "$css")
|
|
||||||
{
|
|
||||||
embed_file(output, css_path, ".css", false);
|
|
||||||
}
|
|
||||||
else if (line == "$pages")
|
|
||||||
{
|
|
||||||
ifstream fin(html_path, ifstream::binary);
|
|
||||||
if(!fin)
|
|
||||||
throw "Cannot open read the pages";
|
|
||||||
output << fin.rdbuf();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cerr << "Warning: unknown line in manifest: " << line << endl;
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
cerr << "Warning: unknown line in manifest: " << line << endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void HTMLRenderer::process_links (void)
|
|
||||||
{
|
|
||||||
Links * links = cur_page->getLinks();
|
|
||||||
for(int i = 0; i < links->getNumLinks(); ++i)
|
|
||||||
{
|
|
||||||
AnnotLink * al = links->getLink(i);
|
|
||||||
draw_annot_link(al);
|
|
||||||
}
|
|
||||||
delete links;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Based on pdftohtml from poppler
|
* Based on pdftohtml from poppler
|
||||||
*/
|
*/
|
||||||
void HTMLRenderer::draw_annot_link (AnnotLink * al)
|
void HTMLRenderer::processLink(AnnotLink * al)
|
||||||
{
|
{
|
||||||
std::string dest_str;
|
std::string dest_str;
|
||||||
auto action = al->getAction();
|
auto action = al->getAction();
|
||||||
@ -493,6 +368,124 @@ void HTMLRenderer::draw_annot_link (AnnotLink * al)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void HTMLRenderer::pre_process()
|
||||||
|
{
|
||||||
|
// we may output utf8 characters, so always use binary
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* If single-html && !split-pages
|
||||||
|
* we have to keep the generated css file into a temporary place
|
||||||
|
* and embed it into the main html later
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* If single-html && split-page
|
||||||
|
* as there's no place to embed the css file, just leave it alone (into param->dest_dir)
|
||||||
|
*
|
||||||
|
* If !single-html
|
||||||
|
* leave it in param->dest_dir
|
||||||
|
*/
|
||||||
|
|
||||||
|
auto fn = (param->single_html && (!param->split_pages))
|
||||||
|
? str_fmt("%s/__css", param->tmp_dir.c_str())
|
||||||
|
: str_fmt("%s/%s", param->dest_dir.c_str(), param->css_filename.c_str());
|
||||||
|
|
||||||
|
if(param->single_html && (!param->split_pages))
|
||||||
|
add_tmp_file((char*)fn);
|
||||||
|
|
||||||
|
css_path = (char*)fn,
|
||||||
|
css_fout.open(css_path, ofstream::binary);
|
||||||
|
fix_stream(css_fout);
|
||||||
|
}
|
||||||
|
|
||||||
|
// if split-pages is specified, open & close the file in the process loop
|
||||||
|
// if not, open the file here:
|
||||||
|
if(!param->split_pages)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* If single-html
|
||||||
|
* we have to keep the html file (for page) into a temporary place
|
||||||
|
* because we'll have to embed css before it
|
||||||
|
*
|
||||||
|
* Otherwise just generate it
|
||||||
|
*/
|
||||||
|
auto fn = str_fmt("%s/__pages", param->tmp_dir.c_str());
|
||||||
|
add_tmp_file((char*)fn);
|
||||||
|
|
||||||
|
html_path = (char*)fn;
|
||||||
|
html_fout.open(html_path, ofstream::binary);
|
||||||
|
fix_stream(html_fout);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void HTMLRenderer::post_process()
|
||||||
|
{
|
||||||
|
// close files
|
||||||
|
html_fout.close();
|
||||||
|
css_fout.close();
|
||||||
|
|
||||||
|
//only when split-page, do we have some work left to do
|
||||||
|
if(param->split_pages)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ofstream output((char*)str_fmt("%s/%s", param->dest_dir.c_str(), param->output_filename.c_str()));
|
||||||
|
fix_stream(output);
|
||||||
|
|
||||||
|
// apply manifest
|
||||||
|
ifstream manifest_fin((char*)str_fmt("%s/%s", param->data_dir.c_str(), MANIFEST_FILENAME.c_str()));
|
||||||
|
if(!manifest_fin)
|
||||||
|
throw "Cannot open the manifest file";
|
||||||
|
|
||||||
|
bool embed_string = false;
|
||||||
|
string line;
|
||||||
|
while(getline(manifest_fin, line))
|
||||||
|
{
|
||||||
|
if(line == "\"\"\"")
|
||||||
|
{
|
||||||
|
embed_string = !embed_string;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(embed_string)
|
||||||
|
{
|
||||||
|
output << line << endl;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(line.empty() || line[0] == '#')
|
||||||
|
continue;
|
||||||
|
|
||||||
|
|
||||||
|
if(line[0] == '@')
|
||||||
|
{
|
||||||
|
embed_file(output, param->data_dir + "/" + line.substr(1), "", true);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(line[0] == '$')
|
||||||
|
{
|
||||||
|
if(line == "$css")
|
||||||
|
{
|
||||||
|
embed_file(output, css_path, ".css", false);
|
||||||
|
}
|
||||||
|
else if (line == "$pages")
|
||||||
|
{
|
||||||
|
ifstream fin(html_path, ifstream::binary);
|
||||||
|
if(!fin)
|
||||||
|
throw "Cannot open read the pages";
|
||||||
|
output << fin.rdbuf();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cerr << "Warning: unknown line in manifest: " << line << endl;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
cerr << "Warning: unknown line in manifest: " << line << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void HTMLRenderer::fix_stream (std::ostream & out)
|
void HTMLRenderer::fix_stream (std::ostream & out)
|
||||||
{
|
{
|
||||||
out << hex;
|
out << hex;
|
||||||
|
@ -128,6 +128,8 @@ class HTMLRenderer : public OutputDev
|
|||||||
|
|
||||||
virtual void drawImage(GfxState * state, Object * ref, Stream * str, int width, int height, GfxImageColorMap * colorMap, GBool interpolate, int *maskColors, GBool inlineImg);
|
virtual void drawImage(GfxState * state, Object * ref, Stream * str, int width, int height, GfxImageColorMap * colorMap, GBool interpolate, int *maskColors, GBool inlineImg);
|
||||||
|
|
||||||
|
virtual void processLink(AnnotLink * al);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
////////////////////////////////////////////////////
|
////////////////////////////////////////////////////
|
||||||
// misc
|
// misc
|
||||||
@ -135,8 +137,6 @@ class HTMLRenderer : public OutputDev
|
|||||||
void pre_process();
|
void pre_process();
|
||||||
void post_process();
|
void post_process();
|
||||||
|
|
||||||
void process_links (void);
|
|
||||||
|
|
||||||
// set flags
|
// set flags
|
||||||
void fix_stream (std::ostream & out);
|
void fix_stream (std::ostream & out);
|
||||||
|
|
||||||
@ -145,8 +145,6 @@ class HTMLRenderer : public OutputDev
|
|||||||
std::string dump_embedded_font (GfxFont * font, long long fn_id);
|
std::string dump_embedded_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);
|
||||||
|
|
||||||
void draw_annot_link(AnnotLink * al);
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////
|
////////////////////////////////////////////////////
|
||||||
// manage styles
|
// manage styles
|
||||||
////////////////////////////////////////////////////
|
////////////////////////////////////////////////////
|
||||||
|
Loading…
Reference in New Issue
Block a user