формы xamarin получают путь в формате pdf - PullRequest
0 голосов
/ 25 марта 2019

Я успешно прочитал PDF из проекта и отображается в WebView. Я хочу получить путь к файлу pdf из моего проекта и проверить, существует ли он для его отображения, а если нет, дать ему другой URI для открытия. Кто-нибудь знает, как я могу получить путь к PDF, и это работает как для Android, так и для iOS.

Вот мой код C #:

 string internalstorageurl = string.Format("file:///android_asset/Content/{0}", WebUtility.UrlEncode("Conctionprofile.pdf"));
        public pdfviewer ()
        {
            InitializeComponent ();
            PDFReading();
        }
        private void PDFReading()
        {

                pdfwebview.Uri = internalstorageurl;

        }

XAML:

    <?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:local="clr-namespace:AppXamarin.CustomRenders"
             x:Class="AppXamarin.Pages.pdfviewer"
             Padding="0,20,0,0">
    <ContentPage.Content>
        <local:CustomWebView x:Name="pdfwebview" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand"/>
    </ContentPage.Content>
</ContentPage>

Я проверяю, существует ли файл в моем проекте с этим кодом:

 [assembly: Dependency(typeof(GetPdfFilePath_Android))]
namespace AppXamarin.Droid.CustomRender
{
    public class GetPdfFilePath_Android : Java.Lang.Object, IGetPdfFilePath
    {
        public string filePath(string fileName)
        {      
                string internalstorageurl = string.Format("file:///android_asset/Content/{0}", WebUtility.UrlEncode(fileName));
            if (File.Exists(internalstorageurl))
                return internalstorageurl;
            else
                return "not found";
        }
    }
}

Оператор if всегда ложен

1 Ответ

1 голос
/ 26 марта 2019

Вы можете использовать dependencyService , чтобы получить путь к файлу pdf из приложения iOS и Android.

Интерфейс:

public interface IGetPdfFilePath
{
    string filePath(string fileName);
}

Получить путь к файлу в Xamarin.forms:

string pdfPath = DependencyService.Get<IGetPdfFilePath>().filePath("myPdf.pdf");
                Console.WriteLine(pdfPath);

В iOS путь зависит от того, где вы храните файл:

[assembly: Dependency (typeof (GetPdfFilePath_iOS))]

namespace UsingDependencyService.iOS
{
    public class GetPdfFilePath_iOS : IGetPdfFilePath
    {
        public GetPdfFilePath_iOS ()
        {
        }

        public string filePath(string fileName)
        {
            // 1. if your store your pdf in DocumentDirectory
            //string directories = NSSearchPath.GetDirectories(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomain.All)[0];
            //string pathBundle = directories + "/" + fileName;
            ////bool fileExists = NSFileManager.DefaultManager.FileExists(pathBundle);
            //return pathBundle;

            //2.pdf file in your project
            string pathBundle = Path.Combine(NSBundle.MainBundle.ResourcePath, fileName);

            return pathBundle;
        }
    }
}

В Android:

[assembly: Dependency(typeof(GetPdfFilePath_Android))]
namespace UsingDependencyService.Android
{
    public class GetPdfFilePath_Android : Java.Lang.Object, IGetPdfFilePath
    {

        public string filePath(string fileName)
        {

            string internalstorageurl = string.Format("file:///android_asset/Content/{0}", WebUtility.UrlEncode(fileName));

            return internalstorageurl;

        }
    }
}

Обновление

Добавьте эту строку: [assembly: Dependency(typeof(GetPdfFilePath_Android))] в ваш класс Android. GetPdfFilePath_Android вот имя вашего класса.

Другим способом является создание собственного средства визуализации вашего веб-вида, вы можете взглянуть на этот проект .

Обновление для проверки файла: , я добавляю этот метод в Android, чтобы проверить, существует ли файл внутри Assets/Content.

public bool fileExist (string fileName) {

            AssetManager assets = MainActivity.Instance.Assets;        
            string[] names = assets.List("Content");

            for (int i = 0; i < names.Length; i++)
            {
                if (names[i] == fileName)
                {
                    return true;
                }
            }

            return false;
        }

Примечание: Вы должны изменить действие сборки файла pdf на AndroidAsset, если вы не можете найти файл внутри Активов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...