Linux桌面的颤振PDF查看器

Linux桌面的颤振PDF查看器,linux,flutter,pdf,desktop,Linux,Flutter,Pdf,Desktop,我正在为Android和Linux桌面平台开发一种聊天应用程序,它在Flatter上具有PDF查看功能 所以我想使用某种PDF阅读器或WebBrowser将PDF查看器嵌入到颤振应用程序中。Android上的PDF没有问题——pub.dev上有100多个用于PDF和WebView的插件,但都不支持Linux桌面 我曾尝试为Android和IOS插件添加Linux桌面支持,但看起来它们都使用PlatformView和webview_flift类,这在Linux桌面上还不受支持:。他们有P4优先级,

我正在为Android和Linux桌面平台开发一种聊天应用程序,它在Flatter上具有PDF查看功能

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

我曾尝试为Android和IOS插件添加Linux桌面支持,但看起来它们都使用PlatformView和webview_flift类,这在Linux桌面上还不受支持:。他们有P4优先级,没有分配里程碑。我不能无限长的时间等待,我应该在2个月内结束这个项目。那我该怎么办

我已经读到flifter使用GTK+在Linux桌面上显示,我知道有。那么,是否有可能以某种方式将该组件注入到FlatterUI中呢?有什么例子吗

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

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

我对Flutter和Linux都是新手,所以如果有任何帮助,我将不胜感激

那么,是否有可能以某种方式将该组件注入到FlatterUI中呢

这正是
PlatformView
的含义,因此这相当于Linux是否支持
PlatformView
的问题

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

  • 在显示颤振视图和PDF视图之间交换窗口(如果希望PDF在显示时填充窗口)
  • 将颤振视图和PDF视图并排放置在窗口中(如果希望颤振内容(如文件列表)和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));
}
#包括“my_application.h”
#包括
#包括
#包括“颤振/生成插件\u注册人.h”
静态作废我的应用程序激活(GAApplication*应用程序){
GtkWidget*vbox1=gtk_vbox_new(FALSE,0);
gtk_widget_show(vbox1);
//我们可以在FlView之外的窗口中插入任何gtk控件
GtkWidget*label=gtk_label_new(“你好GNOME!”);
gtk_-box_-pack_-start(gtk_-box(vbox1),标签,真,真,2);
gtk_widget_show(标签);
//webkit/poppler/Evence应该工作得很好,因为它们是gtk+
WebKitWebView*pWebKitView=WEBKIT_WEB_视图(WEBKIT_WEB_视图_new());
gtk_-box_-pack_启动(gtk_-box(vbox1),gtk_小部件(pWebKitView),真,真,2);
gtk_widget_show(gtk_widget(pWebKitView));
//最后添加FlView
g_autoptr(FlDartProject)project=fl_dart_project_new();
FlView*view=fl\U view\U new(项目);
gtk_-box_-pack_启动(gtk_-box(vbox1),gtk_小部件(视图),真,真,2);
gtk_小部件显示(gtk_小部件(视图));
GtkWindow*窗口=
GTK_窗口(GTK_应用程序窗口)新(GTK_应用程序(应用程序));
gtk_容器添加(gtk_容器(窗口),vbox1);
fl_注册插件(fl_插件注册(视图));
gtk_小部件_抓取_焦点(gtk_小部件(视图));
GtkHeaderBar*收割台横梁=GTK_收割台横梁(GTK_收割台横梁新();
gtk_小部件显示(gtk_小部件(标题栏));
gtk标题栏标题(标题栏,“客户”);
gtk_标题栏_设置_显示_关闭_按钮(标题栏,真);
gtk_窗口_设置_标题栏(窗口,gtk_小部件(标题栏));
gtk_窗口_设置_默认_大小(窗口,1280720);
gtk_小部件显示(gtk_小部件(窗口));
}

我想将颤振视图和PDF视图并排放在一个窗口中。我不想移动或调整此窗口的大小,它应该始终处于全屏模式。在Linux和Ubuntu上。我将尝试将两个GTK窗口组合在一起,这看起来就像解决方案,谢谢。为什么要使用两个单独的窗口,而不是将两个视图并排放在同一个窗口中?