浏览代码

Update bindings to support getting and setting data directly

Antialize 15 年之前
父节点
当前提交
a22d7e7c55

+ 2 - 1
include/wkhtmltox/image.h

@@ -41,7 +41,7 @@ CAPI wkhtmltoimage_global_settings * wkhtmltoimage_create_global_settings();
 CAPI int wkhtmltoimage_set_global_setting(wkhtmltoimage_global_settings * settings, const char * name, const char * value);
 CAPI int wkhtmltoimage_get_global_setting(wkhtmltoimage_global_settings * settings, const char * name, char * value, int vs);
 
-CAPI wkhtmltoimage_converter * wkhtmltoimage_create_converter(wkhtmltoimage_global_settings * settings);
+CAPI wkhtmltoimage_converter * wkhtmltoimage_create_converter(wkhtmltoimage_global_settings * settings, const char * data);
 CAPI void wkhtmltoimage_destroy_converter(wkhtmltoimage_converter * converter);
 
 CAPI void wkhtmltoimage_set_warning_callback(wkhtmltoimage_converter * converter, wkhtmltoimage_str_callback cb);
@@ -58,6 +58,7 @@ CAPI int wkhtmltoimage_phase_count(wkhtmltoimage_converter * converter);
 CAPI const char * wkhtmltoimage_phase_description(wkhtmltoimage_converter * converter, int phase);
 CAPI const char * wkhtmltoimage_progress_string(wkhtmltoimage_converter * converter);
 CAPI int wkhtmltoimage_http_error_code(wkhtmltoimage_converter * converter);
+CAPI long wkhtmltoimage_get_output(wkhtmltoimage_converter * converter, const unsigned char **);
 
 #include <wkhtmltox/dllend.inc>
 #endif /*__IMAGE_H__*/

+ 2 - 1
include/wkhtmltox/imageconverter.hh

