ITextSharp PdfReader无法打开PDF文件

我正在整理一个概念验证应用程序,它将使用C#和ITextSharp库在Windows 8.1平板电脑上运行 . 概念证明的要求是能够使用FileOpenPicker类选择PDF文件,将文件加载到内存,以编程方式填写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.");
}

var reader = new PdfReader(path);导致异常的行 . 我的第一个想法是我有一个权限问题,所以我将.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);

此代码完美运行并且不会抛出错误因此我知道文件(带路径)存在且我有权访问该文件,但是当尝试读取文件时,带有iTextSharp的PdfReader仍然会抛出上述异常 . 有谁知道可能导致这个问题的原因是什么?

下面是完整的堆栈跟踪:

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: 答案

基于Chris Hass的评论以及我昨晚读到的其他信息,我最终没有依赖PdfReader来读取文件 . 我更改了这一行:

var reader = new PdfReader(path);

对此:

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

一切都按预期工作 .

回答(1)

2 years ago

基于Chris Hass的评论以及我昨晚读到的其他信息,我最终没有依赖PdfReader来读取文件 . 我更改了这一行:

var reader = new PdfReader(path);

对此:

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

一切都按预期工作 .