gpt4 book ai didi

c# - C# 中的 IText 7 锁定错误 pdf

转载 作者:行者123 更新时间:2023-12-04 07:50:13 25 4
gpt4 key购买 nike

我在使用 IText 7 检查用户从 Internet 下载的 PDF 时遇到问题。

对于我的测试用例,我创建了一个包含垃圾的文本文件并将其另存为 pdf。我知道它无效。

在代码中,我尝试使用 PDFReader 打开 PDF。

抛出异常,这是预料之中的。调试代码时,Reader 对象到达 finally 点时为 null。所以reader.close() 甚至没有开火。我什至将文件复制到一个临时目录,以确保没有其他文件保存该文件。

异常发生后,我无法在代码中或在文件资源管理器中手动删除 PDF 文件。这是我的一些代码。我删除了除 Reader 部分以外的所有内容。此外,这段代码是在我尝试了一些事情之后,所以你看到我尝试将文件复制到临时文件。我试图在最后部分删除临时文件。那是在损坏的文件上失败。

以下是尝试验证错误 PDF 时抛出的两个异常。第一个来自 PDFReader 调用。

2021-04-09 13:18:11,079 ERROR GUI.Form1 - PDF header not found.
iText.IO.IOException: PDF header not found. at
iText.IO.Source.PdfTokenizer.GetHeaderOffset() at
iText.Kernel.Pdf.PdfReader.GetOffsetTokeniser(IRandomAccessSource> byteSource) at
iText.Kernel.Pdf.PdfReader..ctor(String filename, ReaderProperties properties) at
iText.Kernel.Pdf.PdfReader..ctor(FileInfo file) at
GUI.Form1.validatePDF(FileInfo pdfFile, HashSet`1 tmpMd5s)

第二个是尝试删除临时文件

2021-04-09 13:18:11,116 ERROR GUI.Form1 - The process cannot access the file
'C:\Users\ret63\AppData\Local\Temp\tmp27DE.tmp' because it is being used by another process.
System.IO.IOException: The process cannot access the file 'C:\Users\ret63\AppData\Local\Temp\tmp27DE.tmp' because it is being used by another process. at
System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.FileInfo.Delete() at
GUI.Form1.validatePDF(FileInfo pdfFile, HashSet`1 tmpMd5s)

PdfDocument pdfDoc = null;
PdfReader reader = null;

try
{
using (reader = new PdfReader(testFile))
{
//pdfDoc = new PdfDocument(reader);
//pdfDoc = new PdfDocument(new PdfReader(pdfFile.FullName));
//Console.WriteLine("Number of Pages: " + pdfDoc.GetNumberOfPages());
//pdfDoc.Close();
}
}
catch(Exception ex)
{
log.Error(ex.Message, ex);
throw new Exception("Invalid PDF File: " + pdfFile.Name);
}
finally
{
if (reader != null)
{
reader.Close();
}
if (pdfDoc != null && !pdfDoc.IsClosed())
{
pdfDoc.Close();
}

try
{
if (testFile.Exists)
{
testFile.Delete();
}
}
catch (Exception ee)
{
Console.WriteLine(ee.Message);
}
}

最佳答案

看起来像一个 iText 错误。如果您追踪 PdfReader 构造函数调用的内容,您会看到它 creates a FileStream即有条件锁定。 FileStream 被包装在 RandomAccessSource 中,然后被包装在 GetOffsetTokeniser 中的 PdfTokenizer 中.如果 GetHeaderOffset 在第 1433 行抛出异常,则该 tok local 永远不会关闭。

关于c# - C# 中的 IText 7 锁定错误 pdf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67025126/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com