Конвертирование PDF

Автоматическое помещение данных из буфера обмена в новый документ Word. Документы в формате PDF не столь изящны, как кажутся. Если они имеют тэги, то не имеют никаких параграфов, таблиц или столбцов. Проблема возникает при создании нового документа с использованием материала старого. В идеальном случае вы использовали бы исходный файл старого документа или, возможно, его HTML-версию. Однако это не всегда реально. Иногда для работы есть только PDF-документ.

Сохранить как… DOC, RTF, HTML

Adobe Acrobat 6 предоставляет возможность конвертировать PDF-документ в различные форматы с помощью диалогового окна Save As… (Сохранить как…). Эти фильтры работают лучше всего, когда PDF-документ содержит тэги. Попробуйте, чтобы увидеть, соответствует ли это вашим потребностям. Adobe Reader позволяет выполнить конвертирование PDF-документа в текст с помощью команды File\Save As Text (Файл\Сохранить как текст).

Если PDF-документ не имеет тэгов, Adobe Acrobat использует логический механизм, чтобы собирать символы в слова, а слова в параграфы. Он пробует обнаруживать и создавать таблицы. Лучше всего он работает на документах без форматирования. Таблицы и отформатированные страницы, как правило, не сохраняются.

Взаимодействие с человеком

Полностью автоматическое преобразование формата PDF в структурированный формат типа .doc для Word невозможно, т. к. это очень большая задача. Один из подходов — разбить задачу на части, чтобы появилась возможность частичной автоматизации. Инструмент TAPS работает хорошо, потому что использует полуавтоматизацию — вы указываете ему, где находится таблица, и он создает ее из имеющихся данных. Этот подход может масштабироваться для преобразования полных документов.

Загрузка буфера обмена в новый документ с помощью AutoPasteLoop

Опция Copy\Paste (Копировать\Вставить) прекрасно работает для фрагментов текста, но ее использование усложняется при обработке нескольких страниц данных. AutoPasteLoop (Цикл автоматической вставки) — это макрокоманда программы Word, которая проверяет буфер обмена на наличие новых данных, а затем вставляет их в новый документ. Вместо нескольких операций копирования/вставки вы можете только копировать. Программа Word автоматически выполняет вставку.

Скотт Тапай перенес AutoPasteLoop в программу OpenOffice. Загрузите код с сайта http://www.pdfhacks.com/autopaste/.

Создайте новую макрокоманду Word под названием AutoPasteLoop в Normal.dot и запрограммируйте ее подобно следующему фрагменту:

‘AutoPasteLoop, версия 1.0
‘Посетите: http://www.pdfhacks.com/autopaste/
‘Запустите AutoPasteLoop из MS Word и переключитесь в Adobe Reader или
‘Acrobat.Скопируйте материал, который вам нужен, и AutoPasteLoop будет
‘автоматически вставлять его в целевой документ Word. По окончании
‘работы переключитесь в MS Word — AutoPasteLoop остановится.

Option Explicit

‘объявление Win32-функций API, которые нам нужны

Declare Function Sleep Lib «kernel32″ (ByVal insdf As Long) As Long
Declare Function GetForegroundWindow Lib «user32″ () As Long
Declare Function GetOpenClipboardWindow Lib «user32″ () As Long
Declare Function GetCUpboardOwner Lib «user32″ () As Long

Sub AutoPasteLoop()

‘HWND приложения вставляем в (MS Word)
Dim AppHwnd As Long

‘предполагаем, что мы выполняем это из целевого приложения.
AppHwnd = GetForegroundWindow()

‘следим, переключается ли пользователь
‘из целевого приложения (MS Word).
Dim SwitchedApp As Boolean SwitchedApp = False

‘останавливаем выполнение цикла
Dim KeepLooping As Boolean KeepLooping = True

‘HWND нашего целевого документа; GetCUpboardOwner возвращает
‘HWND из приложения, которое последний раз использовало буфер обмена;
‘изменение содержимого буфера обмена (Cut) делает нас «владельцем».
‘обратите внимание, что «владение» буфером обмена не подразумевает
‘его блокировки
Dim DocHwnd As Long Selection.TypeText Text:=»abc»
Selection.MoveLeft Unit:=wdCharacter, Count:=3, Extend: =wdExtend Selection.Cut
DocHwnd = GetClipboardOwner() Do While KeepLooping
Sleep 200 ‘milliseconds; 100 msec == 1/10 sec

‘если пользователь переключается из целевого
‘приложения, а затем обратно, цикл останавливается

Dim ActiveHwnd As Long
ActiveHwnd = GetForegroundWindow()
If ActiveHwnd = AppHwnd Then
If SwitchedApp Then KeepLooping = False
Else
SwitchedApp = True
End If

‘если владелец буфера обмена изменился, значит кто-то еще
‘поместил что-то в него; если ресурс буфера обмена не
‘заблокирован (GetOpenClipboardwindow), то поместить его содержимое
‘в наш документ; использовать команду Сору для изменения владельца
‘на DocHwnd

If CetClipboardOwner() <> DocHwnd And
GetOpenClipboardWindow() = 0 Then
Selection.Paste
Selection.MoveLeft Unit:=wdCharacter, Count: =1, Extend: =wdExtend
Selection.Copy
Selection. Collapse wdCollapseEnd
End If
Loop
End Sub

Выполнение AutoPasteLoop

Создайте новый документ Word. Командой меню Tools\Macros\Macros (Сервис\Макрос\Макросы) откройте диалоговое окно Macros. Выберите имя макрокоманды AutoPasteLoop и щелкните на кнопке Run (Выполнить). Во время выполнения цикла Word недоступен. Остановите цикл, переключаясь к другому приложению, а затем вернитесь в Word.

Запустите цикл. Переключитесь в Adobe Acrobat (или Adobe Reader) и используйте его команды, чтобы выбрать и скопировать необходимые столбцы, таблицы, параграфы и изображения. Переключитесь снова в Word — все скопированное должно быть вставлено в новый документ. Запустите AutoPasteLoop для продолжения копирования документа.

Хакинг AutoPasteLoop

Добавьте фильтры содержимого или собственную логику к макрокоманде AutoPasteLoop. Используйте знание входных документов, чтобы с помощью цикла создавать документы, требующие минимальной дальнейшей обработки.

Макрокоманда AutoPasteLoop работает не только с документами в формате PDF, но и с любой программой, которая может копировать контент в буфер обмена.