Я создаю один сейчас
работаю вXamarin PCL проект с платформамиAndroid а такжеUWP, В качестве функции пользователь должен иметь возможность открыть PDF-файл.
Для этого я используюMozilla pdf.js, Я перешел по этой ссылке, чтобы сделать это наAndroid и UWP. https://developer.xamarin.com/recipes/cross-platform/xamarin-forms/controls/display-pdf/ Только для UWP я не могу заставить его работать.
Вот мой пользовательский рендерер для UWP
[assembly: ExportRenderer(typeof(PdfView),
typeof(PDF.UWP.Renderers.PdfViewRenderer))]
namespace PDF.UWP.Renderers
{
/// <summary>
/// The asset folder of the UWP app must contain the pdfjs folder and files.
/// </summary>
public class PdfViewRenderer: WebViewRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
{
base.OnElementChanged(e);
if (e.NewElement != null)
{
PdfView pdfView = Element as PdfView;
string sFile = string.Format("ms-appx-web://{0}", WebUtility.UrlEncode(pdfView.Uri));
Control.Source = new Uri(string.Format("ms-appx-web:///Assets/pdfjs/web/viewer.html?file={0}", sFile));
}
}
}
}
Вот мой класс PdfView.
public class PdfView: WebView
{
public static readonly BindableProperty DocumentInfoProperty =
BindableProperty.Create(propertyName: nameof(TheDocumentInfo), returnType: typeof(DocumentInfo),
declaringType: typeof(PdfView), defaultValue: default(DocumentInfo));
public DocumentInfo TheDocumentInfo
{
get { return (DocumentInfo)GetValue(DocumentInfoProperty); }
set { SetValue(DocumentInfoProperty, value); }
}
public string Uri { get { return TheDocumentInfo.LocalUrl; } }
public string FileName { get { return TheDocumentInfo.FileName; } }
}
Расположение файла в uwp = "ms-appx-web: //C%3A%5CUsers%5CUser%5CAppData%5CLocal%5CPackages%5CPDFTEST.UWP_v4j5n0js0cwst%5CLocalState%5CPDFTest.pdf"
И это правильно.
Но ошибка такова:
Сообщение: неожиданный ответ сервера (0) при получении PDF "ms-appx-web: // C: /Users/User/AppData/Local/Packages/PDFTest.UWP_v4j5n0js0cwst/LocalState/PDFTest.pdf/".
ОБНОВИТЬ
Я воссоздал рендер:
protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
{
base.OnElementChanged(e);
if (e.NewElement != null)
{
// TODO: testen
PdfView pdfView = Element as PdfView;
string sFile = string.Format("ms-appx-web://{0}/{1}", pdfView.Uri.Replace(pdfView.FileName, ""), WebUtility.UrlEncode(pdfView.FileName));
Control.Source = new Uri(string.Format("ms-appx-web:///Assets/pdfjs/web/viewer.html?file={0}", sFile));
}
}
Я не знаю, является ли это решением моей проблемы, но эта ошибка исчезла.Ошибка сейчас:
PDF.js v1.1.366 (сборка: 9e9df56)
Сообщение: поток должен иметь данные
ОБНОВИТЬ (Я не знаю, стоит ли добавить это в этот вопрос или я должен был сделать еще один).
Моя ошибка все еще
поток должен иметь данные
Теперь я знаю почему. Потому что я разрабатываю приложение UWP и хочу получить доступ к файлу вне моей папки установки. Это место
C: \ Users \ User \ AppData \ Local \ Packages \ PDFTest.UWP_v4j5n0js0cwst \ LocalState \ По-видимому, я не могу получить доступ к файлам за пределами моей папки установки. Это включает копирование файла в мою папку установки и чтение его там.
ОБНОВИТЬ
У меня есть 2 версии pdf.js в моем проекте. (1.1.366 и 1.9.426) Теперь это мой кодКогда я пытаюсь открыть файл с помощью Launcher.LaunchFileAsync и использовать uriString, он открывает мой браузер и показывает мне файл.
protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
{
base.OnElementChanged(e);
if (e.NewElement != null)
{
PdfView pdfView = Element as PdfView;
var uriString = "ms-appdata:///local/" + WebUtility.UrlEncode(pdfView.FileName);
Control.Source = new Uri(string.Format("ms-appx-web:///Assets/pdfjs/web/viewer.html?file={0}", uriString));
}
}
В моем приложении я получаю следующую ошибку
(v1.1.366) Поток должен иметь данные.
(v1.9.426) Неожиданный ответ сервера (0) при получении PDF "ms-appdata: ///local/PDFTest.pdf".
Я знаю, что PDF URI является правильным и доступным, но он все еще не работает. (для v1.9.426 я добавил в viewer.js
var HOSTED_VIEWER_ORIGINS = ['null', '
http://mozilla.github.io','https://mozilla.github.io',' ms-appdata: // ',' ms-appx-web: //PDFTest.uwp '];)ссылка на тестовый проект