2012-02-04 2 views
1

Основной сценарий заключается в том, что мне необходимо программно заполнять текстовые поля PDF-файлов, которые находятся на веб-сервере. Поля будут отображены и заполнены данными, содержащимися в CSV. PDF должен быть открыт в браузере (управление браузером или ie/ff/chrome/etc) и отредактирован на месте. Невозможно загрузить, заполнить и загрузить (он должен быть заполнен и отправлен с помощью кнопки отправки в нем, я попытался изменить путь отправки кнопок безрезультатно).Программно заполнять поля формы PDF в окне управления браузером

До сих пор я поместил элемент управления веб-браузера в форму и перешел на сайт, зарегистрировался и загрузил файл PDF. Как мне взаимодействовать с файлом PDF, открытым в элементе управления веб-браузером? Просматривая различные библиотеки PDF, они, по-видимому, в основном взаимодействуют с закрытым pdf-файлом, расположенным на жестком диске, вносят изменения и снова сохраняют его.

EDIT: Im очень открыт для альтернативных решений. Я не знаю, возможно ли это, но если это так - основанный на PDF javascript на моей машине, который я запускаю в форме? Я могу сделать это легко, если я загружу его, но, похоже, не могу найти способ использовать PDFJS, пока он открыт в веб-браузере.

ответ

1

Боюсь, вам нелегко делать то, что вы хотите сделать. Сначала вам нужно найти дескриптор окна PDF-ридера, встроенный в элемент управления WebBrowser. Вот пример кода о том, как сделать это:

Public Function GetPdfViewerHandle() As System.IntPtr 
    Dim tempHandle As System.IntPtr 
    '-------------------------------------- 
    ' get handle to pdf viewer 
    '-------------------------------------- 
    '-------------------------------------- 
    ' first check for the foxit reader 
    '-------------------------------------- 
    tempHandle = FindChildWindow(WebBrowser1.Handle, "AfxWnd42s", "Reader", 1, True) 
    If IntPtr.Zero.Equals(tempHandle) = True Then 
     '--------------------------------- 
     ' if not foxit, check for adobe 
     '--------------------------------- 
     tempHandle = FindChildWindow(WebBrowser1.Handle, "AVL_AVVIEW", "AVPageView", 1, True) 
    End If 

    Return tempHandle 

End Function 

Public Shared Function FindChildWindow(ByVal hParent As IntPtr, ByVal P_childClass As String, ByVal P_childTitle As String, ByVal P_count As Integer, ByVal p_recursive As Boolean) As IntPtr 
    Dim hChild As IntPtr 
    Dim className As String 
    Dim title As String 
    Dim cnt As Integer 
    Dim tempPtr As IntPtr 
    Dim Declare Function FindWindowExA Lib "user32.dll" (ByVal hWnd1 As IntPtr, ByVal hWnd2 As Int32, ByVal lpsz1 As String, ByVal lpsz2 As String) As IntPtr 

    cnt = 0 

    hChild = FindWindowExA(hParent, 0, Nothing, Nothing) 

    While hChild.ToInt32 > 0 

     If P_childClass Is Nothing Then 
      className = GetClassName(hChild) 
     Else 
      className = GetClassName(hChild) 
      If P_childClass.Length < className.Length Then 
       className = className.Substring(0, P_childClass.Length) 
      End If 
     End If 

     If P_childTitle Is Nothing Then 
      title = GetWindowText(hChild).Replace("&", "") 
     Else 
      title = GetWindowText(hChild).Replace("&", "") 

      If P_childTitle.Length < title.Length Then 
       title = title.Substring(0, P_childTitle.Length) 
      End If 
     End If 


     Debug.WriteLine("hwnd=" + Hex$(hChild.ToInt32) + ", className = " + className + ", title = " + title) 
     If (String.Compare(className, P_childClass, True) = 0 And String.Compare(title, P_childTitle, True) = 0) Or (P_childClass = Nothing And String.Compare(title, P_childTitle, True) = 0) Or (String.Compare(className, P_childClass, True) = 0 And P_childTitle = Nothing) Then 
      cnt += 1 
      If cnt >= P_count Then 
       Return hChild 
      End If 
     End If 

     If p_recursive = True Then 
      tempPtr = FindChildWindow(hChild, P_childClass, P_childTitle, 1, p_recursive) 
      If IntPtr.Zero.Equals(tempPtr) = False Then 
       Return tempPtr 
      End If 
     End If 

     hChild = FindWindowExA(hParent, hChild.ToInt32, Nothing, Nothing) 
    End While 

    Return Nothing 

    End Function 

После того, как у вас есть дескриптор окна, есть много различных методов для нахождения полей формы. Если вы знаете, порядок вещей, вы можете просто начать посылать клавиатурные команды для читателя PDF ручки или использовать Spy ++, чтобы найти ручки полой формы для ввода данных в них с помощью функции WIN32API SendMessageA:

 Public Declare Function SendMessageA Lib "user32.dll" (ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer 

        asciiChar = CByte(Asc(data.Substring(0, 1))) 
       rc = SendMessageA(hwnd, WM_CHAR, asciiChar, 0)  

Хорошей удачи.

+0

Я должен был добавить, что форма формы будет всегда одинаковой, и у меня уже есть название текстовых полей (спасибо iText #) – Cloud007

+0

Спасибо! Это именно то, что мне нужно. –

0

Если вам нужно отправить данные с помощью кнопки в PDF, просто проверьте отправленный трафик и посмотрите, что он отправляет, тогда вы можете реплицировать с помощью VB.NET, а также даже не придется загружать документ PDF.