本教程展示如何使用LEADTOOLS SDK在c# Xamarin应用程序中将文档加载到文档查看器中。
概述 | |
---|---|
总结 | 本教程介绍如何在c# Xamarin应用程序的文档查看器中显示文件。 |
完成时间 | 45分钟 |
Visual Studio项目 | 下载教程项目(422kb) |
平台 | c# Xamarin跨平台应用 |
IDE | Visual Studio 2017, 2019 |
开发许可 | 下载LEADTOOLS |
步骤熟悉创建项目的基本步骤添加引用和设置License教程,在工作之前在文档查看器中显示文件- Xamarin c#教程。
中创建的项目的副本开始添加引用和设置License教程。如果您没有该项目,请按照该教程中的步骤创建它。
所需要的参考资料取决于项目的目的。引用可以由NuGet引用添加。
本教程需要以下NuGet包:
Leadtools.Document.Sdk
Leadtools.Document.Viewer.Xamarin
Leadtools.Viewer.Controls.Xamarin
许可证解锁项目所需的特性。它必须在调用任何工具箱函数之前设置。有关包括针对不同平台的教程的详细信息,请参阅设置运行时License.
有两种类型的运行时许可证:
请注意
如何正确添加LEADTOOLS NuGet和本地引用涵盖在添加引用和设置License教程。
随着项目的创建、引用的添加和许可的设置,编码就可以开始了。
在解决方案资源管理器,打开MainPage.xaml
.控件中添加以下代码ContentPage
要添加两个网格,一个为主题是
一个是缩略图,再加一个负载
按钮。
<ContentPage。内容>
<Grid x:Name="documentViewerContainer" HorizontalOptions=" fillanexpand " VerticalOptions=" fillanexpand " BackgroundColor="Black">
<网格。RowDefinitions>
<RowDefinition x:Name="viewGridRow" Height="6*"/>
<RowDefinition x:Name="thumbGridRow" Height="2*"/>
<RowDefinition x:Name="loadButtonRow" Height="Auto" />
</网格。RowDefinitions>
<网格网格。行="0" x:Name="viewGrid" HorizontalOptions=" fillanexpand " VerticalOptions=" fillanexpand ">
<网格。ColumnDefinitions>
<ColumnDefinition宽度= " * " />
</网格。ColumnDefinitions>
</网格>
<网格网格。行="1" x:Name="thumbnailsGrid" HorizontalOptions=" fillanexpand " VerticalOptions=" fillanexpand ">
<网格。ColumnDefinitions>
<ColumnDefinition宽度= " * " />
</网格。ColumnDefinitions>
</网格>
<网格边缘="10,5"网格。行="2" HorizontalOptions=" fillanexpand " VerticalOptions=" fillanexpand ">
<网格。ColumnDefinitions>
<ColumnDefinition宽度= " * " />
</网格。ColumnDefinitions>
<按钮x:Name="_loadDocument" Text="Load" BorderColor="LightCoral" Clicked="_loadDocument_Clicked" HorizontalOptions=" fillanexpand "/>
</网格>
</网格>
</ ContentPage。内容>
右键单击页面并选择视图代码或按F7,以显示背后的代码MainPage.xaml
.类型中添加了以下语句使用
顶部的块。
//在顶部使用块
使用系统;
使用先;
使用System.ComponentModel;
使用包含;
使用System.Threading.Tasks;
使用Xamarin.Forms;
使用Leadtools;
使用Leadtools.Document;
使用Leadtools.Caching;
使用Leadtools.Document.Viewer;
使用Leadtools.Controls;
使用DataService;
将下面的全局变量添加到主页
类。
私人LEADDocument virtualDocument;
私人FileCache缓存;
私人主题是主题是;
添加下面的代码来初始化Document Viewer。
控件中添加一个新方法主页
类命名InitDocumentViewer ()
.方法中调用此方法主页()
方法。InitializeComponent ()
调用。添加下面的代码来初始化主题是
缩略图容器。
私人无效InitDocumentViewer ()
{
varcreateOptions =新DocumentViewerCreateOptions ();
//设置文档查看器显示的UI部分
createOptions。ViewContainer = viewGrid;
//设置显示缩略图的UI部分
createOptions。ThumbnailsContainer = thumbnailsGrid;
//暂不使用注释
createOptions。UseAnnotations =假;
//现在创建查看器
documentViewer = DocumentViewerFactory.CreateDocumentViewer(createOptions);
documentViewer.View.ImageViewer.Zoom (ControlSizeMode。FitAlways, 1.0, documentViewer.View.ImageViewer.DefaultZoomOrigin);
documentViewer.View.ImageViewer.ViewLayout =新ImageViewerSingleViewLayout ();
ImageViewerPanZoomInteractiveMode _mode =新ImageViewerPanZoomInteractiveMode ();
documentViewer.View.ImageViewer.InteractiveModes.Add (_mode);
documentViewer.Thumbnails.ImageViewer.ViewLayout =新ImageViewerHorizontalViewLayout ();
缓存=新FileCache
{
CacheDirectory = DependencyService.Get
().GetCachePath() };
virtualDocument = DocumentFactory。创建(新CreateDocumentOptions() {Cache = Cache, UseCache =真正的});
}
的底部添加一个新的名称空间MainPage.xaml.cs
被称为DataService
.这个命名空间将是在Android和iOS上有不同实现的方法的依赖服务。
//依赖服务
名称空间DataService
{
公共接口IGetPaths
{
字符串GetAppPath ();
字符串GetCachePath ();
}
公共接口IDocumentPicker
{
任务<流程> GetDocumentStreamAsync ();
}
}
右键单击> <项目。安卓
并选择添加->新项目.选择类
选项并命名类DocumentPickerImplementation.cs
,然后按添加.
添加以下内容使用
对新类的语句:
使用系统;
使用System.Collections.Generic;
使用来;
使用包含;
使用先;
使用System.Threading.Tasks;
使用Android.App;
使用Android.Content;
使用Android.OS;
使用Android.Runtime;
使用Android.Views;
使用Android.Widget;
使用Xamarin.Forms;
使用DataService;
使用Display_Files_in_a_Document_Viewer.Droid;
方法中添加方法DocumentPickerImplementation
类GetDocumentStreamAsync ()
返回一个任务<流程>
.使用下面的代码来实现DocumentPicker
在Android设备上。
[组装:依赖(typeof (DocumentPickerImplementation)))
名称空间Display_Files_in_a_Document_Viewer。机器人
{
类DocumentPickerImplementation: IDocumentPicker
{
公共任务<流程> GetDocumentStreamAsync ()
{
String[] supportedMimeTypes =
{
“应用程序/ pdf”
};
意图=新意图();
intent.SetType (supportedMimeTypes。长度== 1 ?supportedMimeTypes [0]:“* / *”);
如果(supportedMimeTypes。长度> 0)
{
intent.PutExtra(意图。ExtraMimeTypes supportedMimeTypes);
}
intent.SetAction (Intent.ActionOpenDocument);
intent.AddFlags (ActivityFlags.GrantReadUriPermission);
MainActivity activity = MainActivity. instance;
如果(活动。PickDocumentTaskCompletionSource = =零|| activity.PickDocumentTaskCompletionSource.Task.IsCompleted || activity. pickdocumenttaskcompletionsource . task . iscancelled
{
activity.StartActivityForResult (Intent.CreateChooser(意图,“选择文件”), MainActivity.PickDocumentId);
活动。PickDocumentTaskCompletionSource =新TaskCompletionSource <流程> ();
返回activity.PickDocumentTaskCompletionSource.Task;
}
其他的
{
返回activity.PickDocumentTaskCompletionSource.Task;
}
}
}
}
请注意
确保添加
(组装依赖(typeof (DocumentPickerImplementation))):
行代码,这样就可以找到实现的DependencyService
.
在解决方案资源管理器,打开MainActivity.cs
.确保以下使用
添加语句。
使用系统;
使用先;
使用System.Threading.Tasks;
使用Android.App;
使用Android.Content.PM;
使用Android.Runtime;
使用Android.Views;
使用Android.Widget;
使用Android.OS;
使用Android.Content;
添加实例= this;
到OnCreate
方法,以允许代码调用MainActivity的
实例。
//添加这个变量在OnCreate()中使用
公共静态MainActivity实例{得到;私人集;}
受保护的覆盖无效OnCreate(包savedInstanceState)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource =资源。布局。工具栏;
基地.OnCreate (savedInstanceState);
全球::Xamarin.Forms.Forms.Init (这, savedInstanceState);
实例=这;
LoadApplication (新应用());
}
将下面的代码添加到OnActivityResult
方法来处理使用DocumentPicker
,收集流,并将流交给任务完成源。
//添加在OnActivityResult()中使用的变量
公共TaskCompletionSource
PickDocumentTaskCompletionSource {集;得到;} 公共静态只读的intPickDocumentId = 1000;
受保护的覆盖无效OnActivityResult (intrequestCode, Result resultCode, Intent data)
{
基地.OnActivityResult(requestCode, resultCode, data);
如果(requestCode == PickDocumentId)
{
如果(resultCode == Result.)Ok && data !=零)
{
Android.Net.Uri uri = data.Data;
Stream = ContentResolver.OpenInputStream(uri);
PickDocumentTaskCompletionSource.SetResult(流);
}
其他的
{
PickDocumentTaskCompletionSource。SetResult (零);
}
}
}
右键单击> <项目。安卓
并选择添加->新项目.选择类
选项并命名类GetPathsImplementation.cs
,然后按添加.
添加以下内容使用
对新类的语句:
使用系统;
使用System.Collections.Generic;
使用来;
使用包含;
使用先;
使用System.Threading.Tasks;
使用Android.App;
使用Android.Content;
使用Android.OS;
使用Android.Runtime;
使用Android.Views;
使用Android.Widget;
使用Xamarin.Forms;
使用DataService;
使用Display_Files_in_a_Document_Viewer.Droid;
属性中添加两个方法GetPathsImplementation
类命名GetAppPath ()
而且GetCachePath ()
.添加下面的代码以返回应用程序使用的本地路径和缓存使用的本地路径。
[组装:依赖(typeof (GetPathsImplementation)))
名称空间Display_Files_in_a_Document_Viewer。机器人
{
类GetPathsImplementation: IGetPaths
{
公共字符串GetAppPath ()
{
Java.IO.File basedir = Android.OS.Environment.ExternalStorageDirectory;
Java.IO.File leadDir =新Java.IO.File ($“{basedir} / Leadtools”);
如果(! leadDir.Exists ()) leadDir.Mkdir ();
Java.IO.File appDir =新Java.IO.File ($“{leadDir} / DocumentViewerDemo”);
如果(! appDir.Exists ()) appDir.Mkdir ();
返回appDir.AbsolutePath;
}
公共字符串GetCachePath ()
{
Java.IO.File droidCacheDir =新Java.IO.File ($@”{GetAppPath()} /缓存”);
如果(! droidCacheDir.Exists ()) droidCacheDir.Mkdir ();
返回droidCacheDir.AbsolutePath;
}
}
}
请注意
确保添加
(组装依赖(typeof (GetPathsImplementation))):
行代码,这样就可以找到实现的DependencyService
.
右键单击<项目> .iOS
并选择添加->新项目.选择类
选项并命名类DocumentPickerImplementation.cs
,然后按添加.
添加以下内容使用
对新类的语句:
使用系统;
使用System.Collections.Generic;
使用来;
使用包含;
使用先;
使用System.Threading.Tasks;
使用基础;
使用UIKit;
使用Xamarin.Forms;
使用Display_Files_in_a_Document_Viewer.iOS;
使用DataService;
使用MobileCoreServices;
控件中添加一个新方法DocumentPickerImplementation
类GetDocumentStreamAsync ()
返回一个任务<流程>
.添加下面的代码来实现DocumentPicker
在iOS设备上。
[组装:依赖(typeof (DocumentPickerImplementation)))
名称空间Display_Files_in_a_Document_Viewer.iOS
{
[Xamarin.Forms.Internals。保存(AllMembers =真正的)]
类DocumentPickerImplementation: IDocumentPicker
{
TaskCompletionSource <流程> TaskCompletionSource;
UIDocumentPickerViewController documentPicker;
公共任务<流程> GetDocumentStreamAsync ()
{
试一试
{
varallowedUTIs =新字符串[]
{
UTType.PDF
};
//创建并定义UIDocumentPickerViewController
documentPicker =新UIDocumentPickerViewController (allowedUTIs UIDocumentPickerMode.Import);
//设置事件处理程序
documentPicker。WasCancelled += DocumentPicker_WasCancelled;
documentPicker。DidPickDocumentAtUrls += DocumentPicker_DidPickDocumentAtUrls;
//显示UIImagePickerController;
UIWindow window = UIApplication.SharedApplication.KeyWindow;
varviewController = window.RootViewController;
viewController。PresentModalViewController (documentPicker真正的);
//返回任务对象
taskCompletionSource =新TaskCompletionSource <流程> ();
返回taskCompletionSource.Task;
}
抓(异常ex) {Console.WriteLine(ex. message);返回零;}
}
私人无效DocumentPicker_DidPickDocumentAtUrls (对象发送者:uidocumentpickedaturlsevenargs
{
字符串文件名= e.l urls [0].LastPathComponent;
如果(文件名! =零)
{
NSData data = NSData. fromurl (e.l us[0]);
Stream = data.AsStream();
taskCompletionSource.SetResult(流);
}
其他的
{
taskCompletionSource。SetResult (零);
}
documentPicker。DismissModalViewController (真正的);
}
私人无效DocumentPicker_WasCancelled (对象发送者,EventArgs
{
taskCompletionSource。SetResult (零);
documentPicker。DismissModalViewController (真正的);
}
}
}
请注意
确保添加
(组装依赖(typeof (DocumentPickerImplementation))):
行代码,这样就可以找到实现的DependencyService
.
在解决方案资源管理器,打开AppDelegate.cs
.将下面的代码添加到FinishedLaunching ()
方法:
公共覆盖保龄球完成启动(UIApplication app, NSDictionary选项)
{
全球:Xamarin.Forms.Forms.Init ();
Leadtools.Controls.iOS.Assembly.Use ();
Leadtools.Document.Pdf.Assembly.Use ();
LoadApplication (新应用());
返回基地.FinishedLaunching(应用程序,选择);
}
右键单击<项目> .iOS
并选择添加->新项目.选择类
选项并命名类GetPathsImplementation.cs
,然后按添加.
添加以下内容使用
对新类的语句:
使用系统;
使用System.Collections.Generic;
使用来;
使用包含;
使用先;
使用System.Threading.Tasks;
使用基础;
使用UIKit;
使用Xamarin.Forms;
使用Display_Files_in_a_Document_Viewer.iOS;
使用DataService;
使用MobileCoreServices;
属性中添加两个方法GetPathsImplementation
类命名GetAppPath ()
而且GetCachePath ()
.添加下面的代码以返回应用程序使用的本地路径和缓存使用的本地路径。
[组装:依赖(typeof (GetPathsImplementation)))
名称空间DocViewer.iOS
{
[Xamarin.Forms.Internals。保存(AllMembers =真正的)]
类GetPathsImplementation: IGetPaths
{
公共字符串GetAppPath ()
{
vardocuments = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
varappDir = System.IO.Path.Combine(文档,“DocViewer”);
如果(! Directory.Exists (appDir)) Directory.CreateDirectory (appDir);
返回appDir;
}
公共字符串GetCachePath ()
{
varcacheDir = System.IO.Path.Combine(GetAppPath(),“缓存”);
如果(! Directory.Exists (cacheDir)) Directory.CreateDirectory (cacheDir);
返回cacheDir;
}
}
}
请注意
确保添加
(组装依赖(typeof (GetPathsImplementation))):
行代码,这样就可以找到实现的DependencyService
.
在解决方案资源管理器,导航回至MainPage.xaml.cs
.将下面的代码添加到_loadDocument_Clicked
处理程序,创建于MainPage.xaml
,从设备的图库中加载文档,并在查看器中设置文档。
私人异步无效_loadDocument_Clicked (对象发送者,EventArgs
{
试一试
{
流documentStream = await DependencyService.Get
().GetDocumentStreamAsync(); 如果(documentStream ! =零)
{
LEADDocument = DocumentFactory。LoadFromStream (
documentStream,
新LoadDocumentOptions
{
UseCache =真正的,
Cache = Cache,
LoadEmbeddedAnnotations =真正的
});
virtualDocument.Pages.Clear ();
为(intI = 0;i < leadDocument.Pages.Count;我+ +)
{
virtualDocument.Pages.Add (leadDocument.Pages[我]);
}
}
documentViewer.BeginUpdate ();
documentViewer.SetDocument (virtualDocument);
documentViewer.View.Invalidate ();
如果(是。缩略图! =零)
documentViewer.Thumbnails.Invalidate ();
documentViewer.EndUpdate ();
}
抓(异常交货)
{
等待DisplayAlert (“错误”、ex.ToString ()“OK”);
}
}
选择所需的项目(iOS或Android),按运行项目F5,或选择Debug ->开始调试.
如果正确地执行了这些步骤,应用程序将运行,并显示许可证已正确设置。要进行测试,请单击负载
按钮,调出DocumentPicker
为期望的项目实现。选择要加载的PDF文件,该文档将出现在查看器中。
Android:
iOS:
本教程展示了如何初始化Xamarin文档查看器、加载文档以及将文档设置到查看器中。它还涵盖了如何使用主题是
而且LEADDocument
类。