2014-09-07 3 views
0

Я использую этот код для экспорта pdf-файла из документа Word.Проверьте, открыт ли какой-либо файл PDF и закрыл его.

Перед экспортом Мне нужно сначала проверить, если файл с тем же именем уже открыт, и если он закрыт, тогда экспортируйте.

Я пробовал много вещей, но не повезло.

Dim adbApp As Acrobat.AcroApp 
Dim adbDoc As Acrobat.AcroAVDoc 
Dim adbPageView As Acrobat.AcroAVPageView 

Set adbApp = CreateObject("AcroExch.App") 
Set adbDoc = CreateObject("AcroExch.AVDoc") 

If adbDoc.Open("C:\Current Letter Preview.pdf", "") = True Then '==> If the file is not open, this line opens it 
    adbDoc.Close (1) '==> Then close it 

    If adbDoc Is Nothing Then '==> Doesn't understand that I want to check if any pdf files are open 
     adbApp.Exit 
    End If 

    Set adbApp = Nothing 
End If 

Dim wordApp As Word.Application 
Dim wordDoc As Word.Document 

If IsFileOpen("C:\TemporaryLetter.docx") Then 
    Set wordApp = GetObject(, "Word.Application") 
    wordApp.Documents("C:\TemporaryLetter.docx").Close '==> Is there something like that regarding acrobat IAC? 
Else 
    Set wordApp = CreateObject("Word.Application") 

    With wordApp 
     .Visible = True 
     .WindowState = 2 
    End With 
End If 

Set wordDoc = wordApp.Documents.Open("C:\TemporaryLetter.docx") 

wordDoc.ExportAsFixedFormat OutputFileName:="C:\Current Letter Preview.pdf", _ 
ExportFormat:=wdExportFormatPDF 

wordDoc.Close savechanges:=wdDoNotSaveChanges 

Set wordDoc = Nothing 

If wordDoc Is Nothing Then 
    wordApp.Quit 
End If 

Set wordApp = Nothing 

Call adbDoc.Open("C:\Current Letter Preview.pdf", "") 

adbDoc.BringToFront 

Set adbPageView = adbDoc.GetAVPageView() 

Call adbPageView.ZoomTo(0, 100) 

Set adbDoc = Nothing 
Set adbPageView = Nothing 
+0

Я отредактировал ваше название. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

ответ

4

Чтобы проверить, если файл открыт или нет, вы можете увидеть код, который я отправил HERE Так что использование будет

Sub Sample() 
    Dim Ret 

    '~~> Change this to the relevant file path and name 
    Ret = IsFileOpen("C:\Current Letter Preview.Pdf") 

    If Ret = True Then 
     MsgBox "File is open" 
    Else 
     MsgBox "File is Closed" 
    End If 
End Sub 

Function IsFileOpen(FileName As String) 
    Dim ff As Long, ErrNo As Long 

    On Error Resume Next 
    ff = FreeFile() 
    Open FileName For Input Lock Read As #ff 
    Close ff 
    ErrNo = Err 
    On Error GoTo 0 

    Select Case ErrNo 
    Case 0: IsFileOpen = False 
    Case 70: IsFileOpen = True 
    Case Else: Error ErrNo 
    End Select 
End Function 

и закрыть файл, вам придется использовать API-интерфейсы FindWindow и PostMessage

Я протестировал код с помощью Adobe Reader и, следовательно, в коде ниже, имя, которое я ищу, это "Current Letter Preview.pdf - Adobe Reader" Возможно, у вас другое имя. Пожалуйста, измените, если применимо.

Option Explicit 

Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" _ 
(ByVal Hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _ 
lParam As Any) As Long 

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ 
(ByVal lpClassname As String, ByVal lpWindowName As String) As Long 

Private Const WM_CLOSE = &H10 

Sub Sample() 
    Dim Hwnd As Long 

    '~~> Find the window of the pdf file 
    Hwnd = FindWindow(vbNullString, "Current Letter Preview.pdf - Adobe Reader") 

    If Hwnd Then 
     '~~> Close the file 
     PostMessage Hwnd, WM_CLOSE, 0, ByVal 0& 
    Else 
     MsgBox "Pdf File not found" 
    End If 
End Sub 
+0

+1 Отличный ответ, также потому, что он может быть использован для тестирования для многих типов файлов путем корректировки соответственно :) – CaptainABC

Смежные вопросы