我使用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://
中添加上述尝试。有没有人知道为什么它可能无法正常工作,若然,如何解决?
答案 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());