開源wkhtmltopdf使用心得 (四)


修改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,即可以解決該問題


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM