使用 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());
我正在使用 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());