使用 wkhtmltopdf C 库将本地 HTML 文件转换为 PDF

Convert local HTML file to PDF with wkhtmltopdf C library

我正在使用 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 加载文件,但是下面的 none 已经奏效了(下面的源已经采取了一些自由,但你应该明白这个想法):

我尝试将输入文件的内容复制到 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://。有谁知道为什么它可能不起作用,如果是这样,如何解决它?

Qt 资源路径很可能不起作用。资源路径仅对内部使用 QFile 的 API 可见,这些 API 使用与代码所用相同的 Qt 库副本。

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

但是这条线真的行不通:

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

您传递的类型 (a QString) 是错误的。不幸的是,接口是类 C 的并且没有类型安全,因此您被哄骗自满了。您需要向它传递一个 utf8 编码的文件路径:

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