Flutter PDF Viewer for Linux desktop



我在Flutter上为Android和Linux桌面平台开发了一些具有PDF查看功能的聊天应用程序。

所以我想使用某种PDF阅读器或WebBrowser将PDF查看器嵌入到flutter应用程序中。Android上的PDF没有问题-pub.dev上有100多个插件用于PDF和WebViews,但它们都不支持Linux桌面

我试着为Android和IOS插件添加Linux桌面支持,但看起来它们都使用了PlatformView和webview_flutter类,这在Linux桌面上还不支持:webview_fluster PlatformView。他们有P4优先级,没有分配里程碑。我不能等太久,我应该在两个月内结束这个项目。那我该怎么办?

我读过Flutter使用GTK+在Linux桌面上显示,我知道有GTK+组件可以显示PDF。那么,有可能以某种方式在flutter ui中注入这个组件吗?有什么例子吗?

或者更好的方法是将PDF转换为jpeg并显示图像?(但我不想丢失缩放和文档导航(

使用File.Open((将PDF打开到外部程序对我来说不是解决方案,因为在这种情况下,用户应该不断地在flutter应用程序(我们有PDF文件列表(和PDF阅读器窗口之间切换。

我是Flutter和Linux的新手,所以任何帮助都将不胜感激。

那么,有可能以某种方式将该组件注入到flutter ui中吗?

这正是PlatformView,所以这相当于Linux上是否支持PlatformView的问题。

两个选项可以在没有PlatformView支持的情况下工作:

  • 在显示Flutter视图和PDF视图之间切换窗口(如果您希望PDF在显示时填充窗口(
  • 将Flutter视图和PDF视图并排放置在窗口中(如果您希望Flutter内容(如文件列表(和PDF内容同时可见(

两者都需要在本机代码中完成工作,因此您需要编写一个插件,或者直接在运行程序中实现它,并使用方法通道在Dart和本机代码之间进行协调。

因此,为了澄清我们如何使用webkit实现这一点,例如:

CMakeLists.txt:

#add webkit package reference
pkg_check_modules(WEBKIT2 REQUIRED IMPORTED_TARGET webkit2gtk-4.0)
...
#remove -Werror flag to allow compilation with warnings
target_compile_options(${TARGET} PRIVATE -Wall)
...
#link webkit libraries
target_link_libraries(${BINARY_NAME} PUBLIC PkgConfig::WEBKIT2) 
#somehow this line causes 'flutter run' to crash on "Linking CXX executable" step.
#Looks like it compiles, but fails to link. 
#I think there is should be other question opened for this issue. 

my_application.cc:

#include "my_application.h"
#include <flutter_linux/flutter_linux.h>
#include <webkit2/webkit2.h>
#include "flutter/generated_plugin_registrant.h"
static void my_application_activate(GApplication* application) {
GtkWidget *vbox1 = gtk_vbox_new (FALSE, 0);
gtk_widget_show (vbox1);
// we can insert any gtk controls in this window outside of FlView
GtkWidget *label = gtk_label_new ("Hello GNOME!");
gtk_box_pack_start (GTK_BOX (vbox1), label, TRUE, TRUE, 2);
gtk_widget_show (label);
// webkit/poppler/evince should work perfect because they gtk+
WebKitWebView *pWebKitView = WEBKIT_WEB_VIEW(webkit_web_view_new());
gtk_box_pack_start (GTK_BOX (vbox1), GTK_WIDGET(pWebKitView), TRUE, TRUE, 2);
gtk_widget_show(GTK_WIDGET(pWebKitView));
// finally add FlView
g_autoptr(FlDartProject) project = fl_dart_project_new();
FlView *view = fl_view_new(project);
gtk_box_pack_start (GTK_BOX (vbox1), GTK_WIDGET(view), TRUE, TRUE, 2);
gtk_widget_show (GTK_WIDGET (view));
GtkWindow* window =
GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application)));
gtk_container_add (GTK_CONTAINER (window), vbox1);
fl_register_plugins(FL_PLUGIN_REGISTRY(view));
gtk_widget_grab_focus(GTK_WIDGET(view));
GtkHeaderBar *header_bar = GTK_HEADER_BAR(gtk_header_bar_new());
gtk_widget_show(GTK_WIDGET(header_bar));
gtk_header_bar_set_title(header_bar, "client");
gtk_header_bar_set_show_close_button(header_bar, TRUE);
gtk_window_set_titlebar(window, GTK_WIDGET(header_bar));
gtk_window_set_default_size(window, 1280, 720);
gtk_widget_show(GTK_WIDGET(window));
}

最新更新