VBA - 将PDF作为字符串读取 - 有时不能,但有时可以 - "运行时错误62"



您可以在文本编辑器中打开 PDF 以查看 PDF 的编写结构。

使用 VBA,我将 PDF 作为文本文件打开,然后提取文本并将其另存为 VBA 中的字符串变量。我想浏览此文本以找到特定元素;一条折线(称为 sTreamTrain(,并使用 InStr 函数获取折线的顶点。

当我向折线添加更多顶点时,我似乎无法提取 pdf 的文本字符串。我收到错误"运行时错误62",我不明白这是什么意思,或者PDF已经更改为现在有此错误。

附件(通过链接(是我可以阅读的PDF(文档15(和我无法阅读的PDF(文档16(。我已经在 excel 中签入,因此看到两个文件中都存在顶点。还有我的 VBA 脚本的副本作为记事本文档和我的 excel 文件(但在我的 excel 文件中很难找到 - 脚本是名为"CoordExtractor_TestBuild01((("的"模块 6"函数(

链接:https://drive.google.com/open?id=1zOhwnFWZZfy9bTAxKiQFSl7qiQLlYIJV

下面文本提取过程的代码片段以重现问题(给定使用适用的pdf(:

子CoordExtractor_TestBuild01((

'打开 PDF 并获取坐标

将文本文件暗为整数 将文件路径暗淡为字符串 将文件内容调暗为字符串

'文本文件的文件路径 FilePath = "C:\Users\KAllan\Documents\WorkingInformation\sTreamTrain\Document16 - Original.pdf">

'确定可供 FileOpen 函数使用的下一个文件编号 文本文件 = 免费文件

'在读取状态下打开文本文件 打开文件路径以输入为文本文件

'将文件内容存储在变量中 调温只要 温度 = LOF(文本文件(

文件内容 = 输入(LOF(文本文件(, 文本文件(

'丢失文本文件 关闭文本文件

结束子

我希望有人让我知道在这种情况下运行时错误 62 是什么,并提出任何工作流程以在未来解决它。另外,我想知道是否有某些字符不能存储为字符串?- 当我将顶点数增加到一定数量以上时,也许这些都包括在内。

此外,我更愿意保持 scrips 非常简单并且不使用外部库,因为我想在完成后共享脚本,以便其他人可以使用它,因此如果它在没有额外依赖项等的情况下工作,它会更简单,但是,欢迎任何和所有建议,因为这只是这个项目的前半部分。

谢谢。

根据 MSDN 文档,此错误是由包含以下内容的文件引起的

。文件或语法末尾的空格或额外返回符 不正确。

由于您的代码有时适用于名称和内容与不起作用的文档非常相似的文档,因此在这种情况下我们可以排除语法错误。

您可以通过将宏顶部的代码替换为下面的代码来清理文件内容,然后再对其进行进一步处理。有了这个,我可以从您的Document16.pdf中读取和提取信息:

Sub CoordExtractor_TestBuild01()

'Purpose to link together the extracting real PDF information and outputting the results onto a spreadsheet

'########################################################################################
'Opening the PDF and getting the coordinates
Dim n As Long
Dim TextFile As Integer
Dim FilePath As String
Dim FileContent As String
'File Path of Text File
FilePath = "C:TESTDocument16.pdf" ' change path
'Determine the next file number available for use by the FileOpen function
TextFile = FreeFile      
'Open the text file in a Read State
Open FilePath For Input As TextFile
Dim strTextLine As String
Dim vItem As Variant
Line Input #1, strTextLine
vItem = Split(strTextLine, Chr(10))
' clean file of garbage information line by line
For n = LBound(vItem) To UBound(vItem)
' insert appropriate conditions here - in this case if the string "<<" is present
If InStr(1, vItem(n), "<<") > 0 Then
If FileContent = vbNullString Then
FileContent = vItem(n)
Else
FileContent = FileContent & Chr(10) & vItem(n)
End If
End If
Next n
'Clost Text File
Close TextFile

' insert the rest of the code here