Jakob Truelsen 16 ani în urmă
părinte
comite
257b76d04f
3 a modificat fișierele cu 47 adăugiri și 35 ștergeri
  1. 3 0
      src/arguments.cc
  2. 42 35
      src/wkhtmltopdf.cc
  3. 2 0
      src/wkhtmltopdf.hh

+ 3 - 0
src/arguments.cc

@@ -461,6 +461,9 @@ void WKHtmlToPdf::initArgs() {
 	addarg("toc-disable-links",0,"Do not link from toc to sections", new AHConstSetter<bool>(tocPrinter.forward_links,false, true));
 	addarg("toc-disable-back-links",0,"Do not link from section header to toc", new AHConstSetter<bool>(tocPrinter.back_links,false,true));
 	   
+	addarg("disable-internal-links",0,"Do no make local links", new AHConstSetter<bool>(useLocalLinks,false,true));
+	addarg("disable-external-links",0,"Do no make links to remote webpages", new AHConstSetter<bool>(useExternalLinks,false,true));
+
 	addarg("print-media-type",0,"Use print media-type instead of screen", new AHConstSetter<bool>(printMediaType,true,false));
 	for (uint i=0; i < TocPrinter::levels; ++i) {
 		addarg(QString("toc-l")+QString::number(i+1)+"-font-size",0,QString("Set the font size on level ")+QString::number(i+1)+" of the toc",new AHIntSetter(tocPrinter.font_size[i],"size",12-2*i), i < 3);

+ 42 - 35
src/wkhtmltopdf.cc

@@ -327,43 +327,48 @@ void WKHtmlToPdf::printPage() {
 
 	int cc=collate?copies:1;
 	int pc=collate?1:copies;
-		
-
-	QHash<QString, int> urlToDoc;
-	for(int d=0; d < pages.size(); ++d) 
-		urlToDoc[ pages[d]->mainFrame()->url().toString(QUrl::RemoveFragment) ]  = d;
-	
+			
 	QHash<int, QHash<QString, QWebElement> > anchors;
 	QHash<int, QVector< QPair<QWebElement,QString> > > localLinks;
 	QHash<int, QVector< QPair<QWebElement,QString> > > externalLinks;
 	
 	//Find and resolve all local links
-	for(int d=0; d < pages.size(); ++d) {
-		QList<QWebElement> links = pages[d]->mainFrame()->findAllElements("a");
-		for(QList<QWebElement>::iterator i=links.begin(); i != links.end(); ++i) {
-			QUrl href=QUrl(i->attribute("href"));
-			if(href.isEmpty()) continue;
-			href=pages[d]->mainFrame()->url().resolved(href);
-			if(urlToDoc.contains(href.toString(QUrl::RemoveFragment))) {
-				int t = urlToDoc[href.toString(QUrl::RemoveFragment)];
-				QWebElement e;
-				if(!href.hasFragment()) 
-					e = pages[t]->mainFrame()->findFirstElement("body");
-				else {
-					e = pages[t]->mainFrame()->findFirstElement("a[name=\""+href.fragment()+"\"]");
-					if(e.isNull()) 
-						e = pages[t]->mainFrame()->findFirstElement("*[id=\""+href.fragment()+"\"]");
-				}
-				if(e.isNull()) {
-					qDebug() << "Unable to find target for local link " << href; 
-				} else {
-					anchors[t][href.toString()] = e;
-					localLinks[d].push_back( qMakePair(*i, href.toString()) );
-				}
-				//qDebug() << href.toString();
-			} else {
-				//qDebug() << href.toString();
-				externalLinks[d].push_back( qMakePair(*i, href.toString() ) );
+	if(useLocalLinks || useExternalLinks) {
+		QHash<QString, int> urlToDoc;
+		for(int d=0; d < pages.size(); ++d) 
+			urlToDoc[ pages[d]->mainFrame()->url().toString(QUrl::RemoveFragment) ]  = d;
+		
+		for(int d=0; d < pages.size(); ++d) {
+			if (!quiet) {
+				fprintf(stderr, "Resolving Links %d of %d      \r",d+1,pages.size());
+				fflush(stdout);
+			}
+			
+			QList<QWebElement> links = pages[d]->mainFrame()->findAllElements("a");
+			for(QList<QWebElement>::iterator i=links.begin(); i != links.end(); ++i) {
+				QUrl href=QUrl(i->attribute("href"));
+				if(href.isEmpty()) continue;
+				href=pages[d]->mainFrame()->url().resolved(href);
+				if(urlToDoc.contains(href.toString(QUrl::RemoveFragment))) {
+					if(useLocalLinks) {
+						int t = urlToDoc[href.toString(QUrl::RemoveFragment)];
+						QWebElement e;
+						if(!href.hasFragment()) 
+							e = pages[t]->mainFrame()->findFirstElement("body");
+						else {
+							e = pages[t]->mainFrame()->findFirstElement("a[name=\""+href.fragment()+"\"]");
+							if(e.isNull()) 
+								e = pages[t]->mainFrame()->findFirstElement("*[id=\""+href.fragment()+"\"]");
+						}
+						if(e.isNull())
+							qDebug() << "Unable to find target for local link " << href; 
+						else {
+							anchors[t][href.toString()] = e;
+							localLinks[d].push_back( qMakePair(*i, href.toString()) );
+						}
+					}
+				} else if(useExternalLinks)
+					externalLinks[d].push_back( qMakePair(*i, href.toString() ) );
 			}
 		}
 	}
@@ -387,6 +392,11 @@ void WKHtmlToPdf::printPage() {
 	int actualPages = 0;;
 	//Count the number of pages
 	for(int d=0; d < pages.size(); ++d) {
+		if (!quiet) {
+			fprintf(stderr, "Counting pages %d of %d      \r",d+1,pages.size());
+			fflush(stdout);
+		}
+
 		painter.save();
 		QWebPrinter wp(pages[d]->mainFrame(), &printer, painter);
 		painter.restore();
@@ -499,19 +509,16 @@ void WKHtmlToPdf::printPage() {
 					for(QHash<QString, QWebElement>::iterator i=myAnchors[p+1].begin();
 						i != myAnchors[p+1].end(); ++i) {
 						QRectF r = wp.elementLocation(i.value()).second;
-						r = painter.worldTransform().mapRect(r);
 						painter.addAnchor(r, i.key());
 					}
 					for(QVector< QPair<QWebElement,QString> >::iterator i=myLocalLinks[p+1].begin();
 						i != myLocalLinks[p+1].end(); ++i)  {
 						QRectF r = wp.elementLocation(i->first).second;
-						r = painter.worldTransform().mapRect(r);
 						painter.addLink(r, i->second);
 					}
 					for(QVector< QPair<QWebElement,QString> >::iterator i=myExternalLinks[p+1].begin();
 						i != myExternalLinks[p+1].end(); ++i)  {
 						QRectF r = wp.elementLocation(i->first).second;
-						r = painter.worldTransform().mapRect(r);
 						painter.addHyperlink(r, QUrl(i->second));
 					}
 		

+ 2 - 0
src/wkhtmltopdf.hh

@@ -73,6 +73,8 @@ public:
 	bool print_toc;
 	bool enable_plugins;
 	bool use_x11;
+	bool useExternalLinks;
+	bool useLocalLinks;
 	bool disable_javascript; //Should we disable javascript
 	bool disable_intelligent_shrinking;
 	int jsredirectwait; //How meny milliseconds should we wait for a javascrit redirect