修改wkhtmltox源碼,使得轉PDF、Image時支持中文路徑和中文名稱的轉換
1.VS2010配置QT5.5.0開發環境或者VS2010配置QT5.5.0開發環境
2.找到pdf_c_binding.cc將下列語句
a.修改
CAPI(int) wkhtmltopdf_set_global_setting(wkhtmltopdf_global_settings * settings, const char * name, const char * value) {
return reinterpret_cast<settings::PdfGlobal *>(settings)->set(name, QString::fromUtf8(value));
}
改為
CAPI(int) wkhtmltopdf_set_global_setting(wkhtmltopdf_global_settings * settings, const char * name, const char * value) {
return reinterpret_cast<settings::PdfGlobal *>(settings)->set(name, QString::fromLocal8Bit(value));
}
修改后重新編譯生成wkhtmltox.lib和wkhtmltox.dll,支持保存到本地的中文路徑和中文名稱
b.修改
CAPI(int) wkhtmltopdf_set_object_setting(wkhtmltopdf_object_settings * settings, const char * name, const char * value) {
return reinterpret_cast<settings::PdfObject *>(settings)->set(name, QString::fromUtf8(value));
}
為
CAPI(int) wkhtmltopdf_set_object_setting(wkhtmltopdf_object_settings * settings, const char * name, const char * value) {
return reinterpret_cast<settings::PdfObject *>(settings)->set(name, QString::fromLocal8Bit(value));
}
修改后重新編譯生成wkhtmltox.lib和wkhtmltox.dll,支持中文名稱的本地html和網上html保存到本地
3. 找到image_c_binding.cc 將下列語句
a.修改
CAPI(int) wkhtmltoimage_set_global_setting(wkhtmltoimage_global_settings * settings, const char * name, const char * value) {
return reinterpret_cast<settings::ImageGlobal *>(settings)->set(name, QString::fromUtf8(value));
}
為
CAPI(int) wkhtmltoimage_set_global_setting(wkhtmltoimage_global_settings * settings, const char * name, const char * value) {
return reinterpret_cast<settings::ImageGlobal *>(settings)->set(name, QString::fromLocal8Bit(value));
}
修改后重新編譯生成wkhtmltox.lib和wkhtmltox.dll,支持保存到本地的中文路徑和中文名稱
4. 關於網頁轉為image 輸出內容為亂碼問題
找到image_c_binding.cc與 image_c_binding_p.hh將下列語句,在頭文件中添加
#include <QHash>
MyImageConverter類中添加
QHash<QString, QByteArray> utf8StringCache;
a.修改
CAPI(const char *) wkhtmltoimage_phase_description(wkhtmltoimage_converter * converter, int phase) {
return reinterpret_cast<MyImageConverter *>(converter)->converter.phaseDescription(phase).toUtf8().constData();
}
為
CAPI(const char *) wkhtmltoimage_phase_description(wkhtmltoimage_converter * converter, int phase) {
MyImageConverter* conv = reinterpret_cast<MyImageConverter *>(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();
}
b.修改
CAPI(const char *) wkhtmltoimage_progress_string(wkhtmltoimage_converter * converter) {
return reinterpret_cast<MyImageConverter *>(converter)->converter.progressString().toUtf8().constData();
}
為
CAPI(const char *) wkhtmltoimage_progress_string(wkhtmltoimage_converter * converter) {
MyImageConverter* conv = reinterpret_cast<MyImageConverter *>(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();
}
修改后重新編譯生成wkhtmltox.lib和wkhtmltox.dll,即可以解決該問題