1
0
mirror of https://github.com/pdf2htmlEX/pdf2htmlEX.git synced 2024-12-22 13:00:08 +00:00

process outline

This commit is contained in:
Lu Wang 2013-01-28 21:01:02 +08:00
parent e0c859188e
commit a9bc242c1c
8 changed files with 122 additions and 17 deletions

View File

@ -154,6 +154,7 @@ add_executable(pdf2htmlEX
src/HTMLRenderer/TextLineBuffer.h src/HTMLRenderer/TextLineBuffer.h
src/HTMLRenderer/TextLineBuffer.cc src/HTMLRenderer/TextLineBuffer.cc
src/HTMLRenderer/link.cc src/HTMLRenderer/link.cc
src/HTMLRenderer/outline.cc
src/HTMLRenderer/state.cc src/HTMLRenderer/state.cc
src/HTMLRenderer/text.cc src/HTMLRenderer/text.cc
src/BackgroundRenderer/BackgroundRenderer.h src/BackgroundRenderer/BackgroundRenderer.h

View File

@ -1,10 +1,18 @@
/* Base CSS */ /* Base CSS */
/* Copyright 2012 Lu Wang <coolwanglu@gmail.com> */ /* Copyright 2012 Lu Wang <coolwanglu@gmail.com> */
#pdf-main { /* PDF container */ #pdf-outline { /* PDF Outline */
position:absolute; position:absolute;
top:0; top:0;
left:0; left:0;
bottom:0; bottom:0;
width:200px;
overflow:auto;
}
#pdf-main { /* PDF container */
position:absolute;
top:0;
left:200px;
bottom:0;
right:0; right:0;
overflow:auto; overflow:auto;
background-color:grey; background-color:grey;

View File

