浏览代码

Restore some of the header footer printing

Jakob Truelsen 16 年之前
父节点
当前提交
092d9abe54
共有 3 个文件被更改,包括 118 次插入102 次删除
  1. 21 6
      src/arguments.cc
  2. 94 93
      src/wkhtmltopdf.cc
  3. 3 3
      src/wkhtmltopdf.hh

+ 21 - 6
src/arguments.cc

@@ -84,6 +84,21 @@ struct AHStrSetter: public AHSomeSetter<const char*> {
 		return desc + " (default " + def + ")";
 		return desc + " (default " + def + ")";
 	}
 	}
 };
 };
+
+//Argument handler setting a string variable
+struct AHQStrSetter: public AHSomeSetter<QString> {
+	AHQStrSetter(QString & a, QString an, QString def): AHSomeSetter<QString>(a,an,def) {};
+	bool operator() (const char ** vals, WKHtmlToPdf *) {
+		val = QString::fromUtf8(vals[0]);
+		return true;
+	}
+	virtual QString getDesc() const {
+		if (def[0] == '\0') return desc;
+		return desc + " (default " + def + ")";
+	}
+};
+
+
 //Argument handler setting a real-number/unit combo variable
 //Argument handler setting a real-number/unit combo variable
 struct AHUnitRealSetter: public AHSomeSetter<QPair<qreal, QPrinter::Unit> > {
 struct AHUnitRealSetter: public AHSomeSetter<QPair<qreal, QPrinter::Unit> > {
 	AHUnitRealSetter(QPair<qreal, QPrinter::Unit> & a, QString an, QPair<qreal, QPrinter::Unit> def): AHSomeSetter<QPair<qreal, QPrinter::Unit> >(a,an,def) {};
 	AHUnitRealSetter(QPair<qreal, QPrinter::Unit> & a, QString an, QPair<qreal, QPrinter::Unit> def): AHSomeSetter<QPair<qreal, QPrinter::Unit> >(a,an,def) {};
@@ -438,18 +453,18 @@ void WKHtmlToPdf::initArgs() {
 	addarg("copies", 0, "Number of copies to print into the pdf file", new AHIntSetter(copies, "number", 1));
 	addarg("copies", 0, "Number of copies to print into the pdf file", new AHIntSetter(copies, "number", 1));
 #ifdef __EXTENSIVE_WKHTMLTOPDF_QT_HACK__
 #ifdef __EXTENSIVE_WKHTMLTOPDF_QT_HACK__
 	addarg("default-header",'H',"Add a default header, with the name of the page to the left, and the page number to the right, this is short for: --header-left='[webpage]' --header-right='[page]/[toPage]' --top 2cm --header-line", new AHCaller<DefaultHeaderFunc>());
 	addarg("default-header",'H',"Add a default header, with the name of the page to the left, and the page number to the right, this is short for: --header-left='[webpage]' --header-right='[page]/[toPage]' --top 2cm --header-line", new AHCaller<DefaultHeaderFunc>());
-	addarg("footer-center",0,"Centered footer text", new AHStrSetter(footer_center,"text",""));
+	addarg("footer-center",0,"Centered footer text", new AHQStrSetter(footer_center,"text",""));
 	addarg("footer-font-name",0,"Set footer font name", new AHStrSetter(footer_font_name,"name","Arial"));;
 	addarg("footer-font-name",0,"Set footer font name", new AHStrSetter(footer_font_name,"name","Arial"));;
 	addarg("footer-font-size",0,"Set footer font size", new AHIntSetter(footer_font_size,"size",11));
 	addarg("footer-font-size",0,"Set footer font size", new AHIntSetter(footer_font_size,"size",11));
-	addarg("footer-left",0,"Left aligned footer text", new AHStrSetter(footer_left,"text",""));
+	addarg("footer-left",0,"Left aligned footer text", new AHQStrSetter(footer_left,"text",""));
 	addarg("footer-line",0,"Display line above the footer", new AHConstSetter<bool>(footer_line,true,false));
 	addarg("footer-line",0,"Display line above the footer", new AHConstSetter<bool>(footer_line,true,false));
-	addarg("footer-right",0,"Right aligned footer text", new AHStrSetter(footer_right,"text",""));
-	addarg("header-center",0,"Centered header text", new AHStrSetter(header_center,"text",""));
+	addarg("footer-right",0,"Right aligned footer text", new AHQStrSetter(footer_right,"text",""));
+	addarg("header-center",0,"Centered header text", new AHQStrSetter(header_center,"text",""));
 	addarg("header-font-name",0,"Set header font name", new AHStrSetter(header_font_name,"name","Arial"));
 	addarg("header-font-name",0,"Set header font name", new AHStrSetter(header_font_name,"name","Arial"));
 	addarg("header-font-size",0,"Set header font size", new AHIntSetter(header_font_size,"size",11));
 	addarg("header-font-size",0,"Set header font size", new AHIntSetter(header_font_size,"size",11));
-	addarg("header-left",0,"Left aligned header text", new AHStrSetter(header_left,"text",""));
+	addarg("header-left",0,"Left aligned header text", new AHQStrSetter(header_left,"text",""));
 	addarg("header-line",0,"Display line below the header", new AHConstSetter<bool>(header_line,true,false));
 	addarg("header-line",0,"Display line below the header", new AHConstSetter<bool>(header_line,true,false));
-	addarg("header-right",0,"Right aligned header text", new AHStrSetter(header_right,"text",""));
+	addarg("header-right",0,"Right aligned header text", new AHQStrSetter(header_right,"text",""));
 	addarg("page-offset",0,"Set the starting page number", new AHIntSetter(page_offset,"offset",1));
 	addarg("page-offset",0,"Set the starting page number", new AHIntSetter(page_offset,"offset",1));
 
 
 	addarg("toc",'t',"Insert a table of content in the beginning of the document", new AHConstSetter<bool>(print_toc,true,false));
 	addarg("toc",'t',"Insert a table of content in the beginning of the document", new AHConstSetter<bool>(print_toc,true,false));

+ 94 - 93
src/wkhtmltopdf.cc

@@ -232,7 +232,7 @@ void WKHtmlToPdf::run(int argc, const char ** argv) {
 		//Once the loading is done we want loadFinished to be called
 		//Once the loading is done we want loadFinished to be called
 		connect(page, SIGNAL(loadFinished(bool)), this, SLOT(loadFinished(bool)));
 		connect(page, SIGNAL(loadFinished(bool)), this, SLOT(loadFinished(bool)));
 		connect(page, SIGNAL(loadStarted()), this, SLOT(loadStarted()));
 		connect(page, SIGNAL(loadStarted()), this, SLOT(loadStarted()));
-		//Disable stuff we don't need
+
 		page->mainFrame()->setZoomFactor(zoom_factor);
 		page->mainFrame()->setZoomFactor(zoom_factor);
 		QString u= in[i];
 		QString u= in[i];
 		if (u == "-") {
 		if (u == "-") {
@@ -419,10 +419,10 @@ void WKHtmlToPdf::preparePrint() {
    	}
    	}
 	actualPages *= copies;
 	actualPages *= copies;
 	int page=1;
 	int page=1;
-	headerFooterLoading = 0;
-
-	html_header="header.html";
 
 
+	headerFooterLoading =
+		(html_header.isEmpty()?0:actualPages) +
+		(html_footer.isEmpty()?0:actualPages);
 	if(!html_header.isEmpty() || !html_header.isEmpty()) {
 	if(!html_header.isEmpty() || !html_header.isEmpty()) {
 		for(int d=0; d < pages.size(); ++d) {
 		for(int d=0; d < pages.size(); ++d) {
 			if (cover[0] && d == 0) continue;
 			if (cover[0] && d == 0) continue;
@@ -453,68 +453,72 @@ QWebPage * WKHtmlToPdf::loadHeaderFooter(QString url, int d, int page) {
 	QWebPage * p = new QWebPage();
 	QWebPage * p = new QWebPage();
 	p->setNetworkAccessManager(am);
 	p->setNetworkAccessManager(am);
 	connect(p, SIGNAL(loadFinished(bool)), this, SLOT(headerFooterLoadFinished(bool)));
 	connect(p, SIGNAL(loadFinished(bool)), this, SLOT(headerFooterLoadFinished(bool)));
-	connect(p, SIGNAL(loadStarted()), this, SLOT(headerFooterLoadStarted()));
-	p->mainFrame()->setZoomFactor(zoom_factor);
-
+	p->mainFrame()->setZoomFactor(1);
 	p->mainFrame()->load(u);
 	p->mainFrame()->load(u);
 	return p;
 	return p;
 }
 }
 
 
-void WKHtmlToPdf::headerFooterLoadStarted() {
-	headerFooterLoading.ref();
-}
+//void WKHtmlToPdf::headerFooterLoadStarted() {
+//	headerFooterLoading.ref();
+//}
 
 
 void WKHtmlToPdf::headerFooterLoadFinished(bool) {
 void WKHtmlToPdf::headerFooterLoadFinished(bool) {
 	headerFooterLoading.deref();
 	headerFooterLoading.deref();
-	//qDebug() << "hat";
+	qDebug() << "hat";
 	if (headerFooterLoading == 0) {
 	if (headerFooterLoading == 0) {
+		
 		//Wait a little while for js-redirects, and then print
 		//Wait a little while for js-redirects, and then print
 		QTimer::singleShot(100, this, SLOT(printPage()));
 		QTimer::singleShot(100, this, SLOT(printPage()));
 	}
 	}
 }
 }
 
 
+struct MThread: public QThread {
+	static void msleep(unsigned long l) {
+		QThread::msleep(l);
+	}
+};
+
+
 void WKHtmlToPdf::printPage() {
 void WKHtmlToPdf::printPage() {
 	if (headerFooterLoading != 0 || loading != 0) return;
 	if (headerFooterLoading != 0 || loading != 0) return;
 
 
-	QPrinter p2(resolution);
-	if (dpi != -1) p2.setResolution(dpi);
-	p2.setOutputFormat(
-		strcmp(out + (strlen(out)-3),".ps")==0?
-		QPrinter::PostScriptFormat : QPrinter::PdfFormat
-		);
-	p2.setOutputFileName("foo.pdf");
-	
-	//Setup margins and papersize
-	p2.setPageMargins(margin_left.first, margin_top.first,
-					  margin_right.first, margin_bottom.first,
-					  margin_left.second);
-	p2.setPageSize(pageSize);
-	p2.setOrientation(orientation);
-	p2.setColorMode(colorMode);
-	QPainter pa2;
-	pa2.begin(&p2);
-	
-// 	for (int i=0; i < in.size(); ++i) {
-// 		currentPage = i;
-// 		if (i != 0) printer.newPage();
-// 		if (print_toc && i == (cover[0] == '\0'?0:1)) {
-// 			currentPage = -1;
-// 			tocPrinter.print(root, &printer, &painter);
-// 			printer.newPage();
-// 			currentPage = i;
-// 		}
-// 		pages[i]->mainFrame()->print(&printer,&painter, printMediaType);
-// 	}
  	bool first=true;
  	bool first=true;
  	int actualPage=1;
  	int actualPage=1;
  	int cc=collate?copies:1;
  	int cc=collate?copies:1;
  	int pc=collate?1:copies;
  	int pc=collate?1:copies;
-   
+	
+	bool hasHeaderFooter = header_line || footer_line
+		|| !header_left.isEmpty() || !header_center.isEmpty() || !header_right.isEmpty()
+		|| !footer_left.isEmpty() || !footer_center.isEmpty() || !footer_right.isEmpty();
+
 	for(int cc_=0; cc_ < cc; ++cc_) {
 	for(int cc_=0; cc_ < cc; ++cc_) {
 		//TODO print front here
 		//TODO print front here
 		//TODO print TOC here
 		//TODO print TOC here
+		
+// 		QPicture picture;
+
+// 		while(true) {
+// 			picture.setBoundingRect(
+// 				QRect(0,0,
+// 					  printer->pageRect().width() * picture.logicalDpiX()/printer->logicalDpiX(),
+// 					  printer->pageRect().height() * picture.logicalDpiY()/printer->logicalDpiY()));
+			
+// 			QPainter p;
+// 			p.begin(&picture);
+// 			qDebug() << picture.boundingRect();
+// 			QWebPrinter wp(headers[0]->mainFrame(), &picture, p);
+// 			wp.spoolPage(1);
+// 			float h = wp.elementLocation(headers[0]->mainFrame()->findFirstElement("body")).second.height() * printer->logicalDpiY() /picture.logicalDpiY();
+// 			p.end();
+// 			if(h < 100000) break;
+// 			qDebug() << h;
+// 			picture = QPicture();
+// 		}
+
+		int logicalPage=1;
 		for(int d=0; d < pages.size(); ++d) {
 		for(int d=0; d < pages.size(); ++d) {
 			painter->save();
 			painter->save();
+			
 			QWebPrinter wp(pages[d]->mainFrame(), printer, *painter);
 			QWebPrinter wp(pages[d]->mainFrame(), printer, *painter);
 			QString l1=pages[d]->mainFrame()->url().path().split("/").back()+"#";
 			QString l1=pages[d]->mainFrame()->url().path().split("/").back()+"#";
 			QString l2=pages[d]->mainFrame()->url().toString() + "#";
 			QString l2=pages[d]->mainFrame()->url().toString() + "#";
@@ -534,7 +538,8 @@ void WKHtmlToPdf::printPage() {
 			for(QVector< QPair<QWebElement,QString> >::iterator i=externalLinks[d].begin();
 			for(QVector< QPair<QWebElement,QString> >::iterator i=externalLinks[d].begin();
 				i != externalLinks[d].end(); ++i)
 				i != externalLinks[d].end(); ++i)
 				myExternalLinks[wp.elementLocation(i->first).first].push_back(*i);
 				myExternalLinks[wp.elementLocation(i->first).first].push_back(*i);
-								
+						
+			MThread::msleep(100);
 			for(int p=0; p < wp.pageCount(); ++p) {
 			for(int p=0; p < wp.pageCount(); ++p) {
 				for(int pc_=0; pc_ < pc; ++pc_) {
 				for(int pc_=0; pc_ < pc; ++pc_) {
  					if (!quiet) {
  					if (!quiet) {
@@ -546,6 +551,7 @@ void WKHtmlToPdf::printPage() {
 					else
 					else
 						printer->newPage();
 						printer->newPage();
 
 
+
 					wp.spoolPage(p+1);
 					wp.spoolPage(p+1);
 					
 					
 					for(QHash<QString, QWebElement>::iterator i=myAnchors[p+1].begin();
 					for(QHash<QString, QWebElement>::iterator i=myAnchors[p+1].begin();
@@ -565,28 +571,57 @@ void WKHtmlToPdf::printPage() {
 					}
 					}
 					++actualPage;
 					++actualPage;
 
 
-
-// 					QTransform t;
-// 					{
-// 						pa2.save();
-// 						QWebPrinter whp2(headers[0]->mainFrame(), &p2, pa2);
-// 						whp2.spoolPage(1);
-// 						t = pa2.transform();
-// 						pa2.restore();
-// 					}
-					{
+					if(hasHeaderFooter && (!cover[0] || d != 0)) {
+						//Webkit used all kinds of crasy cordinate transformation, and font setup
+						//We save it here and restore some sane defaults
 						painter->save();
 						painter->save();
 						painter->resetTransform();
 						painter->resetTransform();
-						QWebPrinter whp(headers[0]->mainFrame(), printer, *painter);		
-						qreal off=t.mapRect(
-							whp.elementLocation(headers[0]->mainFrame()->findFirstElement("body")).second).height();
-						qDebug() << off;
-						painter->translate(0,-off);
-						whp.spoolPage(1);
+						
+						int h=printer->height();
+						int w=printer->width();
+						
+						//If needed draw the header line
+						if (header_line) painter->drawLine(0,0,w,0);
+						//Guess the height of the header text
+						painter->setFont(QFont(header_font_name, header_font_size));
+						int dy = painter->boundingRect(0,0,w,h,Qt::AlignTop,"M").height();
+						//Draw the header text
+						QRect r=QRect(0,0-dy,w,h);
+						painter->drawText(r, Qt::AlignTop | Qt::AlignLeft, hfreplace(header_left));
+						painter->drawText(r, Qt::AlignTop | Qt::AlignHCenter, hfreplace(header_center));
+						painter->drawText(r, Qt::AlignTop | Qt::AlignRight, hfreplace(header_right));
+						
+						//IF needed draw the footer line
+						if (footer_line) painter->drawLine(0,h,w,h);
+						//Guess the height of the footer text
+						painter->setFont(QFont(footer_font_name, footer_font_size));
+						dy = painter->boundingRect(0,0,w,h,Qt::AlignTop,"M").height();
+						//Draw the fooder text
+						r=QRect(0,0,w,h+dy);
+						painter->drawText(r, Qt::AlignBottom | Qt::AlignLeft, hfreplace(footer_left));
+						painter->drawText(r, Qt::AlignBottom | Qt::AlignHCenter, hfreplace(footer_center));
+						painter->drawText(r, Qt::AlignBottom | Qt::AlignRight, hfreplace(footer_right));
+						
+						//Restore webkits crasy scaling and font settings
 						painter->restore();
 						painter->restore();
 					}
 					}
- 				}
 
 
+
+// 					painter->save();
+// 					painter->resetTransform();
+// 					painter->drawPicture(0,-208 - 4, picture);
+// 					painter->restore();
+// 					{
+// 						painter->save();
+// 						
+// 						//MThread::msleep(100);
+// 						painter->translate(0,-222);
+// 						QWebPrinter whp(headers[0]->mainFrame(), printer, *painter);
+// 						//painter->translate(0,-whp.elementLocation(headers[0]->mainFrame()->findFirstElement("body")).second.height());
+// 						whp.spoolPage(1);
+// 					}
+				}
+				if (!cover[0] || d != 0) ++logicalPage;
 			}
 			}
 			painter->restore();
 			painter->restore();
 		}
 		}
@@ -595,40 +630,6 @@ void WKHtmlToPdf::printPage() {
 // #ifdef  __EXTENSIVE_WKHTMLTOPDF_QT_HACK__
 // #ifdef  __EXTENSIVE_WKHTMLTOPDF_QT_HACK__
 // 	if (currentPage == 0 && cover[0]) return;
 // 	if (currentPage == 0 && cover[0]) return;
 // #endif
 // #endif
-// 	//Get the painter assosiated with the printer
-// 	QPainter & painter = *printer->paintEngine()->painter();
-
-// 	//Webkit used all kinds of crasy cordinate transformation, and font setup
-// 	//We save it here and restore some sane defaults
-// 	painter.save();
-// 	
-// 	int h=printer->pageRect().height();
-// 	int w=printer->pageRect().width();
-
-// 	//If needed draw the header line
-// 	if (header_line) painter.drawLine(0,0,w,0);
-// 	//Guess the height of the header text
-// 	painter.setFont(QFont(header_font_name, header_font_size));
-// 	int dy = painter.boundingRect(0,0,w,h,Qt::AlignTop,"M").height();
-// 	//Draw the header text
-// 	QRect r=QRect(0,0-dy,w,h);
-// 	painter.drawText(r, Qt::AlignTop | Qt::AlignLeft, hfreplace(QString::fromUtf8(header_left)));
-// 	painter.drawText(r, Qt::AlignTop | Qt::AlignHCenter, hfreplace(QString::fromUtf8(header_center)));
-// 	painter.drawText(r, Qt::AlignTop | Qt::AlignRight, hfreplace(QString::fromUtf8(header_right)));
-
-// 	//IF needed draw the footer line
-// 	if (footer_line) painter.drawLine(0,h,w,h);
-// 	//Guess the height of the footer text
-// 	painter.setFont(QFont(footer_font_name, footer_font_size));
-// 	dy = painter.boundingRect(0,0,w,h,Qt::AlignTop,"M").height();
-// 	//Draw the fooder text
-// 	r=QRect(0,0,w,h+dy);
-// 	painter.drawText(r, Qt::AlignBottom | Qt::AlignLeft, hfreplace(QString::fromUtf8(footer_left)));
-// 	painter.drawText(r, Qt::AlignBottom | Qt::AlignHCenter, hfreplace(QString::fromUtf8(footer_center)));
-// 	painter.drawText(r, Qt::AlignBottom | Qt::AlignRight, hfreplace(QString::fromUtf8(footer_right)));
-
-// 	//Restore wkebkits crasy scaling and font settings
-// 	painter.restore();
 // }
 // }
 
 
 // 	}
 // 	}

+ 3 - 3
src/wkhtmltopdf.hh

@@ -106,9 +106,9 @@ public:
 	//Header / footer settings
 	//Header / footer settings
 	int header_font_size, footer_font_size;
 	int header_font_size, footer_font_size;
 	const char * header_font_name, * footer_font_name;
 	const char * header_font_name, * footer_font_name;
-	const char * header_left, * header_center, * header_right;
+	QString header_left, header_center, header_right;
 	bool header_line, footer_line;
 	bool header_line, footer_line;
-	const char * footer_left, * footer_center, * footer_right;
+	QString footer_left, footer_center, footer_right;
 
 
 	QAtomicInt loading; //Keep track of the numer of pages loading
 	QAtomicInt loading; //Keep track of the numer of pages loading
 	QVector<QString> temp;
 	QVector<QString> temp;
@@ -173,7 +173,7 @@ public slots:
 	void preparePrint();
 	void preparePrint();
 
 
 
 
-	void headerFooterLoadStarted();
+//	void headerFooterLoadStarted();
 	void headerFooterLoadFinished(bool ok);
 	void headerFooterLoadFinished(bool ok);
 
 
 	void loadStarted();
 	void loadStarted();