irabel,
оно, большое Вам спасибо!
Жаль, что получилось подключиться только через power shell, а наша безопасность против такого подхода...(
Пробовал через WEB API, но даже не успев закончить мне подсветили на конф данных...(
Скрытый текст |
|---|
| Код |
|---|
Sub ConvertAndMergeUniversal()
Dim ws As Worksheet, fso As Object, shell As Object
Dim docToolPath As String, tempFolder As String
Dim pdfFiles As Collection, fileList As String
Dim i As Long, filePath As String, ext As String
Dim outputPdf As String, args As String
Set ws = ThisWorkbook.ActiveSheet
Set fso = CreateObject("Scripting.FileSystemObject")
Set shell = CreateObject("WScript.Shell")
Set pdfFiles = New Collection
' --- 1. Находим DocTool ---
docToolPath = FindDocToolPath()
If docToolPath = "" Then
MsgBox "pdf24-DocTool.exe не найден!", vbCritical
Exit Sub
End If
' --- 2. Создаем временную папку ---
tempFolder = Environ("TEMP") & "\PDF24_Process_" & Format(Now, "yyyymmddhhnnss")
If Not fso.FolderExists(tempFolder) Then fso.CreateFolder tempFolder
' --- 3. Обработка ВСЕХ файлов одинаково (фикс для PDF) ---
For i = 1 To 5
filePath = Trim(ws.Cells(i, 1).Value)
If filePath = "" Then Exit For
If Not fso.FileExists(filePath) Then
MsgBox "Файл не найден: " & filePath, vbExclamation
GoTo Cleanup
End If
ext = LCase(fso.GetExtensionName(filePath))
outputPdf = tempFolder & "\file_" & i & ".pdf"
' ===== ФИКС: Для ВСЕХ файлов используем convertToPDF =====
' Даже для PDF - конвертируем "PDF в PDF" через профиль
If ext = "pdf" Then
' Специальная обработка для PDF
args = "-convertToPDF -profile default/low -outputFile """ & outputPdf & """ """ & filePath & """"
ElseIf ext = "png" Or ext = "jpg" Or ext = "jpeg" Then
' Обычная конвертация изображений
args = "-convertToPDF -profile default/low -outputFile """ & outputPdf & """ """ & filePath & """"
Else
MsgBox "Неподдерживаемый формат: " & ext, vbExclamation
GoTo Cleanup
End If
' Запускаем конвертацию С ВИДИМЫМ ОКНОМ (чтобы видеть ошибки)
Debug.Print "Запуск: " & args
Dim result As Long
result = shell.Run("""" & docToolPath & """ " & args, 1, True)
' Ждем 3 секунды
Application.Wait Now + TimeValue("00:00:03")
' Проверяем результат
If fso.FileExists(outputPdf) Then
pdfFiles.Add outputPdf
Debug.Print "Успех: " & filePath
Else
' Пробуем альтернативный метод
Debug.Print "Повторная попытка для: " & filePath
Call ProcessFileAlternative(filePath, outputPdf, docToolPath, ext)
If fso.FileExists(outputPdf) Then
pdfFiles.Add outputPdf
Else
MsgBox "Ошибка обработки: " & filePath, vbExclamation
GoTo Cleanup
End If
End If
Next i
' --- 4. Объединение (упрощенное) ---
If pdfFiles.Count > 0 Then
Dim finalPdf As String
finalPdf = Environ("USERPROFILE") & "\Desktop\Объединенный_" & Format(Now, "yyyymmdd_hhnnss") & ".pdf"
' Формируем команду
args = "-join -noProgress -bookmarks clear -profile default/low -outputFile """ & finalPdf & """"
For i = 1 To pdfFiles.Count
args = args & " """ & pdfFiles(i) & """"
Next i
Debug.Print "Объединение: " & args
' Запускаем объединение
shell.Run """" & docToolPath & """ " & args, 1, True
' Длинное ожидание
Application.Wait Now + TimeValue("00:00:10")
' Проверка результата
If fso.FileExists(finalPdf) And fso.GetFile(finalPdf).Size > 1024 Then
MsgBox "Готово! Файлов: " & pdfFiles.Count & vbCrLf & "Путь: " & finalPdf, vbInformation
Else
MsgBox "Ошибка: файл не создан или слишком мал", vbCritical
Debug.Print "Размер файла: " & IIf(fso.FileExists(finalPdf), fso.GetFile(finalPdf).Size, 0)
End If
End If
Cleanup:
' Очистка позже
End Sub
' ===== АЛЬТЕРНАТИВНЫЙ МЕТОД ДЛЯ ПРОБЛЕМНЫХ ФАЙЛОВ =====
Sub ProcessFileAlternative(filePath As String, outputPdf As String, docToolPath As String, ext As String)
Dim fso As Object, shell As Object, args As String
Set fso = CreateObject("Scripting.FileSystemObject")
Set shell = CreateObject("WScript.Shell")
' Метод A: Попробуем без профиля
If ext = "pdf" Then
args = "-applyProfile -profile default/low -outputFile """ & outputPdf & """ """ & filePath & """"
Else
args = "-convertToPDF -outputFile """ & outputPdf & """ """ & filePath & """"
End If
shell.Run """" & docToolPath & """ " & args, 0, True
Application.Wait Now + TimeValue("00:00:03")
' Метод B: Если не сработало, попробуем через Toolbox
If Not fso.FileExists(outputPdf) Then
Dim toolboxPath As String
toolboxPath = Replace(docToolPath, "DocTool", "Toolbox")
If fso.FileExists(toolboxPath) Then
If ext = "pdf" Then
' Для PDF: просто копируем
fso.CopyFile filePath, outputPdf
Else
' Для изображений: конвертируем
args = "-verb convertToPdf -processJob """ & filePath & """ """ & outputPdf & """"
shell.Run """" & toolboxPath & """ " & args, 0, True
End If
End If
End If
End Sub
Function FindDocToolPath() As String
' ... (предыдущая реализация) ...
Dim fso As Object, paths(4) As String
' ... код поиска ...
FindDocToolPath = "C:\Program Files\PDF24\pdf24-DocTool.exe" ' для примера
End Function
|
|
Ищу теперь другие варианты