@ -129,7 +129,8 @@ var pdf2htmlEX = (function(){
//this.zoom_fixer(); //this.zoom_fixer();
this.container.on('click', '.a', this, this.annot_link_handler); // used by outline/annot_link etc
this.container.on('click', '.a', this, this.link_handler);
this.render(); this.render();
}, },
@ -231,7 +232,7 @@ var pdf2htmlEX = (function(){
return this.pages[(new Page(obj.closest('.p')[0])).n]; return this.pages[(new Page(obj.closest('.p')[0])).n];
}, },
annot_link_handler : function (e) { link_handler : function (e) {
var _ = e.data; var _ = e.data;
var t = $(e.currentTarget); var t = $(e.currentTarget);
var cur_page = _.get_containing_page(t); var cur_page = _.get_containing_page(t);

View File

@ -212,13 +212,16 @@ class HTMLRenderer : public OutputDev
void pre_process(PDFDoc * doc); void pre_process(PDFDoc * doc);
void post_process(); void post_process();
void process_outline();
void process_outline_items(GooList * items);
void set_stream_flags (std::ostream & out); void set_stream_flags (std::ostream & out);
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);
// convert a LinkDest to a string that our Javascript code can understand // convert a LinkAction to a string that our Javascript code can understand
std::string get_linkdest_str(int & pageno, LinkDest * dest); std::string get_linkaction_str(LinkAction *, std::string & detail);
//////////////////////////////////////////////////// ////////////////////////////////////////////////////
// manage styles // manage styles

View File

@ -74,6 +74,9 @@ void HTMLRenderer::process(PDFDoc *doc)
pre_process(doc); pre_process(doc);
///////////////////
// Process pages
BackgroundRenderer * bg_renderer = nullptr; BackgroundRenderer * bg_renderer = nullptr;
if(param->process_nontext) if(param->process_nontext)
{ {
@ -120,6 +123,10 @@ void HTMLRenderer::process(PDFDoc *doc)
cerr << "Working: " << page_count << "/" << page_count; cerr << "Working: " << page_count << "/" << page_count;
cerr << endl; cerr << endl;
////////////////////////
// Process Outline
process_outline();
post_process(); post_process();
if(bg_renderer) if(bg_renderer)

View File

@ -29,14 +29,16 @@ using std::endl;
/* /*
* The detailed rectangle area of the link destination * The detailed rectangle area of the link destination
* Will be parsed and performed by Javascript * Will be parsed and performed by Javascript
* The string will be put into a HTML attribute, surrounded by single quotes
* So pay attention to the characters used here
*/ */
string HTMLRenderer::get_linkdest_str(int & pageno, LinkDest * dest) static string get_linkdest_detail_str(LinkDest * dest, Catalog * catalog, int & pageno)
{ {
pageno = 0; pageno = 0;
if(dest->isPageRef()) if(dest->isPageRef())
{ {
auto pageref = dest->getPageRef(); auto pageref = dest->getPageRef();
pageno = cur_catalog->findPage(pageref.num, pageref.gen); pageno = catalog->findPage(pageref.num, pageref.gen);
} }
else else
{ {
@ -124,16 +126,11 @@ string HTMLRenderer::get_linkdest_str(int & pageno, LinkDest * dest)
return sout.str(); return sout.str();
} }
/* string HTMLRenderer::get_linkaction_str(LinkAction * action, string & detail)
* Based on pdftohtml from poppler
* TODO: CSS for link rectangles
* TODO: share rectangle draw with css-draw
*/
void HTMLRenderer::processLink(AnnotLink * al)
{ {
std::string dest_str, dest_detail_str; string dest_str;
auto action = al->getAction(); detail = "";
if(action) if(action)
{ {
auto kind = action->getKind(); auto kind = action->getKind();
@ -150,7 +147,7 @@ void HTMLRenderer::processLink(AnnotLink * al)
if(dest) if(dest)
{ {
int pageno = 0; int pageno = 0;
dest_detail_str = get_linkdest_str(pageno, dest); detail = get_linkdest_detail_str(dest, cur_catalog, pageno);
if(pageno > 0) if(pageno > 0)
{ {
dest_str = (char*)str_fmt("#p%x", pageno); dest_str = (char*)str_fmt("#p%x", pageno);
@ -181,6 +178,19 @@ void HTMLRenderer::processLink(AnnotLink * al)
} }
} }
return dest_str;
}
/*
* Based on pdftohtml from poppler
* TODO: CSS for link rectangles
* TODO: share rectangle draw with css-draw
*/
void HTMLRenderer::processLink(AnnotLink * al)
{
string dest_detail_str;
string dest_str = get_linkaction_str(al->getAction(), dest_detail_str);
if(!dest_str.empty()) if(!dest_str.empty())
{ {
f_pages.fs << "<a class=\"a\" href=\"" << dest_str << "\""; f_pages.fs << "<a class=\"a\" href=\"" << dest_str << "\"";

View File

@ -0,0 +1,72 @@
/*
* outline.cc
*
* Handling Outline items
*
* by WangLu
* 2013.01.28
*/
#include <iostream>
#include <Outline.h>
#include <goo/GooList.h>
#include "HTMLRenderer.h"
#include "util/namespace.h"
#include "util/unicode.h"
namespace pdf2htmlEX {
using std::ostream;
void HTMLRenderer::process_outline_items(GooList * items)
{
if((!items) || (items->getLength() == 0))
return;
f_outline.fs << "<ul>";
for(int i = 0; i < items->getLength(); ++i)
{
OutlineItem * item = (OutlineItem*)(items->get(i));
string detail;
string dest = get_linkaction_str(item->getAction(), detail);
// we don't care dest is empty or not.
f_outline.fs << "<li>"
<< "<a href=\"" << dest << "\"";
if(!detail.empty())
f_outline.fs << " data-dest-detail='" << detail << "'";
f_outline.fs << ">";
outputUnicodes(f_outline.fs, item->getTitle(), item->getTitleLength());
f_outline.fs << "</a>";
// check kids
item->open();
if(item->hasKids())
{
process_outline_items(item->getKids());
}
item->close();
f_outline.fs << "</li>";
}
f_outline.fs << "</ul>";
}
void HTMLRenderer::process_outline()
{
Outline * outline = cur_doc->getOutline();
if(!outline)
return;
process_outline_items(outline->getItems());
}
}// namespace pdf2htmlEX

View File

@ -33,6 +33,9 @@ Unicode unicode_from_font (CharCode code, GfxFont * font);
*/ */
Unicode check_unicode(Unicode * u, int len, CharCode code, GfxFont * font); Unicode check_unicode(Unicode * u, int len, CharCode code, GfxFont * font);
/*
* Escape necessary characters, and map Unicode to UTF-8
*/
void outputUnicodes(std::ostream & out, const Unicode * u, int uLen); void outputUnicodes(std::ostream & out, const Unicode * u, int uLen);