我遇到了一个相当不寻常的问题。我有一个 MS Word 文件(由 Adobe Acrobat 创建,原件是 PDF)包含多个文本框。需要解析这些文本框的内容,以便我可以将其导入数据库。PDF 文档中的文本被格式化为 2 列。不幸的是,Adobe Acrobat 中的文件转换不会在每一行后插入回车符。因此,当将 DOCX 保存为文本文件时,文本会变得混乱。Word 中的文件转换,即“添加行尾”选项,不适用于文本框或文本框。将所有文本框转换为段落文本也会弄乱文本。在我看来,解决这个问题的最佳方法是使用 vba 宏,它可以识别文档中任何文本框中的每个自动行尾并插入回车符。但是,我尝试使用预定义书签“\line”来执行此操作,但这似乎在文本框中也不起作用。我一直收到错误“对象已被删除”,如果只选择了段落文本(而不是在文本框中),则不会出现此错误。
Sub ChangeAutoLineBreaks()
Dim r As Word.Range
Set r = Selection.Range
Selection.Collapse direction:=wdCollapseStart
Do Until Selection.End > r.End
Selection.Bookmarks("\Line").Select
If Right(Selection, 1) = " " Then
Selection.SetRange Selection.End - 1, Selection.End
Selection.Delete
Selection.Text = vbCr
Selection.Bookmarks("\Line").Select
Selection.Collapse direction:=wdCollapseStart
End If
Selection.MoveDown wdLine, 1, False
Loop
' reselect our original selection
r.Select
Set r = Nothing
End Sub
我尝试过其他文件迁移工具(pdf>docx 或 pdf>txt),但如果使用 MS Word 作为旁路进行文件转换,我会得到最好的结果。
有人能给我一些建议,让我可以在 Word 中使用它吗?
谢谢!
彼得
答案1
Word 没有用于标记段落内行尾的对象,因此这确实是一项棘手的任务。
作为一种解决方法,您可以:
- 将选择内容放在每个段落的开头
- 移动一行(如按向下箭头)
- 向后移动一个字符并检查是否为段落分隔符
- 如果没有,则添加
下面的代码示例对一个段落执行此过程,只需要循环遍历文本框中的所有段落(我已经测试过,它也适用于文本框)。
Selection.Paragraphs(1).Range.Select
Selection.Collapse wdCollapseStart
Selection.MoveDown wdLine, 1
Selection.MoveLeft wdCharacter, 1, True
If Asc(Selection.Text) <> 13 Then
Selection.InsertAfter Chr(13)
End If
答案2
谢谢 Máté,它没有提供解决方案,但帮助我找到了正确的方向。实际上,由于它很棘手,因此它只是对手动执行任务时选择行为的简单分析。您的解决方案假设段落中只有一个自动行结束,但有些段落使用了超过 2 行。这就是我解决问题的方法。
Dim aShape As Shape
Dim aParagraph As Paragraph
On Error Resume Next
Application.ScreenUpdating = False
For Each aShape In ActiveDocument.Shapes
If aShape.Type = msoTextBox Then
For Each aParagraph In aShape.TextFrame.TextRange.Paragraphs
aParagraph.Range.Select
Selection.Collapse direction:=wdCollapseStart
Selection.HomeKey Unit:=wdLine
Selection.EndKey Unit:=wdLine
Do Until Asc(Selection.Text) = 13
Selection.InsertAfter vbCrLf
Selection.MoveDown wdLine, 1
Selection.EndKey Unit:=wdLine
Loop
Next
End If
Next aShape
Application.ScreenUpdating = True