Слово: замініть автоматичні розриви ліній на повернення каретки


0

У мене досить незвичайна проблема. У мене є файл 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?

Знімок екрана з описом проблеми

Посилання на документ docx

Дякую!

Петро


Ви можете включити кілька скріншотів
барлоп

також я знайшов хороший спосіб задати ваше питання - створити кілька стислих прикладних файлів, що демонструють проблему, і тоді хто-небудь, хто намагається відповісти, може спробувати вирішити проблему для цих файлів. Отже, це із скріншотами і чітко показаним, що ви хочете, і що ви отримуєте. Ваше запитання не виглядає погано, але це спричинило б краще запитання та ще одну ймовірність отримати відповідь.
барлоп

Скріншоти додані! Дякую!
ст.

більшість людей не такі знайомі з тим незвичним варіантом, який ви використовуєте в слові, щоб показати повернення вагона, пробіли та вкладки. І хоча у вас є вкладки, не зовсім зрозуміло, що ці вкладки дають вам стовпці, оскільки я не бачу чітких стовпців даних в жодній із ваших фотографій, ймовірно, тому що, як ви кажете, стовпці заплуталися. Чи можете ви посилання на приклад PDF? наприклад, завантажуйте в ge.tt, тоді кожен може завантажити ваш файл (не обов'язково з хромом), але, наприклад, з firefox.
барлоп

Насправді вкладки дають мені потрібні стовпці, але якщо я застряг тут, я міг би легко перетворити їх у пробіли, щоб зберегти формат стовпців. Однак я не можу надати PDF-файл, оскільки в ньому відображається конфіденційна інформація, і я не в змозі анонімізувати текст, як це було зроблено в інших прикладах.
Арт

Відповіді:


0

У 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

0

Thx 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.