2015-02-23 2 views
0

Я собираю доказательство концепции приложения, которое будет работать на планшете 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()); 

и все работало, как ожидалось.

+0

Я бы начал с отладки от источника. Вы увидите, что вы смотрите на [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 и из него. –

+0

Спасибо, Крис, я обновил вопрос, как я решил проблему на основе вашего комментария и прочего, что я прочитал прошлой ночью. –

ответ

2

Основываясь на комментарии Криса Хасса, а также другую информацию, которую я прочитал прошлой ночью, я в конечном итоге не полагался на PdfReader, чтобы прочитать файл. Я изменил эту строку:

var reader = new PdfReader(path); 

к этому:

StorageFile file = await StorageFile.GetFileFromPathAsync(templatePath); 
var buf = await FileIO.ReadBufferAsync(file); 
var reader = new PdfReader(buf.ToArray()); 

и все работало, как ожидалось.

Смежные вопросы