使用PDFTron创建PDF文件,然后重命名或删除它

时间:2017-09-29 11:08:11

标签: pdf uwp pdftron

我正在尝试使用PDFTron在UWP环境中运行的应用程序中创建PDF文件。我能够成功创建一个文件。根据用户输入,可能需要重命名或从系统中完全删除新创建的文件。虽然当我尝试访问刚刚创建的文件时,系统会抛出以下异常:

final String input = "2022-03-17T23:00:00.000+0000";

try {
    OffsetDateTime.parse(input);
    LocalDateTime.parse(input, DateTimeFormatter.ISO_OFFSET_DATE_TIME);
}
catch (DateTimeParseException e) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SZ", Locale.GERMANY);
    sdf.parse(input);
}

以下部分显示了要创建的文件的用途:

Exception thrown: 'System.IO.IOException' in System.IO.FileSystem.dll The process cannot access the file (filename) because it is being used by another process.

这是我的删除实现:

await sdfDoc.SaveAsync(filePath, SDFDocSaveOptions.e_linearized, "%PDF-1.5");  
sdfDoc.Dispose();

文件的创建在单独的任务上运行,并且在按下按钮时进行删除。

我理解异常的性质,虽然我想知道在创建文件后文件的资源是否从PDFTron返回到系统?

非常感谢任何帮助或指示。

谢谢。

1 个答案:

答案 0 :(得分:0)

PDFNet在内部使用引用计数来知道何时释放文件系统句柄和内存。

例如,以下内容将触发文件仍处于锁定状态的问题。

PDFDoc doc = new PDFDoc(input_filename);
doc.InitSecurityHandler();
SDFDoc sdfdoc = doc.GetSDFDoc();
await sdfdoc.SaveAsync(output_file_path, SDFDocSaveOptions.e_linearized, "%PDF-1.5");
sdfdoc.Dispose();
await Task.Run(() => File.Delete(output_file_path)); // fails, as PDFDoc still has reference.

但这会按预期工作。

using(PDFDoc doc = new PDFDoc(input_filename))
{
    doc.InitSecurityHandler();
    SDFDoc sdfdoc = doc.GetSDFDoc();
    await sdfdoc.SaveAsync(output_file_path, SDFDocSaveOptions.e_linearized, "%PDF-1.5");
    sdfdoc.Dispose();
}
await Task.Run(() => File.Delete(output_file_path)); // works

请注意PDFDoc实例的using语句以及手动处理SDFDoc实例,尽管您也可以使用using语句。