Я пытаюсь автоматически создать PDF-файл из HTML в приложении Tauri. Насколько я могу судить, в настоящее время это не поддерживается в Tauri, поэтому мне нужно напрямую взаимодействовать с интерфейсами, специфичными для платформы.
Я обнаружил, что для окон мне нужно получить ICoreWebView2_7
окна, поскольку у него есть метод PrintToPdf
. Как мне это получить? (Или есть какой-то другой лучший способ решить эту проблему?)
Мне удалось получить ICoreWebView2
от webview2_com_sys вот так.
let _ = main_window.with_webview(|webview| {
#[cfg(windows)]
unsafe {
let corewebview = webview.controller().CoreWebView2().expect("");
}
}
Но метод printToPDF включен ICoreWebView2_7
. Итак, как мне получить ICoreWebView2_7
от ICoreWebView2
?
Это все еще довольно сложно и потребует от вас указания этих двух зависимостей (которые уже должны быть неявно в вашем проекте, поскольку они используются самим Tauri). Я использовал соответствующие версии для Тельца 1.6.1
, которые на данный момент довольно старые:
webview2-com = "0.19.1"
windows = "0.39.0"
тогда вы можете просто выполнить приведение (в данном случае к ICoreWebView2_10):
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
use tauri::Manager;
use webview2_com::{Microsoft::Web::WebView2::Win32::*, *};
use windows::core::Interface;
fn main() {
tauri::Builder::default()
.setup(|app| {
let main_window = app.get_window("main").unwrap();
main_window
.with_webview(|webview| {
#[cfg(windows)]
unsafe {
let Ok(webview) = webview
.controller()
.CoreWebView2()
.unwrap()
.cast::<ICoreWebView2_10>() // This is where the magic happens.
else {
panic!("Failed to cast PlatformWebview.");
};
//webview.PrintToPdf().expect("Failed to print to pdf.");
}
})
.expect("Failed to get webview.");
Ok(())
})
.run(tauri::generate_context!())
.expect("error while running tauri application");
}