Skip to content

Instantly share code, notes, and snippets.

@leandrosilva
Created December 31, 2020 15:14
Show Gist options
  • Save leandrosilva/90fe17fe0ad1b88beb14dff7952584e7 to your computer and use it in GitHub Desktop.
Save leandrosilva/90fe17fe0ad1b88beb14dff7952584e7 to your computer and use it in GitHub Desktop.
My contribution to the V programming language - yet another example of C interop
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 "wkhtmltox/pdf.h"
struct C.wkhtmltopdf_global_settings {}
struct C.wkhtmltopdf_object_settings {}
struct C.wkhtmltopdf_converter {}
fn C.wkhtmltopdf_init(use_graphics bool) int
fn C.wkhtmltopdf_deinit() int
fn C.wkhtmltopdf_version() charptr
fn C.wkhtmltopdf_create_global_settings() &C.wkhtmltopdf_global_settings
fn C.wkhtmltopdf_destroy_global_settings(global_settings &C.wkhtmltopdf_global_settings)
fn wkhtmltopdf_set_global_setting(global_settings &C.wkhtmltopdf_global_settings,
name charptr, value charptr) bool
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,
name charptr, value charptr) bool
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,
data charptr)
fn C.wkhtmltopdf_convert(converter &C.wkhtmltopdf_converter) bool
fn C.wkhtmltopdf_http_error_code(converter &C.wkhtmltopdf_converter) int
fn C.wkhtmltopdf_get_output(converter &C.wkhtmltopdf_converter, data &charptr) int
fn main() {
// init
init := C.wkhtmltopdf_init(0)
println('wkhtmltopdf_init: $init')
version := C.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, 'page', 'http://www.google.com.br')
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)
println('wkhtmltopdf_convert: $result')
error_code := C.wkhtmltopdf_http_error_code(converter)
println('wkhtmltopdf_http_error_code: $error_code')
if result {
data := &charptr(0)
size := C.wkhtmltopdf_get_output(converter, &data)
println('wkhtmltopdf_get_output: $size bytes')
mut file := os.open_file('./google.pdf', 'w+', 0o666) or {
println('ERR: $err')
return
}
wrote := file.write_bytes(data, size)
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')
}
@leandrosilva
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment