import os // Example of C interop for a very handy task. // // wkhtmltopdf and wkhtmltoimage are open source (LGPLv3) command line tools to // render HTML into PDF and various image formats using the Qt WebKit rendering // engine. These run entirely "headless" and do not require a display or display // service. // // https://github.com/wkhtmltopdf/wkhtmltopdf // https://wkhtmltopdf.org/downloads.html // https://wkhtmltopdf.org/libwkhtmltox/ #flag -lwkhtmltox #include "c_interop_wkhtmltopdf_wrapper.h" # You can install the C package for your system from the wkhtmltopdf.org/downloads.html page pub struct C.wkhtmltopdf_global_settings {} pub struct C.wkhtmltopdf_object_settings {} pub struct C.wkhtmltopdf_converter {} fn C.wkhtmltopdf_init(use_graphics i32) i32 fn C.wkhtmltopdf_deinit() i32 fn C.v_example_wkhtmltopdf_version() &char fn C.wkhtmltopdf_create_global_settings() &C.wkhtmltopdf_global_settings fn C.wkhtmltopdf_destroy_global_settings(global_settings &C.wkhtmltopdf_global_settings) fn C.wkhtmltopdf_set_global_setting(global_settings &C.wkhtmltopdf_global_settings, const_name &char, const_value &char) i32 fn C.wkhtmltopdf_create_object_settings() &C.wkhtmltopdf_object_settings fn C.wkhtmltopdf_destroy_object_settings(object_settings &C.wkhtmltopdf_object_settings) fn C.wkhtmltopdf_set_object_setting(object_settings &C.wkhtmltopdf_object_settings, const_name &char, const_value &char) i32 fn C.wkhtmltopdf_create_converter(global_settings &C.wkhtmltopdf_global_settings) &C.wkhtmltopdf_converter fn C.wkhtmltopdf_destroy_converter(converter &C.wkhtmltopdf_converter) fn C.wkhtmltopdf_add_object(converter &C.wkhtmltopdf_converter, object_settings &C.wkhtmltopdf_object_settings, const_data &char) fn C.wkhtmltopdf_convert(converter &C.wkhtmltopdf_converter) i32 fn C.wkhtmltopdf_http_error_code(converter &C.wkhtmltopdf_converter) i32 fn C.wkhtmltopdf_get_output(converter &C.wkhtmltopdf_converter, const_data &&u8) C.ptrdiff_t fn main() { // init init := C.wkhtmltopdf_init(0) println('wkhtmltopdf_init: ${init}') version := unsafe { cstring_to_vstring(C.v_example_wkhtmltopdf_version()) } println('wkhtmltopdf_version: ${version}') global_settings := C.wkhtmltopdf_create_global_settings() println('wkhtmltopdf_create_global_settings: ${voidptr(global_settings)}') object_settings := C.wkhtmltopdf_create_object_settings() println('wkhtmltopdf_create_object_settings') converter := C.wkhtmltopdf_create_converter(global_settings) println('wkhtmltopdf_create_converter: ${voidptr(converter)}') // convert mut result := C.wkhtmltopdf_set_object_setting(object_settings, c'page', c'http://www.google.com.br') != 0 println('wkhtmltopdf_set_object_setting: ${result} [page = http://www.google.com.br]') C.wkhtmltopdf_add_object(converter, object_settings, 0) println('wkhtmltopdf_add_object') result = C.wkhtmltopdf_convert(converter) != 0 println('wkhtmltopdf_convert: ${result}') error_code := C.wkhtmltopdf_http_error_code(converter) println('wkhtmltopdf_http_error_code: ${error_code}') if result { pdata := &u8(unsafe { nil }) ppdata := &pdata nbytes := C.wkhtmltopdf_get_output(converter, voidptr(ppdata)) println('wkhtmltopdf_get_output: ${nbytes} bytes') mut file := os.open_file('./google.pdf', 'w+', 0o666) or { println('ERR: ${err}') return } wrote := unsafe { file.write_ptr(pdata, int(nbytes)) } println('write_bytes: ${wrote} [./google.pdf]') file.flush() file.close() } // destroy C.wkhtmltopdf_destroy_converter(converter) println('wkhtmltopdf_destroy_converter') C.wkhtmltopdf_destroy_object_settings(object_settings) println('wkhtmltopdf_destroy_object_settings: ${voidptr(object_settings)}') C.wkhtmltopdf_destroy_global_settings(global_settings) println('wkhtmltopdf_destroy_global_settings') deinit := C.wkhtmltopdf_deinit() println('wkhtmltopdf_deinit: ${deinit}') }