Browse Source

Merge branch 'dpi_fix' of https://github.com/pvandertak/wkhtmltopdf

Ashish Kulkarni 8 years ago
parent
commit
96b03ae078

+ 1 - 1
qt

@@ -1 +1 @@
-Subproject commit fe05fcdea8259bd55d9c7a5c5a5b520e4f9b0583
+Subproject commit c0cfa03a072789550d8ff5724b2e5e58436e02d1

+ 1 - 1
src/lib/imageconverter.cc

@@ -45,7 +45,7 @@ namespace wkhtmltopdf {
 
 ImageConverterPrivate::ImageConverterPrivate(ImageConverter & o, wkhtmltopdf::settings::ImageGlobal & s, const QString * data):
 	settings(s),
-	loader(s.loadGlobal, true),
+	loader(s.loadGlobal, 96, true),
 	out(o) {
 	out.emitCheckboxSvgs(s.loadPage);
 	if (data) inputData = *data;

+ 8 - 5
src/lib/multipageloader.cc

@@ -213,7 +213,10 @@ ResourceObject::ResourceObject(MultiPageLoaderPrivate & mpl, const QUrl & u, con
 	}
 
 	webPage.setNetworkAccessManager(&networkAccessManager);
-	webPage.mainFrame()->setZoomFactor(settings.zoomFactor);
+
+	double devicePixelRatio = multiPageLoader.dpi / 96.; // The used version of WebKit always renders at 96 DPI when no zoom is applied. It does not fully support a device pixel ratio != 1 natively.
+	webPage.mainFrame()->setZoomFactor(devicePixelRatio * settings.zoomFactor); // Zoom in the page to achieve a higher DPI.
+	webPage.setDevicePixelRatio(devicePixelRatio); // Fix CSS media queries (does not affect anything else).
 }
 
 /*!
@@ -525,8 +528,8 @@ bool MultiPageLoader::copyFile(QFile & src, QFile & dst) {
 	return true;
 }
 
-MultiPageLoaderPrivate::MultiPageLoaderPrivate(const settings::LoadGlobal & s, MultiPageLoader & o):
-	outer(o), settings(s) {
+MultiPageLoaderPrivate::MultiPageLoaderPrivate(const settings::LoadGlobal & s, int dpi_, MultiPageLoader & o):
+	outer(o), settings(s), dpi(dpi_) {
 
 	cookieJar = new MyCookieJar();
 
@@ -588,8 +591,8 @@ void MultiPageLoaderPrivate::fail() {
   \brief Construct a multipage loader object, load settings read from the supplied settings
   \param s The settings to be used while loading pages
 */
-MultiPageLoader::MultiPageLoader(settings::LoadGlobal & s, bool mainLoader):
-	d(new MultiPageLoaderPrivate(s, *this)) {
+MultiPageLoader::MultiPageLoader(settings::LoadGlobal & s, int dpi, bool mainLoader):
+	d(new MultiPageLoaderPrivate(s, dpi, *this)) {
 	d->isMainLoader = mainLoader;
 }
 

+ 1 - 1
src/lib/multipageloader.hh

@@ -48,7 +48,7 @@ class DLL_LOCAL MultiPageLoaderPrivate;
 class DLL_LOCAL MultiPageLoader: public QObject {
 	Q_OBJECT
 public:
-	MultiPageLoader(settings::LoadGlobal & s, bool mainLoader = false);
+	MultiPageLoader(settings::LoadGlobal & s, int dpi, bool mainLoader = false);
 	~MultiPageLoader();
 	LoaderObject * addResource(const QString & url, const settings::LoadPage & settings, const QString * data=NULL);
 	LoaderObject * addResource(const QUrl & url, const settings::LoadPage & settings);

+ 2 - 1
src/lib/multipageloader_p.hh

@@ -135,8 +135,9 @@ public:
 	bool hasError;
 	bool finishedEmitted;
 	TempFile tempIn;
+	int dpi;
 
-	MultiPageLoaderPrivate(const settings::LoadGlobal & settings, MultiPageLoader & o);
+	MultiPageLoaderPrivate(const settings::LoadGlobal & settings, int dpi, MultiPageLoader & o);
 	~MultiPageLoaderPrivate();
 	LoaderObject * addResource(const QUrl & url, const settings::LoadPage & settings);
 	void load();

+ 4 - 4
src/lib/pdfconverter.cc

@@ -76,10 +76,10 @@ bool DLL_LOCAL looksLikeHtmlAndNotAUrl(QString str) {
 }
 
 PdfConverterPrivate::PdfConverterPrivate(PdfGlobal & s, PdfConverter & o) :
-	settings(s), pageLoader(s.load, true),
+	settings(s), pageLoader(s.load, settings.dpi, true),
 	out(o), printer(0), painter(0)
 #ifdef __EXTENSIVE_WKHTMLTOPDF_QT_HACK__
-    , webPrinter(0), measuringHFLoader(s.load), hfLoader(s.load), tocLoader1(s.load), tocLoader2(s.load)
+	, webPrinter(0), measuringHFLoader(s.load, settings.dpi), hfLoader(s.load, settings.dpi), tocLoader1(s.load, settings.dpi), tocLoader2(s.load, settings.dpi)
 	, tocLoader(&tocLoader1), tocLoaderOld(&tocLoader2)
     , outline(0), currentHeader(0), currentFooter(0)
 #endif
@@ -265,7 +265,7 @@ qreal PdfConverterPrivate::calculateHeaderHeight(PageObject & object, QWebPage &
 
 QPrinter * PdfConverterPrivate::createPrinter(const QString & tempFile) {
     QPrinter * printer = new QPrinter(settings.resolution);
-    if (settings.dpi != -1) printer->setResolution(settings.dpi);
+    printer->setResolution(settings.dpi);
     //Tell the printer object to print the file <out>
 
     printer->setOutputFileName(tempFile);
@@ -344,7 +344,7 @@ void PdfConverterPrivate::pagesLoaded(bool ok) {
 	  lout = tempOut.create(".pdf");
 
 	printer = new QPrinter(settings.resolution);
-	if (settings.dpi != -1) printer->setResolution(settings.dpi);
+	printer->setResolution(settings.dpi);
 	//Tell the printer object to print the file <out>
 
 	printer->setOutputFileName(lout);

+ 1 - 1
src/lib/pdfsettings.cc

@@ -372,7 +372,7 @@ PdfGlobal::PdfGlobal():
 	orientation(QPrinter::Portrait),
 	colorMode(QPrinter::Color),
 	resolution(QPrinter::HighResolution),
-	dpi(-1),
+	dpi(96),
 	pageOffset(0),
 	copies(1),
 	collate(true),