// -*- mode: c++; tab-width: 4; indent-tabs-mode: t; eval: (progn (c-set-style "stroustrup") (c-set-offset 'innamespace 0)); -*-
// vi:set ts=4 sts=4 sw=4 noet :
//
// Copyright 2010 wkhtmltopdf authors
//
// This file is part of wkhtmltopdf.
//
// wkhtmltopdf is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// wkhtmltopdf is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with wkhtmltopdf. If not, see .
/**
* \file pdf.h
* \brief Provides C bindings for pdf conversion
*/
#include "pdf_c_bindings_p.hh"
#include "utilities.hh"
#include
#include
#include
#include "dllbegin.inc"
/**
* \page pagesettings Setting
* Settings can be supplied to PDF and image c-bindings using utf-8 encoded strings.
* This is done by relatively simple reflection on the CropSettings, HeaderFooter, Margin,
* ImageGlobal, PdfGlobal, PdfObject, Size, and TableOfContent classes.
*
* - The \ref wkhtmltopdf_global_settings corresponds to the PdfGlobal class and is documented in \ref pagePdfGlobal.
* - The \ref wkhtmltopdf_object_settings corresponds to the PdfGlobal class and is documented in \ref pagePdfObject.
* - The \ref wkhtmltopdf_image_settings corresponds to the ImageGlobal class and is documented in \ref pageImageGlobal.
*
* \section pageWeb Web page specific settings
* The following web page specific settings apply
* - \b web.background Should we print the background? Must be either "true" or "false".
* - \b web.loadImages Should we load images? Must be either "true" or "false".
* - \b web.enableJavascript Should we enable javascript? Must be either "true" or "false".
* - \b web.enableIntelligentShrinking Should we enable intelligent shrinkng to fit more content
* on one page? Must be either "true" or "false". Has no effect for wkhtmltoimage.
* - \b web.minimumFontSize The minimum font size allowed. E.g. "9"
* - \b web.printMediaType Should the content be printed using the print media type instead
* of the screen media type. Must be either "true" or "false". Has no effect for wkhtmltoimage.
* - \b web.defaultEncoding What encoding should we guess content is using if they do not
* specify it properly? E.g. "utf-8"
* - \b web.userStyleSheet Url er path to a user specified style sheet.
* - \b web.enablePlugins Should we enable NS plugins, must be either "true" or "false".
* Enabling this will have limited success.
*
* \section pageLoad Object Specific loading settings
* The following settings apply for object loading.
* - \b load.username The user name to use when loging into a website, E.g. "bart"
* - \b load.password The password to used when logging into a website, E.g. "elbarto"
* - \b load.jsdelay The mount of time in milliseconds to wait after a page has done loading until
* it is actually printed. E.g. "1200". We will wait this amount of time or until, javascript
* calls window.print().
* - \b load.zoomFactor How much should we zoom in on the content? E.g. "2.2".
* - \b load.customHeaders TODO
* - \b load.repertCustomHeaders Should the custom headers be sent all elements loaded instead of
* only the main page? Must be either "true" or "false".
* - \b load.cookies TODO
* - \b load.post TODO
* - \b load.blockLocalFileAccess Disallow local and piped files to access other local files. Must
* be either "true" or "false".
* - \b load.stopSlowScript Stop slow running javascript. Must be either "true" or "false".
* - \b load.debugJavascript Forward javascript warnings and errors to the warning callback.
* Must be either "true" or "false".
* - \b load.loadErrorHandling How should we handle obejcts that fail to load. Must be one of:
* - "abort" Abort the convertion process
* - "skip" Do not add the object to the final output
* - "ignore" Try to add the object to the final output.
* - \b load.proxy String describing what proxy to use when loading the object.
* - \b load.runScript TODO
*
* \section pageHeaderFooter Header and footer settings
* The same settings can be applied for headers and footers, here there are explained in
* terms of the header.
* - \b header.fontSize The font size to use for the header, e.g. "13"
* - \b header.fontName The name of the font to use for the header. e.g. "times"
* - \b header.left The string to print in the left part of the header, note that some sequences
* are replaced in this string, see the wkhtmltopdf manual.
* - \b header.center The text to print in the center part of the header.
* - \b header.right The text to print in the right part of the header.
* - \b header.line Whether a line should be printed under the header (either "true" or "false").
* - \b header.spacing The amount of space to put between the header and the content, e.g. "1.8". Be
* aware that if this is too large the header will be printed outside the pdf document. This
* can be corrected with the margin.top setting.
* - \b header.htmlUrl Url for a HTML document to use for the header.
*
* \section pagePdfGlobal Pdf global settings
* The \ref wkhtmltopdf_global_settings structure contains the following settings:
* - \b size.paperSize The paper size of the output document, e.g. "A4".
* - \b size.width The with of the output document, e.g. "4cm".
* - \b size.height The height of the output document, e.g. "12in".
* - \b orientation The orientation of the output document, must be either "Landscape" or "Portrait".
* - \b colorMode Should the output be printed in color or gray scale, must be either "Color" or "Grayscale"
* - \b resolution Most likely has no effect.
* - \b dpi What dpi should we use when printing, e.g. "80".
* - \b pageOffset A number that is added to all page numbers when printing headers, footers and table of content.
* - \b copies How many copies should we print?. e.g. "2".
* - \b collate Should the copies be collated? Must be either "true" or "false".
* - \b outline Should a outline (table of content in the sidebar) be generated and put into the PDF? Must be either "true" or false".
* - \b outlineDepth The maximal depth of the outline, e.g. "4".
* - \b dumpOutline If not set to the empty string a XML representation of the outline is dumped to this file.
* - \b out The path of the output file, if "-" output is sent to stdout, if empty the output is stored in a buffer.
* - \b documentTitle The title of the PDF document.
* - \b useCompression Should we use loss less compression when creating the pdf file? Must be either "true" or "false".
* - \b margin.top Size of the top margin, e.g. "2cm"
* - \b margin.bottom Size of the bottom margin, e.g. "2cm"
* - \b margin.left Size of the left margin, e.g. "2cm"
* - \b margin.right Size of the right margin, e.g. "2cm"
* - \b imageDPI The maximal DPI to use for images in the pdf document.
* - \b imageQuality The jpeg compression factor to use when producing the pdf document, e.g. "92".
* - \b load.cookieJar Path of file used to load and store cookies.
*
* \section pagePdfObject Pdf object settings
* The \ref wkhtmltopdf_object_settings structure contains the following settings:
* - \b toc.useDottedLines Should we use a dotted line when creating a table of content?
* Must be either "true" or "false".
* - \b toc.captionText The caption to use when creating a table of content.
* - \b toc.forwardLinks Should we create links from the table of content into the actual content?
* Must be either "true or "false.
* - \b toc.backLinks Should we link back from the content to this table of content.
* - \b toc.indentation The indentation used for every table of content level, e.g. "2em".
* - \b toc.fontScale How much should we scale down the font for every toc level? E.g. "0.8"
* - \b page The URL or path of the web page to convert, if "-" input is read from stdin.
* - \b header.* Header specific settings see \ref pageHeaderFooter.
* - \b footer.* Footer specific settings see \ref pageHeaderFooter.
* - \b useExternalLinks Should external links in the HTML document be converted into
* external pdf links? Must be either "true" or "false.
* - \b useLocalLinks Should internal links in the HTML document be converted into pdf
* references? Must be either "true" or "false"
* - \b replacements TODO
* - \b produceForms Should we turn HTML forms into PDF forms? Must be either "true" or file".
* - \b load.* Page specific settings related to loading content, see \ref pageLoad.
* - \b web.* See \ref pageWeb.
* - \b includeInOutline Should the sections from this document be included in the outline and table of content?
* - \b pagesCount Should we count the pages of this document, in the counter used for TOC, headers and footers?
* - \b tocXsl If not empty this object is a table of content object, "page" is ignored and this xsl style
* sheet is used to convert the outline XML into a table of content.
*/
/**
* \struct wkhtmltopdf_global_settings
* \brief A struct holding global settings
*
* See also \ref pagePdfGlobal
*/
/**
* \struct wkhtmltopdf_object_settings
* \brief A struct holding object settings
*
* See also \ref pagePdfObject
*/
/**
* \struct wkhtmltopdf_converter
* \brief A struct holding information related to a conversion process
*/
/**
* \typedef wkhtmltopdf_str_callback
* \brief Function pointer type used for the error and warning callbacks
*
* \param converter The converter that issued the callback
* \param str A utf8 encoded string containing the error or warning message.
*
* \sa wkhtmltopdf_set_error_callback, wkhtmltopdf_set_warning_callback
*/
/**
* \typedef wkhtmltopdf_int_callback
* \brief Function pointer type used for the progress_changed and finished callbacks
*
* For the progress_changed callback the value indicated the progress
* within the current phase in percent. For the finished callback the value
* if 1 if the conversion has successful and 0 otherwise.
*
* \param converter The converter that issued the callback
* \param val The integer value
*
* \sa wkhtmltopdf_set_progress_changed, wkhtmltopdf_set_finished_callback
*/
/**
* \typedef wkhtmltopdf_void_callback
* \brief Function pointer type used for the phase_changed callback
*
* \param converter The converter that issued the callback
*
* \sa wkhtmltopdf_set_phase_changed_callback
*/
using namespace wkhtmltopdf;
QApplication * a = 0;
int usage = 0;
void MyPdfConverter::warning(const QString & message) {
if (warning_cb) (warning_cb)(reinterpret_cast(this), message.toUtf8().constData());
}
void MyPdfConverter::error(const QString & message) {
if (error_cb) (error_cb)(reinterpret_cast(this), message.toUtf8().constData());
}
void MyPdfConverter::phaseChanged() {
if (phase_changed) (phase_changed)(reinterpret_cast(this));
}
void MyPdfConverter::progressChanged(int progress) {
if (progress_changed) (progress_changed)(reinterpret_cast(this), progress);
}
void MyPdfConverter::finished(bool ok) {
if (finished_cb) (finished_cb)(reinterpret_cast(this), ok);
}
MyPdfConverter::MyPdfConverter(settings::PdfGlobal * gs):
warning_cb(0), error_cb(0), phase_changed(0), progress_changed(0), finished_cb(0),
converter(*gs), globalSettings(gs) {
connect(&converter, SIGNAL(warning(const QString &)), this, SLOT(warning(const QString &)));
connect(&converter, SIGNAL(error(const QString &)), this, SLOT(error(const QString &)));
connect(&converter, SIGNAL(phaseChanged()), this, SLOT(phaseChanged()));
connect(&converter, SIGNAL(progressChanged(int)), this, SLOT(progressChanged(int)));
connect(&converter, SIGNAL(finished(bool)), this, SLOT(finished(bool)));
}
MyPdfConverter::~MyPdfConverter() {
delete globalSettings;
for (size_t i=0; i < objectSettings.size(); ++i)
delete objectSettings[i];
objectSettings.clear();
}
/**
* \brief Check if the library is build against the wkhtmltopdf version of QT
*
* \return 1 if the library was build against the wkhtmltopdf version of QT and 0 otherwise
*/
CAPI(int) wkhtmltopdf_extended_qt() {
#ifdef __EXTENSIVE_WKHTMLTOPDF_QT_HACK__
return 1;
#else
return 0;
#endif
}
#define STRINGIZEE(a) # a
#define STRINGIZE(a) STRINGIZEE(a)
/**
* \brief Return the version of wkhtmltopdf
* Example: 0.12.1-development. The string is utf8 encoded and is owned by wkhtmltopdf.
*
* \return Qt version
*/
CAPI(const char *) wkhtmltopdf_version() {
return STRINGIZE(FULL_VERSION);
}
/**
* \brief Setup wkhtmltopdf
*
* Must be called before any other functions.
*
* \param use_graphics Should we use a graphics system
* \returns 1 on success and 0 otherwise
*
* \sa wkhtmltopdf_deinit
*/
CAPI(int) wkhtmltopdf_init(int use_graphics) {
++usage;
if (qApp == 0) {
char x[256];
strcpy(x, "wkhtmltox");
char * arg[] = {x, 0};
int aa = 1;
bool ug = true;
#if defined(Q_OS_UNIX) || defined(Q_OS_MAC)
#ifdef __EXTENSIVE_WKHTMLTOPDF_QT_HACK__
ug = use_graphics;
if (!ug) QApplication::setGraphicsSystem("raster");
#else
Q_UNUSED(use_graphics);
#endif
#else
Q_UNUSED(use_graphics);
#endif
a = new QApplication(aa, arg, ug);
MyLooksStyle * style = new MyLooksStyle();
a->setStyle(style);
}
return 1;
}
/**
* \brief Deinit wkhtmltopdf
*
* Free up resources used by wkhtmltopdf, when this has been called no other
* wkhtmltopdf function can be called.
*
* \returns 1 on success and 0 otherwise
*
* \sa wkhtmltopdf_init
*/
CAPI(int) wkhtmltopdf_deinit() {
--usage;
if (usage != 0) return 1;
if (a != 0) delete a;
return 1;
}
/**
* \brief Create a new global settings object for pdf conversion
*
* Create a new global settings object for pdf conversion, settings can be altered with
* \ref wkhtmltopdf_set_global_setting, and inspected with \ref wkhtmltopdf_get_global_setting.
* Once the desired settings have been set a converter object can be created using \reg wkhtmltopdf_create_converter.
*
* \returns A wkhtmltopdf global settings object
*/
CAPI(wkhtmltopdf_global_settings *) wkhtmltopdf_create_global_settings() {
return reinterpret_cast(new settings::PdfGlobal());
}
/**
* \brief Destroy a global settings object
*
* Normally one would not need to call this since ownership of the
* settings object is transfarred to the converter.
*/
CAPI(void) wkhtmltopdf_destroy_global_settings(wkhtmltopdf_global_settings * obj) {
delete reinterpret_cast(obj);
}
/**
* \brief Alter a setting in a global settings object
*
* \sa \ref pagePdfGlobal, wkhtmltopdf_create_global_settings, wkhtmltopdf_get_global_setting
*
* \param settings The settings object to change
* \param name The name of the setting
* \param value The new value for the setting
* \returns 1 if the setting was updated successfully and 0 otherwise.
*/
CAPI(int) wkhtmltopdf_set_global_setting(wkhtmltopdf_global_settings * settings, const char * name, const char * value) {
return reinterpret_cast(settings)->set(name, value);
}
/**
* \brief Retrieve a setting in a global settings object
*
* \sa \ref pagesettings, wkhtmltopdf_create_global_settings, wkhtmltopdf_set_global_setting
*
* \param settings The settings object to inspect
* \param name The name of the setting to read
* \param value A buffer of length at least \a vs, where the value is stored.
* \param vs The length of \a value
* \returns 1 If the the setting exists and was read successfully and 0 otherwise
*/
CAPI(int) wkhtmltopdf_get_global_setting(wkhtmltopdf_global_settings * settings, const char * name, char * value, int vs) {
QString res = reinterpret_cast(settings)->get(name);
if (res.isNull()) return 0;
qstrncpy(value, res.toUtf8().constData(), vs);
return 1;
}
/**
* \brief Create an object used to store object settings
*
* Create a new Object settings object for pdf conversion, settings can be altered with
* \ref wkhtmltopdf_set_object_setting, and inspected with \ref wkhtmltopdf_get_object_setting.
* Once the desired settings have been set the object can be added to a converter
* by calling wkhtmltopdf_add_resource.
*
* \returns an object settings instance
*/
CAPI(wkhtmltopdf_object_settings *) wkhtmltopdf_create_object_settings() {
return reinterpret_cast(new settings::PdfObject());
}
/**
* \brief Destroy a global settings object
*
* Normally one would not need to call this since ownership of the
* settings object is transfarred to the converter.
*/
CAPI(void) wkhtmltopdf_destroy_object_settings(wkhtmltopdf_object_settings * obj) {
delete reinterpret_cast(obj);
}
/**
* \brief Alter a setting in a object settings object
*
* \sa \ref pagesettings, wkhtmltopdf_create_object_settings, wkhtmltopdf_get_object_setting
*
* \param settings The settings object to change
* \param name The name of the setting
* \param value The new value for the setting
* \returns 1 if the setting was updated successfully and 0 otherwise.
*/
CAPI(int) wkhtmltopdf_set_object_setting(wkhtmltopdf_object_settings * settings, const char * name, const char * value) {
return reinterpret_cast(settings)->set(name, value);
}
/**
* \brief Retrieve a setting in a global settings object
*
* \sa \ref pagesettings, wkhtmltopdf_create_global_settings, wkhtmltopdf_set_global_setting
*
* \param settings The settings object to inspect
* \param name The name of the setting to read
* \param value A buffer of length at least \a vs, where the value is stored.
* \param vs The length of \a value
* \returns 1 If the the setting exists and was read successfully and 0 otherwise
*/
CAPI(int) wkhtmltopdf_get_object_setting(wkhtmltopdf_object_settings * settings, const char * name, char * value, int vs) {
QString res = reinterpret_cast(settings)->get(name);
if (res.isNull()) return 0;
qstrncpy(value, res.toUtf8().constData(), vs);
return 1;
}
/**
* \brief Create a wkhtmltopdf converter object
*
* The converter object is used to convert one or more objects(web sides) into a single pdf.
* Once a settings object has been parsed, it may no longer be accessed, and will eventually be freed.
* The returned converter object must be freed by calling \ref wkhtmltopdf_destroy_converter
*
* \param settings The global settings to use during conversion.
* \returns A wkhtmltopdf converter object
*/
CAPI(wkhtmltopdf_converter *) wkhtmltopdf_create_converter(wkhtmltopdf_global_settings * settings) {
return reinterpret_cast(
new MyPdfConverter(reinterpret_cast(settings)));
}
/**
* \brief Destroy a wkhtmltopdf converter object
*
* An object must be destroyed to free up its memory, once it has been destroyed it may no longer
* be accessed.
*
* \param settings The converter object to destroy
*/
CAPI(void) wkhtmltopdf_destroy_converter(wkhtmltopdf_converter * converter) {
reinterpret_cast(converter)->deleteLater();
}
/**
* \brief Set the function that should be called when an errors occurs during conversion
*
* \param converter The converter object on which errors we want the callback to be called
* \param cb The function to call when an error occurs
*/
CAPI(void) wkhtmltopdf_set_warning_callback(wkhtmltopdf_converter * converter, wkhtmltopdf_str_callback cb) {
reinterpret_cast(converter)->warning_cb = cb;
}
/**
* \brief Set the function that should be called when an warning message is issued during conversion
*
* \param converter The converter object on which warnings we want the callback to be called
* \param cb The function to call when warning message is issued
*
*/
CAPI(void) wkhtmltopdf_set_error_callback(wkhtmltopdf_converter * converter, wkhtmltopdf_str_callback cb) {
reinterpret_cast(converter)->error_cb = cb;
}
/**
* \brief Set the function that should be called whenever conversion changes phase
*
* The number of the new phase can be found by calling \ref wkhtmltopdf_current_phase
*
* \param converter The converter which phase change events to call back from
* \param cb The function to call when phases change
*
* \sa wkhtmltopdf_current_phase, wkhtmltopdf_phase_count, wkhtmltopdf_phase_description
*/
CAPI(void) wkhtmltopdf_set_phase_changed_callback(wkhtmltopdf_converter * converter, wkhtmltopdf_void_callback cb) {
reinterpret_cast(converter)->phase_changed = cb;
}
/**
* \brief Set the function that should be called when progress have been done during conversion.
*
* The progress in percent within the current phase is given as an integer to the callback function.
*
* \param converter The converter which progress events to call back from
* \param cb The function to call when progress has occurred.
*
* \sa wkhtmltopdf_progress_description
*/
CAPI(void) wkhtmltopdf_set_progress_changed_callback(wkhtmltopdf_converter * converter, wkhtmltopdf_int_callback cb) {
reinterpret_cast(converter)->progress_changed = cb;
}
/**
* \brief Set the function that should be called once the conversion has finished.
*
* \param converter The converter which finish events to call back from
* \param cb The function to call when the conversion has finished has occurred.
*
* \sa wkhtmltopdf_convert
*/
CAPI(void) wkhtmltopdf_set_finished_callback(wkhtmltopdf_converter * converter, wkhtmltopdf_int_callback cb) {
reinterpret_cast(converter)->finished_cb = cb;
}
//CAPI(void) wkhtmltopdf_begin_conversion(wkhtmltopdf_converter * converter) {
// reinterpret_cast(converter)->converter.beginConvertion();
//}
/**
* \brief Convert the input objects into a pdf document
*
* This is the main method for the conversion process, during conversion progress information
* warning, and errors are reported using the supplied call backs. Once the conversion is done
* the output pdf (or ps) file will be placed at the location of the "out" setting supplied in
* the global settings object during construction of the converter. If this setting is not supplied
* or set to the empty string, the output can be retrieved using the \ref wkhtmltopdf_get_output
* function.
*
* \paragm converter The converter to perform the conversion on.
*
* \returns 1 on success and 0 otherwise
*/
CAPI(int) wkhtmltopdf_convert(wkhtmltopdf_converter * converter) {
return reinterpret_cast(converter)->converter.convert();
}
//CAPI(void) wkhtmltopdf_cancel(wkhtmltopdf_converter * converter) {
// reinterpret_cast(converter)->converter.cancel();
//}
/**
* \brief add an object (web page to convert)
*
* Add the object described by the supplied object settings to the list of objects (web pages to convert),
* objects are placed in the output pdf in the order of addition. Once the object has been added, the
* supplied settings may no longer be accessed, it Wit eventually be freed by wkhtmltopdf.
* If a none NULL and none empty utf8 encoded string is supplied to data, this HTML content will be converted
* instead of the content located at "page" setting of the supplied object settings instance.
*
* \param converter The converter to add the object to
* \param settings The setting describing the object to add
* \param data HTML content of the object to convert or NULL
*/
CAPI(void) wkhtmltopdf_add_object(wkhtmltopdf_converter * converter, wkhtmltopdf_object_settings * settings, const char * data) {
QString str= QString::fromUtf8(data);
reinterpret_cast(converter)->converter.addResource(
*reinterpret_cast(settings), &str);
reinterpret_cast(converter)->objectSettings.push_back(reinterpret_cast(settings));
}
/**
* \brief Get the number of the current conversion phase
*
* Conversion is done in a number of named phases, this
* function will retrieve the number of the current conversion phase,
* which will be a number between 0 and wkhtmltopdf_phase_count(converter)-1.
*
* The description (name) of any phase can be retrieved by calling the
* \ref wkhtmltopdf_phase_description method.
*
* \param converter The converter to find the current phase of
* \returns The current phase of the supplied converter
*/
CAPI(int) wkhtmltopdf_current_phase(wkhtmltopdf_converter * converter) {
return reinterpret_cast(converter)->converter.currentPhase();
}
/**
* \brief Get the total number of phases the conversion process will go trough
*
* \param converter The converter to query
* \returns The total number of phases in the conversion process
*
* \sa wkhtmltopdf_current_phase, wkhtmltopdf_phase_description
*/
CAPI(int) wkhtmltopdf_phase_count(wkhtmltopdf_converter * converter) {
return reinterpret_cast(converter)->converter.phaseCount();
}
/**
* \brief Return a short utf8 description of a conversion phase
*
* \param converter The converter to query
* \param phase The number of the conversion step of which we want a description
* \returns A description of the conversion phase
*
* \sa wkhtmltopdf_current_phase, wkhtmltopdf_phase_description
*/
CAPI(const char *) wkhtmltopdf_phase_description(wkhtmltopdf_converter * converter, int phase) {
MyPdfConverter* conv = reinterpret_cast(converter);
QString pd = conv->converter.phaseDescription(phase);
if (!conv->utf8StringCache.contains(pd))
{
return conv->utf8StringCache.insert(pd, pd.toUtf8()).value().constData();
}
else
return conv->utf8StringCache[pd].constData();
}
/**
* \brief Return a short utf8 string indicating progress within a phase
*
* Will typically return a string like "40%"
*
* \param converter The converter to query
* \returns A string containing a progress indication
*
* \sa wkhtmltopdf_set_progress_changed_callback
*/
CAPI(const char *) wkhtmltopdf_progress_string(wkhtmltopdf_converter * converter) {
MyPdfConverter* conv = reinterpret_cast(converter);
QString ps = conv->converter.progressString();
if (!conv->utf8StringCache.contains(ps))
return conv->utf8StringCache.insert(ps, ps.toUtf8()).value().constData();
else
return conv->utf8StringCache[ps].constData();
}
/**
* \brief Return the largest HTTP error code encountered during conversion
*
* Return the largest HTTP code greater then or equal to 300 encountered during loading
* of any of the supplied objects, if no such error code is found 0 is returned.
* This function will only return a useful result after \ref wkhtmltopdf_convert has been called.
*
* \param converter The converter to query
* \returns The HTTP error code.
*/
CAPI(int) wkhtmltopdf_http_error_code(wkhtmltopdf_converter * converter) {
return reinterpret_cast(converter)->converter.httpErrorCode();
}
/**
* \brief Get the output document generated during conversion.
*
* If no "out" location was specified in the global settings object, the binary
* output (pdf document) of the convection process will be stored in a buffer.
*
* \param converter The converter to query
* \param d A pointer to a pointer that will be made to point to the output data
* \returns The length of the output data
*/
CAPI(long) wkhtmltopdf_get_output(wkhtmltopdf_converter * converter, const unsigned char ** d) {
const QByteArray & out = reinterpret_cast(converter)->converter.output();
*d = (const unsigned char*)out.constData();
return out.size();
}
// LocalWords: eval progn stroustrup innamespace sts sw noet wkhtmltopdf DLL
// LocalWords: ifdef WKHTMLTOX UNDEF undef endif pdf dllbegin namespace const
// LocalWords: QString cb bool ok globalSettings phaseChanged progressChanged
// LocalWords: objectSettings utf CropSettings HeaderFooter ImageGlobal dpi sa
// LocalWords: PdfGlobal PdfObject TableOfContent pagePdfGlobal pagePdfObject
// LocalWords: pageImageGlobal pageGlobalLoad paperSize colorMode Grayscale
// LocalWords: pageOffset outlineDepth dumpOutline stdout pageLoad pageWeb aa
// LocalWords: includeInOutline pagesCount tocXsl xsl struct typedef str CAPI
// LocalWords: param STRINGIZEE STRINGIZE deinit qApp strcpy wkhtmltox arg ug
// LocalWords: WS MACX MyLooksStyle setStyle isNull qstrncpy MyPdfConverter
// LocalWords: beginConvertion paragm addResource currentPhase phaseCount
// LocalWords: urrent http httpErrorCode QByteArray constData