Xamarin වලින් PDF Files විවර කරන හැටි

Xamarin වලින් PDF Files විවර කරන හැටි

2222
0
SHARE

මේ tutorial එකත් ලඟදී මම උත්සාහකරපු පොඩි වැඩක ප්‍රථිපලයක්. අද මම කියලා දෙන්න යන්නේ Xamarin වලින්  PDF file එකක් Open කරන හැටි ගැනයි.

PDF ගොනුවක විවර කිරීම ඉතාම පහසු කාර්යයක් වන අතර ඔබ ඉලක්ක කරන්නේ කුමන platform මතද, එය iOS සඳහා, ඔබට මූලික වශයෙන් ඔබගේ ගොනුව Web View බවට විවරකළ හැකි අතර එය එසේම ඔබට විශාලනය කිරීමට එනම් Zoom කිරීමට පොඩි පොඩි වැඩ කීපයක් තිබෙනවා.නමුත් එතනින් එහාට තවදුරටත් කිසිදු දෙයක් සිදු කරන්න හැකියාවක් නෑ.

තවද ඇන්ඩ්රොයිඩ් සහ වින්ඩෝස් සඳහා එය ටිකක් වෙනස්. එහිදී ආවේනික වූ PDF viewer එකක් නොමැති අතර ඔබේ පරිශීලකයාට කැමති PDF Viewer එකක් භාවිතා කරන්න අවස්ථාව සලසා දිය යුතුයි.

අපි මෙය Xamarin.Forms වලින් විසඳාගත හැකි ආකාරය දෙස බලමු. මම Shared Project එකකින් ආරම්භ කර iOS වලින් සිදු කරගන්න ආකාරය බලමු.

මෙහිදී මම PDF File එක Storage එකට Save කරගන්න ආකාරය පිළිබඳවත් ලියා ඇති අතර එය එසේ කිරීමෙන් ඔබට PDF file එක cache කිරීමට පහසු වෙනු ඇති.

මුලින්ම මේ පහලින් තියන Code එක ඔයාගේ Shared Project එකට ඇතුලත් කරගන්න . ඒසඳහා කැමති XAML View එකක් භාවිතා කරන්න.

<?xml version="1.0" encoding="utf-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:controls="clr-namespace:pdfjs.Controls"
    x:Class="pdfjs.pdfjsPage">
	<Grid>
        
        <controls:PdfWebView x:Name="PdfView" />
    </Grid>
</ContentPage>

 

දැන් මේ Web View එකට පහලින් තියන C# Code behind එක එකතු කරගන්න.

using System;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using pdfjs.Interfaces;
using Xamarin.Forms;

namespace pdfjs
{
    public partial class pdfjsPage : ContentPage
    {
        public pdfjsPage(string url)
        {
            InitializeComponent();

            var localPath = string.Empty;

            if (Device.RuntimePlatform == Device.Android)
            {
                var dependency = DependencyService.Get<ILocalFileProvider>();

                if (dependency == null)
                {
                    DisplayAlert("Error loading PDF", "Computer says no", "OK");

                    return;
                }

                var fileName = Guid.NewGuid().ToString();

                // Download PDF locally for viewing
                using (var httpClient = new HttpClient())
                {
                    var pdfStream = Task.Run(() => httpClient.GetStreamAsync(url)).Result;

                    localPath =
                        Task.Run(() => dependency.SaveFileToDisk(pdfStream, $"{fileName}.pdf")).Result;
                }

                if (string.IsNullOrWhiteSpace(localPath))
                {
                    DisplayAlert("Error loading PDF", "Computer says no", "OK");

                    return;
                }
            }

            if (Device.RuntimePlatform == Device.Android)
                PdfView.Source = $"file:///android_asset/pdfjs/web/viewer.html?file={WebUtility.UrlEncode(localPath)}";
            else
                PdfView.Source = url;
        }
    }
}

දැන් iOS Platform Specific Project එකට පහලින් තියන Code එක එකතු කරගන්න.

using System;
using System.IO;
using System.Threading.Tasks;
using pdfjs.Interfaces;
using pdfjs.iOS.PlatformSpecifics;
using Xamarin.Forms;

[assembly: Dependency(typeof(LocalFileProvider))]

namespace pdfjs.iOS.PlatformSpecifics
{
    public class LocalFileProvider : ILocalFileProvider
    {
        private readonly string _rootDir = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "pdfjs");

        public async Task<string> SaveFileToDisk(Stream stream, string fileName)
        {
            if (!Directory.Exists(_rootDir))
                Directory.CreateDirectory(_rootDir);

            var filePath = Path.Combine(_rootDir, fileName);

            using (var memoryStream = new MemoryStream())
            {
                await stream.CopyToAsync(memoryStream);
                File.WriteAllBytes(filePath, memoryStream.ToArray());
            }

            return filePath;
        }
    }
}

දැන් Android  Platform Specific Project එකට පහලින් තියන Code එක එකතු කරගන්න.

using System.IO;
using System.Threading.Tasks;
using pdfjs.Droid.PlatformSpecifics;
using pdfjs.Interfaces;
using Xamarin.Forms;

[assembly: Dependency(typeof(LocalFileProvider))]
namespace pdfjs.Droid.PlatformSpecifics
{
    public class LocalFileProvider : ILocalFileProvider
    {
        private readonly string _rootDir = Path.Combine(Android.OS.Environment.ExternalStorageDirectory.Path, "pdfjs");

        public async Task<string> SaveFileToDisk(Stream pdfStream, string fileName)
        {
            if (!Directory.Exists(_rootDir))
                Directory.CreateDirectory(_rootDir);

            var filePath = Path.Combine(_rootDir, fileName);

            using (var memoryStream = new MemoryStream())
            {
                await pdfStream.CopyToAsync(memoryStream);
                File.WriteAllBytes(filePath, memoryStream.ToArray());
            }

            return filePath;
        }
    }
}

හොදයිදැන් ඔයාගේ Project එක Run කරලා බලන්න වැඩ කරනවාද කියලා. අයිත් දවසක අලුත්එ Xamarin Tutorial කක් එක්ක හමුවෙන්නම්.