使用wkhtmltopdf C库

时间:2015-08-18 21:39:07

标签: c++ qt wkhtmltopdf

我使用wkhtmltopdf C库将本地HTML文件转换为PDF,但无论我尝试过什么,它都无法成功转换文件。使用外部URI(如google.com)可以正常工作,但任何本地文件都将失败,无错误消息或HTTP错误代码1003或1302。

以下是我正在使用的代码:

wkhtmltopdf_global_settings *globalSettings;
wkhtmltopdf_object_settings *objectSettings;
wkhtmltopdf_converter *converter;

wkhtmltopdf_init(1);

globalSettings = wkhtmltopdf_create_global_settings();
wkhtmltopdf_set_global_setting(globalSettings, "size.paperSize", "A4");
wkhtmltopdf_set_global_setting(globalSettings, "orientation", "Portrait");
wkhtmltopdf_set_global_setting(globalSettings, "colorMode", "Color");
wkhtmltopdf_set_global_setting(globalSettings, "size.paperSize", "A4");
wkhtmltopdf_set_global_setting(globalSettings, "out", "output.pdf");

converter = wkhtmltopdf_create_converter(globalSettings);

objectSettings = wkhtmltopdf_create_object_settings();

wkhtmltopdf_set_object_setting(objectSettings, "load.blockLocalFileAccess", "false");


wkhtmltopdf_set_object_setting(objectSettings, "page", "inputfile.html");

wkhtmltopdf_add_object(converter, objectSettings, NULL);

if (wkhtmltopdf_convert(converter) != 1)
{
    qWarning(qPrintable("Error code: " + QString::number(wkhtmltopdf_http_error_code(converter))));
}

wkhtmltopdf_destroy_converter(converter);
wkhtmltopdf_deinit();

我正在使用QT,输入文件位于我的资源文件中。我已经尝试了很多变化来获取wkhtmltopdf来加载文件,但以下都没有工作(一些自由已经采用了以下来源,但你应该明白了):

我尝试将输入文件的内容复制到QTemporaryFile中,然后加载该文件:

QTemporaryFile temp;
if (temp.open())
{
    temp.write(inputFile.readAll());
    wkhtmltopdf_set_object_setting(objectSettings, "page", temp.fileName());
}

我尝试直接使用资源文件路径:

wkhtmltopdf_set_object_setting(objectSettings, "page", ":templates/input.html");

我还尝试在file://中添加上述尝试。有没有人知道为什么它可能无法正常工作,若然,如何解决?

1 个答案:

答案 0 :(得分:2)

Qt资源路径很可能无法正常工作。资源路径仅对内部使用QFile 使用与代码使用的Qt库相同副本的API可见。

使用临时文件的方法是一个不错的解决方法。

但这条线确实无法运作:

wkhtmltopdf_set_object_setting(objectSettings, "page", temp.fileName());

您传递的类型(QString)是错误的。不幸的是,界面是类似C的,并且没有类型安全性,所以你会厌倦自满。您需要传递一个utf8编码的文件路径:

wkhtmltopdf_set_object_setting(objectSettings, "page",
                               temp.fileName().toUtf8().constData());