我正在使用pdf-tools中的第三方DLL来解析我的VB.NET应用程序中的PDF文件,并将提取的数据写入SQL localDB数据库。我给用户两个选项:选择一个PDF文件进行解析或指向一个文件夹,应用程序将循环遍历其中的所有PDF文件。两个选项都调用相同的过程doPDFFile(),如下所示。
问题是:如果我每次通过选择一个文件单独导入一些文件,程序运行正常。但是,如果我选择包含相同文件的文件夹,程序使用的内存将继续增长。在Windows任务管理器中,导入大约30个文件后,它可以达到1 GB。
我使用了来自redgate的ANTS内存分析器,它显示了一个名为" GraphicsState"当在文件夹中循环时,这是pdf-tools对象的一部分变得太大了。如果我逐个选择相同的文件,则不会发生这种情况。除了内存问题,解析一些文件后应用程序变得非常慢。我的问题是:为什么会这样?以及如何预防?用户应该能够将程序指向包含数百个PDF文件的文件夹,我该如何实现?
以下是代码的快照:
'When user selects one file
Private Sub OpenToolStripMenuItem_Click(...)
OpenFileDialog1.FileName.ToString
doPDFFile()
End Sub
'When user selects a folder
Private Sub LoopToolStripMenuItem_Click() Handles LoopToolStripMenuItem.Click
FolderBrowserDialog1.ShowDialog()
sPath = FolderBrowserDialog1.SelectedPath
For Each fileName As String In IO.Directory.GetFiles(...)
sPath = fileName
doPDFFile()
Next
End Sub
在doPDFFile()程序中,我正在执行以下操作,我使用pdf-tools中的文档对象,并将其通过byRef传递给另一个程序:
Public Sub doPDFFile()
Using document As New Pdftools.PdfExtract.Document
document.open(sPath)
findFirstPage(document) 'passing by reference
ParseFirstPage(document) 'passing by reference
'storing the parsed text in an array
'.......
do
'extracting the colors from the graphicsStateObject inside the document object:
Using objGraphicsState As Pdftools.PdfExtract.GraphicsState = content.GraphicsState
sColor = objGraphicsState.FillColorRGB
End Using
'save text and color in an array of objects
until endOfText
end using
end sub