@@ -35,8 +35,9 @@ class DLL_LOCAL ImageConverterPrivate;
 class DLL_PUBLIC ImageConverter: public Converter {
 	Q_OBJECT
 public:
-	ImageConverter(settings::ImageGlobal & settings);
+	ImageConverter(settings::ImageGlobal & settings, const QString * data=NULL);
 	~ImageConverter();
+	const QByteArray & output();
 private:
 	ImageConverterPrivate * d;
 	virtual ConverterPrivate & priv();

+ 1 - 1
include/wkhtmltox/multipageloader.hh

@@ -49,7 +49,7 @@ class DLL_LOCAL MultiPageLoader: public QObject {
 public:
 	MultiPageLoader(settings::LoadGlobal & s);
 	~MultiPageLoader();
-	LoaderObject * addResource(const QString & url, const settings::LoadPage & settings);
+	LoaderObject * addResource(const QString & url, const settings::LoadPage & settings, const QString * data=NULL);
 	LoaderObject * addResource(const QUrl & url, const settings::LoadPage & settings);
 	static QUrl guessUrlFromString(const QString &string);
 	int httpErrorCode();

+ 1 - 0
include/wkhtmltox/pdf.h

@@ -67,6 +67,7 @@ CAPI int wkhtmltopdf_phase_count(wkhtmltopdf_converter * converter);
 CAPI const char * wkhtmltopdf_phase_description(wkhtmltopdf_converter * converter, int phase);
 CAPI const char * wkhtmltopdf_progress_string(wkhtmltopdf_converter * converter);
 CAPI int wkhtmltopdf_http_error_code(wkhtmltopdf_converter * converter);
+CAPI long wkhtmltopdf_get_output(wkhtmltopdf_converter * converter, const unsigned char **);
 
 #include <wkhtmltox/dllend.inc>
 #endif /*__PDF_H__*/

+ 2 - 1
include/wkhtmltox/pdfconverter.hh

@@ -40,8 +40,9 @@ public:
 	PdfConverter(settings::PdfGlobal & globalSettings);
 	~PdfConverter();
 	int pageCount();
-	void addResource(const settings::PdfObject & pageSettings);
+	void addResource(const settings::PdfObject & pageSettings, const QString * data=0);
 	const settings::PdfGlobal & globalSettings() const;
+	const QByteArray & output();
 private:
 	PdfConverterPrivate * d;
 	virtual ConverterPrivate & priv();

+ 2 - 1
src/lib/image.h

@@ -43,7 +43,7 @@ CAPI wkhtmltoimage_global_settings * wkhtmltoimage_create_global_settings();
 CAPI int wkhtmltoimage_set_global_setting(wkhtmltoimage_global_settings * settings, const char * name, const char * value);
 CAPI int wkhtmltoimage_get_global_setting(wkhtmltoimage_global_settings * settings, const char * name, char * value, int vs);
 
-CAPI wkhtmltoimage_converter * wkhtmltoimage_create_converter(wkhtmltoimage_global_settings * settings);
+CAPI wkhtmltoimage_converter * wkhtmltoimage_create_converter(wkhtmltoimage_global_settings * settings, const char * data);
 CAPI void wkhtmltoimage_destroy_converter(wkhtmltoimage_converter * converter);
 
 CAPI void wkhtmltoimage_set_warning_callback(wkhtmltoimage_converter * converter, wkhtmltoimage_str_callback cb);
@@ -60,6 +60,7 @@ CAPI int wkhtmltoimage_phase_count(wkhtmltoimage_converter * converter);
 CAPI const char * wkhtmltoimage_phase_description(wkhtmltoimage_converter * converter, int phase);
 CAPI const char * wkhtmltoimage_progress_string(wkhtmltoimage_converter * converter);
 CAPI int wkhtmltoimage_http_error_code(wkhtmltoimage_converter * converter);
+CAPI long wkhtmltoimage_get_output(wkhtmltoimage_converter * converter, const unsigned char **);
 
 #include <wkhtmltox/dllend.inc>
 #endif /*__IMAGE_H__*/

+ 11 - 4
src/lib/image_c_bindings.cc

@@ -50,9 +50,9 @@ void MyImageConverter::finished(bool ok) {
 	if (finished_cb) (finished_cb)(reinterpret_cast<wkhtmltoimage_converter*>(this), ok);
 }
 
-MyImageConverter::MyImageConverter(settings::ImageGlobal * gs):
+MyImageConverter::MyImageConverter(settings::ImageGlobal * gs, const QString * data):
 	warning_cb(0), error_cb(0), phase_changed(0), progress_changed(0), finished_cb(0),
-	converter(*gs), globalSettings(gs) {
+	converter(*gs, data), globalSettings(gs) {
 
     connect(&converter, SIGNAL(warning(const QString &)), this, SLOT(warning(const QString &)));
 	connect(&converter, SIGNAL(error(const QString &)), this, SLOT(error(const QString &)));
@@ -96,9 +96,10 @@ CAPI int wkhtmltoimage_get_global_setting(wkhtmltoimage_global_settings * settin
 	return 1;
 }
 
-CAPI wkhtmltoimage_converter * wkhtmltoimage_create_converter(wkhtmltoimage_global_settings * settings) {
+CAPI wkhtmltoimage_converter * wkhtmltoimage_create_converter(wkhtmltoimage_global_settings * settings, const char * data) {
+	QString str= QString::fromUtf8(data);
 	return reinterpret_cast<wkhtmltoimage_converter *>(
-		new MyImageConverter(reinterpret_cast<settings::ImageGlobal *>(settings)));
+		new MyImageConverter(reinterpret_cast<settings::ImageGlobal *>(settings), &str));
 }
 
 CAPI void wkhtmltoimage_destroy_converter(wkhtmltoimage_converter * converter) {
@@ -156,3 +157,9 @@ CAPI const char * wkhtmltoimage_progress_string(wkhtmltoimage_converter * conver
 CAPI int wkhtmltoimage_http_error_code(wkhtmltoimage_converter * converter) {
 	return reinterpret_cast<MyImageConverter *>(converter)->converter.httpErrorCode();
 }
+
+CAPI long wkhtmltoimage_get_output(wkhtmltoimage_converter * converter, const unsigned char ** d) {
+	const QByteArray & out = reinterpret_cast<MyImageConverter *>(converter)->converter.output();
+	*d = (const unsigned char*)out.constData();
+	return out.size();
+}

+ 1 - 2
src/lib/image_c_bindings_p.hh

@@ -20,7 +20,6 @@
 
 #ifndef __IMAGE_C_BINDINGS_P_HH__
 #define __IMAGE_C_BINDINGS_P_HH__
-
 #ifdef __WKHTMLTOX_UNDEF_QT_DLL__
 #ifdef QT_DLL
 #undef QT_DLL
@@ -46,7 +45,7 @@ public:
 
 	wkhtmltopdf::settings::ImageGlobal * globalSettings;
 
-	MyImageConverter(wkhtmltopdf::settings::ImageGlobal * gs);
+	MyImageConverter(wkhtmltopdf::settings::ImageGlobal * gs, const QString * data);
 	~MyImageConverter();
 public slots:
     void warning(const QString & message);

+ 20 - 8
src/lib/imageconverter.cc

@@ -17,6 +17,7 @@
 //
 // You should have received a copy of the GNU General Public License
 // along with wkhtmltopdf.  If not, see <http://www.gnu.org/licenses/>.
+
 #ifdef __WKHTMLTOX_UNDEF_QT_DLL__
 #ifdef QT_DLL
 #undef QT_DLL
@@ -25,6 +26,7 @@
 
 #include "imageconverter_p.hh"
 #include "imagesettings.hh"
+#include <QBuffer>
 #include <QDebug>
 #include <QEventLoop>
 #include <QFileInfo>
@@ -39,10 +41,11 @@
 #include <qapplication.h>
 namespace wkhtmltopdf {
 
-ImageConverterPrivate::ImageConverterPrivate(ImageConverter & o, wkhtmltopdf::settings::ImageGlobal & s):
+ImageConverterPrivate::ImageConverterPrivate(ImageConverter & o, wkhtmltopdf::settings::ImageGlobal & s, const QString * data):
 	settings(s),
 	loader(s.loadGlobal),
 	out(o) {
+	if (data) inputData = *data;
 
 	phaseDescriptions.push_back("Loading page");
 	phaseDescriptions.push_back("Rendering");
@@ -52,14 +55,14 @@ ImageConverterPrivate::ImageConverterPrivate(ImageConverter & o, wkhtmltopdf::se
 	connect(&loader, SIGNAL(loadFinished(bool)), this, SLOT(pagesLoaded(bool)));
 	connect(&loader, SIGNAL(error(QString)), this, SLOT(forwardError(QString)));
 	connect(&loader, SIGNAL(warning(QString)), this, SLOT(forwardWarning(QString)));
-};
+}
 
 void ImageConverterPrivate::beginConvert() {
 	error = false;
 	convertionDone = false;
 	errorCode = 0;
 	progressString = "0%";
-	loaderObject = loader.addResource(settings.in, settings.loadPage);
+	loaderObject = loader.addResource(settings.in, settings.loadPage, &inputData);
 	updateWebSettings(loaderObject->page.settings(), settings.web);
 	currentPhase=0;
 	emit out. phaseChanged();
@@ -135,9 +138,14 @@ void ImageConverterPrivate::pagesLoaded(bool ok) {
 	QSvgGenerator generator;
 	QImage image;
 	QFile file;
-	bool openOk;
+	QBuffer buffer(&outputData);
+	QIODevice * dev = &file;
+
+	bool openOk=true;
 	// output image
-	if (settings.out != "-" ) {
+	if (settings.out.isEmpty()) {
+		dev =  &buffer;
+	} if (settings.out != "-" ) {
 		file.setFileName(settings.out);
 		openOk = file.open(QIODevice::WriteOnly);
 	} else {
@@ -163,7 +171,7 @@ void ImageConverterPrivate::pagesLoaded(bool ok) {
 		image = QImage(rect.size(), QImage::Format_ARGB32_Premultiplied);
 		painter.begin(&image);
 	} else {
-		generator.setOutputDevice(&file);
+		generator.setOutputDevice(dev);
 		generator.setSize(rect.size());
 		generator.setViewBox(QRect(QPoint(0,0),rect.size()));
 #ifdef __EXTENSIVE_WKHTMLTOPDF_QT_HACK__
@@ -219,8 +227,12 @@ ConverterPrivate & ImageConverter::priv() {
 }
 
 
-ImageConverter::ImageConverter(wkhtmltopdf::settings::ImageGlobal & s) {
-	d = new ImageConverterPrivate(*this, s);
+ImageConverter::ImageConverter(wkhtmltopdf::settings::ImageGlobal & s, const QString * data) {
+	d = new ImageConverterPrivate(*this, s, data);
+}
+
+const QByteArray & ImageConverter::output() {
+	return d->outputData;
 }
 
 }

+ 2 - 2
src/lib/imageconverter.hh

@@ -20,7 +20,6 @@
 
 #ifndef __IMAGECONVERTER_HH__
 #define __IMAGECONVERTER_HH__
-
 #ifdef __WKHTMLTOX_UNDEF_QT_DLL__
 #ifdef QT_DLL
 #undef QT_DLL
@@ -38,8 +37,9 @@ class DLL_LOCAL ImageConverterPrivate;
 class DLL_PUBLIC ImageConverter: public Converter {
 	Q_OBJECT
 public:
-	ImageConverter(settings::ImageGlobal & settings);
+	ImageConverter(settings::ImageGlobal & settings, const QString * data=NULL);
 	~ImageConverter();
+	const QByteArray & output();
 private:
 	ImageConverterPrivate * d;
 	virtual ConverterPrivate & priv();

+ 4 - 2
src/lib/imageconverter_p.hh

@@ -20,7 +20,6 @@
 
 #ifndef __IMAGECONVERTER_P_HH__
 #define __IMAGECONVERTER_P_HH__
-
 #ifdef __WKHTMLTOX_UNDEF_QT_DLL__
 #ifdef QT_DLL
 #undef QT_DLL
@@ -37,11 +36,14 @@ namespace wkhtmltopdf {
 class DLL_LOCAL ImageConverterPrivate: public ConverterPrivate {
 	Q_OBJECT
 public:
-	ImageConverterPrivate(ImageConverter & o, wkhtmltopdf::settings::ImageGlobal & s);
+	ImageConverterPrivate(ImageConverter & o, wkhtmltopdf::settings::ImageGlobal & s, const QString * data);
 
 	wkhtmltopdf::settings::ImageGlobal settings;
 	MultiPageLoader loader;
 private:
+	QByteArray outputData;
+	QString inputData;
+
 	ImageConverter & out;
 	void clearResources();
 

+ 12 - 2
src/lib/multipageloader.cc

@@ -17,6 +17,7 @@
 //
 // You should have received a copy of the GNU General Public License
 // along with wkhtmltopdf.  If not, see <http://www.gnu.org/licenses/>.
+
 #ifdef __WKHTMLTOX_UNDEF_QT_DLL__
 #ifdef QT_DLL
 #undef QT_DLL
@@ -406,6 +407,7 @@ MultiPageLoaderPrivate::~MultiPageLoaderPrivate() {
 LoaderObject * MultiPageLoaderPrivate::addResource(const QUrl & url, const settings::LoadPage & page) {
 	ResourceObject * ro = new ResourceObject(*this, url, page);
 	resources.push_back(ro);
+
 	return &ro->lo;
 }
 
@@ -456,9 +458,17 @@ MultiPageLoader::~MultiPageLoader() {
   \brief Add a resource, to be loaded described by a string
   @param string Url describing the resource to load
 */
-LoaderObject * MultiPageLoader::addResource(const QString & string, const settings::LoadPage & s) {
+LoaderObject * MultiPageLoader::addResource(const QString & string, const settings::LoadPage & s, const QString * data) {
 	QString url=string;
-	if (url == "-") {
+	if (data && !data->isEmpty()) {
+		qDebug() << data;
+		url = d->tempIn.create(".html");
+		QFile tmp(url);
+		if (!tmp.open(QIODevice::WriteOnly) || tmp.write(data->toUtf8())==0) {
+			emit error("Unable to create temporery file");
+			return NULL;
+		}
+	} else if (url == "-") {
 		QFile in;
 		in.open(stdin,QIODevice::ReadOnly);
 		url = d->tempIn.create(".html");

+ 1 - 2
src/lib/multipageloader.hh

@@ -20,7 +20,6 @@
 
 #ifndef __MULTIPAGELOADER_HH__
 #define __MULTIPAGELOADER_HH__
-
 #ifdef __WKHTMLTOX_UNDEF_QT_DLL__
 #ifdef QT_DLL
 #undef QT_DLL
@@ -52,7 +51,7 @@ class DLL_LOCAL MultiPageLoader: public QObject {
 public:
 	MultiPageLoader(settings::LoadGlobal & s);
 	~MultiPageLoader();
-	LoaderObject * addResource(const QString & url, const settings::LoadPage & settings);
+	LoaderObject * addResource(const QString & url, const settings::LoadPage & settings, const QString * data=NULL);
 	LoaderObject * addResource(const QUrl & url, const settings::LoadPage & settings);
 	static QUrl guessUrlFromString(const QString &string);
 	int httpErrorCode();

+ 1 - 0
src/lib/pdf.h

@@ -69,6 +69,7 @@ CAPI int wkhtmltopdf_phase_count(wkhtmltopdf_converter * converter);
 CAPI const char * wkhtmltopdf_phase_description(wkhtmltopdf_converter * converter, int phase);
 CAPI const char * wkhtmltopdf_progress_string(wkhtmltopdf_converter * converter);
 CAPI int wkhtmltopdf_http_error_code(wkhtmltopdf_converter * converter);
+CAPI long wkhtmltopdf_get_output(wkhtmltopdf_converter * converter, const unsigned char **);
 
 #include <wkhtmltox/dllend.inc>
 #endif /*__PDF_H__*/

+ 8 - 1
src/lib/pdf_c_bindings.cc

@@ -255,8 +255,9 @@ CAPI void wkhtmltopdf_cancel(wkhtmltopdf_converter * converter) {
 }
 
 CAPI void wkhtmltopdf_add_resource(wkhtmltopdf_converter * converter, wkhtmltopdf_object_settings * settings, const char * data) {
+	QString str= QString::fromUtf8(data);
 	reinterpret_cast<MyPdfConverter *>(converter)->converter.addResource(
-		*reinterpret_cast<settings::PdfObject *>(settings) );
+		*reinterpret_cast<settings::PdfObject *>(settings), &str);
 	reinterpret_cast<MyPdfConverter *>(converter)->objectSettings.push_back(reinterpret_cast<settings::PdfObject *>(settings));
 }
 
@@ -279,3 +280,9 @@ CAPI const char * wkhtmltopdf_progress_string(wkhtmltopdf_converter * converter)
 CAPI int wkhtmltopdf_http_error_code(wkhtmltopdf_converter * converter) {
 	return reinterpret_cast<MyPdfConverter *>(converter)->converter.httpErrorCode();
 }
+
+CAPI long wkhtmltopdf_get_output(wkhtmltopdf_converter * converter, const unsigned char ** d) {
+	const QByteArray & out = reinterpret_cast<MyPdfConverter *>(converter)->converter.output();
+	*d = (const unsigned char*)out.constData();
+	return out.size();
+}

+ 19 - 3
src/lib/pdfconverter.cc

@@ -17,6 +17,7 @@
 //
 // You should have received a copy of the GNU General Public License
 // along with wkhtmltopdf.  If not, see <http://www.gnu.org/licenses/>.
+
 #ifdef __WKHTMLTOX_UNDEF_QT_DLL__
 #ifdef QT_DLL
 #undef QT_DLL
@@ -154,7 +155,7 @@ void PdfConverterPrivate::beginConvert() {
 		}
 
 		if (!s.isTableOfContent) {
-			o.loaderObject = pageLoader.addResource(s.page, s.load);
+			o.loaderObject = pageLoader.addResource(s.page, s.load, &o.data);
 			o.page = &o.loaderObject->page;
 			PageObject::webPageToObject[o.page] = &o;
 			updateWebSettings(o.page->settings(), s.web);
@@ -189,6 +190,8 @@ void PdfConverterPrivate::pagesLoaded(bool ok) {
 #endif
 			 lout = tempOut.create(settings.outputFormat == "ps"?".ps":".pdf");
 	}
+	if (settings.out.isEmpty())
+	  lout = tempOut.create(settings.outputFormat == "ps"?".ps":".pdf");
 
 	printer = new QPrinter(settings.resolution);
 	if (settings.dpi != -1) printer->setResolution(settings.dpi);
@@ -733,6 +736,15 @@ void PdfConverterPrivate::printDocument() {
 			return;
 		}
 	}
+
+	if (settings.out.isEmpty()) {
+		QFile i(lout);
+		if (!i.open(QIODevice::ReadOnly)) {
+			emit out.error("Reading output failed");
+			fail();
+		}
+		outputData = i.readAll();
+	}
 	clearResources();
 #ifdef __EXTENSIVE_WKHTMLTOPDF_QT_HACK__
 	currentPhase = 6;
@@ -816,8 +828,12 @@ PdfConverter::~PdfConverter() {
   \brief add a resource we want to convert
   \param url The url of the object we want to convert
 */
-void PdfConverter::addResource(const settings::PdfObject & page) {
-	d->objects.push_back( PageObject(page) );
+void PdfConverter::addResource(const settings::PdfObject & page, const QString * data) {
+  d->objects.push_back( PageObject(page, data) );
+}
+
+const QByteArray & PdfConverter::output() {
+  return d->outputData;
 }
 
 

+ 2 - 2
src/lib/pdfconverter.hh

@@ -20,7 +20,6 @@
 
 #ifndef __PDFCONVERTER_HH__
 #define __PDFCONVERTER_HH__
-
 #ifdef __WKHTMLTOX_UNDEF_QT_DLL__
 #ifdef QT_DLL
 #undef QT_DLL
@@ -43,8 +42,9 @@ public:
 	PdfConverter(settings::PdfGlobal & globalSettings);
 	~PdfConverter();
 	int pageCount();
-	void addResource(const settings::PdfObject & pageSettings);
+	void addResource(const settings::PdfObject & pageSettings, const QString * data=0);
 	const settings::PdfGlobal & globalSettings() const;
+	const QByteArray & output();
 private:
 	PdfConverterPrivate * d;
 	virtual ConverterPrivate & priv();

+ 6 - 2
src/lib/pdfconverter_p.hh

@@ -20,7 +20,6 @@
 
 #ifndef __PDFCONVERTER_P_HH__
 #define __PDFCONVERTER_P_HH__
-
 #ifdef __WKHTMLTOX_UNDEF_QT_DLL__
 #ifdef QT_DLL
 #undef QT_DLL
@@ -56,6 +55,7 @@ public:
 	settings::PdfObject settings;
 	LoaderObject * loaderObject;
 	QWebPage * page;
+	QString data;
 
 #ifdef __EXTENSIVE_WKHTMLTOPDF_QT_HACK__
 	QHash<QString, QWebElement> anchors;
@@ -84,7 +84,10 @@ public:
 		tocFile.remove();
 	}
 
-	PageObject(const settings::PdfObject & set): settings(set), loaderObject(0), page(0) {};
+	PageObject(const settings::PdfObject & set, const QString * d=NULL):
+		settings(set), loaderObject(0), page(0) {
+		if (d) data=*d;
+	};
 
 	~PageObject() {
 		clear();
@@ -106,6 +109,7 @@ private:
 	PdfConverter & out;
 	void clearResources();
 	TempFile tempOut;
+	QByteArray outputData;
 
 	QList<PageObject> objects;
 

+ 2 - 1
src/lib/pdfsettings.cc

@@ -17,6 +17,7 @@
 //
 // You should have received a copy of the GNU General Public License
 // along with wkhtmltopdf.  If not, see <http://www.gnu.org/licenses/>.
+
 #ifdef __WKHTMLTOX_UNDEF_QT_DLL__
 #ifdef QT_DLL
 #undef QT_DLL
@@ -378,7 +379,7 @@ PdfGlobal::PdfGlobal():
 	outline(true),
 	outlineDepth(4),
 	dumpOutline(""),
-	out("-"),
+	out(""),
 	documentTitle(""),
 	useCompression(true),
 	imageDPI(600),