Наткнулся на интересный баг/фичу: если в имени PDF-файла есть запятая, то пересохранение (
JSO.SaveAs) может выдать (а может и не выдать) ошибку 1001 (см. скрин)
Для себя решил менять её на символ 130, визуально идеинтичный обычной запятой (символ 44).
Причём если код выдаёт ошибку, то при ручном пересохранении Acrobat предупреждает, что исходный файл будет заменён. Если согласиться, то будет файл "
имя_файлаPDF.pdf.xlsx" и, разумеется, ничего заменено не будет - фигня какая-то
Улучшенный код |
---|
Код |
---|
Function PRDX_PDF_SaveAs(ByVal PDFPath$, ByVal FileExtension$, Optional AppClose As Boolean) As Boolean
Dim acroPDDoc As Object, JSO As Object, ExportFormat$, flag As Boolean
Static acroApp As Object, acroAVDoc As Object
If acroApp Is Nothing Then
Set acroApp = CreateObject("AcroExch.App")
Set acroAVDoc = CreateObject("AcroExch.AVDoc")
End If
flag = acroAVDoc.Open(PDFPath, "")
Set acroPDDoc = acroAVDoc.GetPDDoc
Set JSO = acroPDDoc.GetJSObject
Select Case FileExtension
Case "eps": ExportFormat = "com.adobe.acrobat.eps"
Case "html", "htm": ExportFormat = "com.adobe.acrobat.html"
Case "jpeg", "jpg", "jpe": ExportFormat = "com.adobe.acrobat.jpeg"
Case "jpf", "jpx", "jp2", "j2k", "j2c", "jpc": ExportFormat = "com.adobe.acrobat.jp2k"
Case "docx": ExportFormat = "com.adobe.acrobat.docx"
Case "doc": ExportFormat = "com.adobe.acrobat.doc"
Case "png": ExportFormat = "com.adobe.acrobat.png"
Case "ps": ExportFormat = "com.adobe.acrobat.ps"
Case "rft": ExportFormat = "com.adobe.acrobat.rft"
Case "xlsx": ExportFormat = "com.adobe.acrobat.xlsx"
Case "txt": ExportFormat = "com.adobe.acrobat.accesstext"
Case "tiff", "tif": ExportFormat = "com.adobe.acrobat.tiff"
Case "xml": ExportFormat = "com.adobe.acrobat.xml-1-00"
Case Else: MsgBox "Расширение «" & FileExtension & "» — НЕ РАСПОЗНАНО!", vbCritical, "ОШИБКА РАСШИРЕНИЯ": AppClose = True: GoTo ex
End Select
PDFPath = Replace$(Left$(PDFPath, Len(PDFPath) - 4) & "_converted" & "." & FileExtension, ",", Chr(130))
flag = JSO.SaveAs(PDFPath, ExportFormat)
PRDX_PDF_SaveAs = True
ex: acroAVDoc.Close (True): If Not AppClose Then Exit Function
acroApp.Exit
Set acroPDDoc = Nothing
Set acroAVDoc = Nothing
Set acroApp = Nothing
End Function |
|