Получение ICoreWebView2_7 в Tauri для печати PDF-файла

Я пытаюсь автоматически создать 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?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
161
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это все еще довольно сложно и потребует от вас указания этих двух зависимостей (которые уже должны быть неявно в вашем проекте, поскольку они используются самим 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");
}

Другие вопросы по теме