Я собираю доказательство концепции приложения, которое будет работать на планшете Windows 8.1 с использованием C# и библиотеки ITextSharp. Требования к доказательству концепции - это возможность использовать класс FileOpenPicker для выбора PDF-файла, загрузки файла в память, программного заполнения полей формы PDF и сохранения файла в новом месте.ITextSharp PdfReader не открывает PDF-файл
У меня есть доказательство работы концепции, если исходный файл PDF установлен с самим приложением в установленном месте приложения (Windows.ApplicationModel.Package.Current.InstalledLocation.Path), однако, если я поместил исходный PDF куда-нибудь еще и использовать FileOpenPicker, чтобы позволить пользователю выбрать файл PDF, то PdfReader выдает следующее исключение:
C:\\aaa\\PDFTemplates\\ScribusPDF2.tpdf not found as file or resource.
Примечание Я использую расширение TPDF для обозначения файла шаблона PDF для моего приложения, однако это по-прежнему не работает даже если я использую стандартное расширение pdf. Вот мой код для сборщика файла:
FileOpenPicker openPicker = new FileOpenPicker();
openPicker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary;
openPicker.FileTypeFilter.Add(".tpdf");
StorageFile file = await openPicker.PickSingleFileAsync();
if (file != null)
{
StorageApplicationPermissions.FutureAccessList.AddOrReplace("PickedFileToken", file);
String path = file.Path.ToString();
var reader = new PdfReader(path);
}
else
{
Debug.WriteLine("Operation cancelled.");
}
Это читатель вар = новый PdfReader (путь); которая вызывает исключение. Моя первая мысль была у меня была проблема разрешения, поэтому я добавил расширение .tpdf и документы о возможностях библиотеки в файле манифеста, как это:
<Extensions>
<Extension Category="windows.fileTypeAssociation">
<FileTypeAssociation Name="pdf_template">
<DisplayName> PDF Template</DisplayName>
<SupportedFileTypes>
<FileType>.tpdf</FileType
</SupportedFileTypes>
</FileTypeAssociation>
</Extension>
</Extensions>
И
<Capability Name="documentsLibrary" />
<Capability Name="internetClient" />
</Capabilities>
Я до сих пор получил ту же ошибку, так Я написал тестовую процедуру, чтобы узнать, могу ли я получить доступ к файлу вне iTextSharp. Этот маршрут имеет следующий код:
Debug.WriteLine("Checking: " + templatePath);
StorageFile file = await StorageFile.GetFileFromPathAsync(templatePath);
var read = await FileIO.ReadBufferAsync(file);
var prop = await file.GetBasicPropertiesAsync();
Debug.WriteLine("Passed: " + templatePath);
Этот код работает отлично и не выбрасывает ошибку поэтому я знаю, что файл существует (с путем), и у меня есть разрешение на доступ к файлу, однако PdfReader с iTextSharp еще кидает указанное выше исключение, когда он пытается прочитать файл. Кто-нибудь знает, что может вызвать эту проблему?
Ниже приводится полный трассировки стека:
at iTextSharp.text.io.RandomAccessSourceFactory.CreateByReadingToMemory(String filename)
at iTextSharp.text.io.RandomAccessSourceFactory.CreateBestSource(String filename)
at iTextSharp.text.pdf.PdfReader..ctor(String filename, Byte[] ownerPassword, Boolean partial)
at iTextSharp.text.pdf.PdfReader..ctor(String filename, Byte[] ownerPassword)
at iTextSharp.text.pdf.PdfReader..ctor(String filename)
at PDFFromTemplateTest.MainPage.<findFile>d__0.MoveNext()
EDIT: Ответ
Основываясь на комментарий от Криса Хасс, а также другую информацию, я прочитал вчера вечером я оказался не полагаясь на PdfReader для чтения файла. Я изменил эту строку:
var reader = new PdfReader(path);
к этому:
StorageFile file = await StorageFile.GetFileFromPathAsync(templatePath);
var buf = await FileIO.ReadBufferAsync(file);
var reader = new PdfReader(buf.ToArray());
и все работало, как ожидалось.
Я бы начал с отладки от источника. Вы увидите, что вы смотрите на [RandomAccessSourceFactory.cs] (http://sourceforge.net/p/itextsharp/code/HEAD/tree/trunk/src/core/iTextSharp/text/io/RandomAccessSourceFactory.cs#l182) и в конечном итоге [StreamUtil] (http://sourceforge.net/p/itextsharp/code/HEAD/tree/trunk/src/core/iTextSharp/text/io/StreamUtil.cs#l114). Один из вариантов, который вы могли бы попробовать, - использовать ваш собственный код «IO» и передать необработанные байты в iText и из него. –
Спасибо, Крис, я обновил вопрос, как я решил проблему на основе вашего комментария и прочего, что я прочитал прошлой ночью. –