Страница: 1 | 2 |
|
Вопрос: скрипт обработка файлов на VBS
|
Добавлено: 20.01.10 15:17
|
|
Автор вопроса: Alexander
|
Всем добрый день,
нужна помощь в написании скрипта по обработке *.pdf файлов
Исходные данные:
Есть папка в ней кучка pdf файлы, имена разные, количество файлов может меняться. На документах находящихся в pdf файлах есть штрих код, код из разных файлов может совпадать, вытаскиваю его таким образом
set wshShell = CreateObject("WScript.Shell")
oldFileName = WScript.Arguments(0)
set oExec = wshShell.Exec("С:\\scan\\Reader.exe " & oldFileName)
barCode = oExec.StdOut.ReadAll
Dim FSO
Set FSO = WScript.CreateObject("Scripting.FileSystemObject")
newFileName = "С:\\scan\\out\\" & barcode & ".pdf"
set filesys=CreateObject("Scripting.FileSystemObject")
If filesys.FileExists(oldFileName) Then
filesys.CopyFile oldFileName, newFileName
End if
Вот задача , применить данный скрипт ко всем файлам *.pdf из нужной папки, при этом при совпадении кода , файл не перезаписывался , а создавался новый с каким либо похожим именем. Затем необходимо склеить те самые файлы в которых код совпадал, в один файл и в качестве имени файла тот самый код.PDF , затем положить его в определенную папку.
Для склейки есть программа, запускал ее с ниже приведенными параметрами из батника, где сначала склеиваются файлы , а затем востанавливаются связи (иначе код вытащить не удавалось повторно)
С:\scan\pdftk.exe С:\scan\temp\*.pdf cat output С:\scan\temp\tmp\combined.pdf
С:\scan\pdftk.exe С:\scan\temp\tmp\combined.pdf output С:\scan\temp\combined.pdf
Помогите в написании скрипта или укажите верный путь, сразу оговорюсь в написании скриптов не силен, брал все по шаблонам, далее сделать не получается. Добился только склейки разных файлов и вытаскивание кодов.
Ответить
|
Номер ответа: 2 Автор ответа: Alexander
Вопросов: 2 Ответов: 11
|
Профиль | | #2
|
Добавлено: 21.01.10 10:13
|
Есть у меня скрипт , как применить его по очереди на каждом файле находящемся в папке, имена файлов разные , одинаковое только расширение? На сколько понимаю должен быть цикл применения скрипта для файлов.
Ответить
|
Номер ответа: 4 Автор ответа: Alexander
Вопросов: 2 Ответов: 11
|
Профиль | | #4
|
Добавлено: 22.01.10 15:44
|
Смысл задачи вытащить из файлов pdf штрихкод, изменить имя файла на информацию из штрихкода, при совпадении в разных файлах штрихкода объединить их в один. К примеру бухгалтерские документы сканируются потоком, что бы в ручную и каждый не перименовывать и не сортировать. А то программы стоят бешеных денег по оработке pdf файлов. У меня получилось сейчас вот что:
set wshShell = CreateObject("WScript.Shell"
oldFileName = WScript.Arguments(0)
set oExec = wshShell.Exec("E:\\scan\\Reader.exe " & oldFileName)
barCode = oExec.StdOut.ReadAll
MsgBox barcode
Dim FSO
Set FSO = WScript.CreateObject("Scripting.FileSystemObject"
newFileName = "E:\\scan\\out\\" & barcode & ".pdf"
If FSO.FileExists(newFileName) Then
newFileName = "E:\\scan\\temp\\" & barcode & ".pdf"
set filesys=CreateObject("Scripting.FileSystemObject"
If filesys.FileExists(oldFileName) Then
filesys.CopyFile oldFileName, newFileName
End if
oldoldFileName = "E:\\scan\\out\\" & barcode & ".pdf"
barcode = 1
NewFileName = "E:\\scan\\temp\\" & barcode & ".pdf"
set filesys=CreateObject("Scripting.FileSystemObject"
If filesys.FileExists(oldoldFileName) Then
filesys.CopyFile oldoldFileName, newFileName
End If
Dim objWshShell
Dim intErrorLevel
Dim combinedFile
Dim EndFile
Set objWshShell = WScript.CreateObject("WScript.Shell"
intErrorLevel = objWshShell.Run("E:\scan\pdftk.exe E:\scan\temp\*.pdf cat output E:\scan\temp\tmp\combined.pdf", 1, True)
combinedFile = objWshShell.Run("E:\scan\pdftk.exe E:\scan\temp\tmp\combined.pdf output E:\scan\temp\combined.pdf", 1, True)
endFile = objWshShell.Run("E:\scan\end_file.bat", 1, True)
Set objWshShell = Nothing
WScript.Quit 0
Else
newFileName = "E:\\scan\\out\\" & barcode & ".pdf"
set filesys=CreateObject("Scripting.FileSystemObject"
If filesys.FileExists(oldFileName) Then
filesys.CopyFile oldFileName, newFileName
End if
End If
Содержимое E:\scan\end_file.bat не получилось вписать непосредственно в скрипт эти строки вынес их в батник.
E:\scan\end_file.vbs E:\scan\temp\combined.pdf
del /f /q E:\scan\temp\tmp\combined.pdf
del /f /q E:\scan\temp\*.pdf
Содержимое E:\scan\end_file.vbs
set wshShell = CreateObject("WScript.Shell"
oldFileName = WScript.Arguments(0)
set oExec = wshShell.Exec("E:\\scan\\Reader.exe " & oldFileName)
barCode = oExec.StdOut.ReadAll
Dim FSO 'Объявляем переменные
Set FSO = WScript.CreateObject("Scripting.FileSystemObject"
newFileName = "E:\\scan\\out\\" & barcode & ".pdf"
set filesys=CreateObject("Scripting.FileSystemObject"
If filesys.FileExists(oldFileName) Then
filesys.CopyFile oldFileName, newFileName
End if
Так вот теперь пытаюсь сделать так , что бы автоматически данный скрипт применялся ко всем файлам pdf из определенной папке и сделать все в одном скрипте без всяких батников.
проги Reader и pdftk, первая вытаскивает штриход из pdf и распознает его (Спасибо коллеге помог написать, остальное сам пытаюсь состряпать), вторая позволяет совершать манипуляции с pdf файлами без установки весомых программ Если интересно http://www.accesspdf.com/pdftk/#vim_plugin .
Ответить
|
Номер ответа: 5 Автор ответа: Alexander
Вопросов: 2 Ответов: 11
|
Профиль | | #5
|
Добавлено: 22.01.10 16:47
|
Если запукаю тупо батником перебирая все известные имена то все работает, Help не удается данный скрипт запустить в цикл ( ? Нужно чтобы действий выполнялось по такому сценарию в батнике пишу такую строчку E:\scan\Newstart.vbs E:\scan\in\*.pdf в качестве звездочки имя файла и так далее.
Ответить
|
Номер ответа: 6 Автор ответа: Alexander
Вопросов: 2 Ответов: 11
|
Профиль | | #6
|
Добавлено: 22.01.10 20:59
|
спасибо за помощ все получилось,, с циклами просто немного попутал параметры. ура все работает ))) огромное спасибо AxeL.
Ответить
|
Номер ответа: 7 Автор ответа: Alexander
Вопросов: 2 Ответов: 11
|
Профиль | | #7
|
Добавлено: 22.01.10 21:34
|
вопрос подскажите как сделать так что бы при чтении папки он перебирал файлы только pdf а остальные игнорировал
Ответить
|
Номер ответа: 8 Автор ответа: AxeL
ICQ: 264730390
Вопросов: 2 Ответов: 106
|
Профиль | | #8
|
Добавлено: 23.01.10 02:38
|
вопрос подскажите как сделать так что бы при чтении папки он перебирал файлы только pdf а остальные игнорировал для FSO - For Each file In files
- MsgBox file
- Next
делаешь так - For Each file In files
- If LCase(fso.GetExtensionName(file)) = "pdf" Then
- MsgBox file
- End If
- Next
, а для WMI так - For Each file In oSelQ
- If LCase(file.Extension) = "pdf" Then
- MsgBox file.Name
- End If
- Next
PS Смысл задачи вытащить из файлов pdf штрихкод, изменить имя файла на информацию из штрихкода, при совпадении в разных файлах штрихкода объединить их в один.
Масло масляное. Здесь ты говоришь все то же самое, что и в самом начале. Если Два Разных документа содержат Один и тот же штрихкод, то зачем их объединять? Для галочки (что такие документы существовали)? Так для этого можно просто лог вести... Или чтобы потом напечатать все скопом? ИМХО есть более простые способы... первая вытаскивает штриход из pdf и распознает его сам подобной фигней маялся. Имеется скрипт по кодированию/декодированию штрихкода.
Ответить
|
Номер ответа: 9 Автор ответа: Alexander
Вопросов: 2 Ответов: 11
|
Профиль | | #9
|
Добавлено: 23.01.10 11:41
|
дело в том что эв штрихкоде только номер документа, а страниц может быть нескколько вот и объединяю. Имеется скрипт по кодированию/декодированию штрихкода? Можно глянуть?
Ответить
|
Номер ответа: 10 Автор ответа: AxeL
ICQ: 264730390
Вопросов: 2 Ответов: 106
|
Профиль | | #10
|
Добавлено: 25.01.10 02:43
|
Скрипт на VBA. При изменении ячейки А1(barcode), проверяется корректность штрихкода, после чего штрихкод выводится в А3. Единственная трабла - Excel неправилно выводит штрихкода начинающиеся на 4... - Sub proverka()
-
- bc = Range("barcod").Value
-
- a = CInt(Mid(bc, 1, 1)) + CInt(Mid(bc, 3, 1)) + CInt(Mid(bc, 5, 1)) + CInt(Mid(bc, 7, 1)) + CInt(Mid(bc, 9, 1)) + CInt(Mid(bc, 11, 1))
-
- b = CInt(Mid(bc, 2, 1)) + CInt(Mid(bc, 4, 1)) + CInt(Mid(bc, 6, 1)) + CInt(Mid(bc, 8, 1)) + CInt(Mid(bc, 10, 1)) + CInt(Mid(bc, 12, 1))
- b = b * 3
- a = a + b
- b = (a \ 10) * 10
- c = a - b
- If c > 0 Then c = 10 - c
- a = CInt(Mid(bc, 13, 1))
- If c = a Then
- Range("bcod").Value = numToEAN13char(bc)
- Else
- MsgBox "Введенный штрихкод неверен."
- End If
- End Sub
-
- Public Function numToEAN13char(ByVal kod)
-
- firstF = Val(Mid(kod, 1, 1))
- leftstr = Mid(kod, 2, 6)
- rightstr = Mid(kod, 8, 6)
-
- rightK = ""
- For i = 1 To 6
- rightK = rightK + NumberToLowerChar(Mid(rightstr, i, 1))
- Next
-
-
- If firstF = 0 Then
- leftK = "#!" + Left(leftstr, 1) + Mid(leftstr, 2, 1) + Mid(leftstr, 3, 1) + Mid(leftstr, 4, 1) + Mid(leftstr, 5, 1) + Mid(leftstr, 6, 1)
- ElseIf firstF = 1 Then
- leftK = "$!" + Left(leftstr, 1) + Mid(leftstr, 2, 1) + NumberToUpperChar(Mid(leftstr, 3, 1)) + Mid(leftstr, 4, 1) + NumberToUpperChar(Mid(leftstr, 5, 1)) + NumberToUpperChar(Mid(leftstr, 6, 1))
- ElseIf firstF = 2 Then
- leftK = "%!" + Left(leftstr, 1) + Mid(leftstr, 2, 1) + NumberToUpperChar(Mid(leftstr, 3, 1)) + NumberToUpperChar(Mid(leftstr, 4, 1)) + Mid(leftstr, 5, 1) + NumberToUpperChar(Mid(leftstr, 6, 1))
- ElseIf firstF = 3 Then
- leftK = "&!" + Left(leftstr, 1) + Mid(leftstr, 2, 1) + NumberToUpperChar(Mid(leftstr, 3, 1)) + NumberToUpperChar(Mid(leftstr, 4, 1)) + NumberToUpperChar(Mid(leftstr, 5, 1)) + Mid(leftstr, 6, 1)
- ElseIf firstF = 4 Then
- leftK = "'!" + Left(leftstr, 1) + NumberToUpperChar(Mid(leftstr, 2, 1)) + Mid(leftstr, 3, 1) + Mid(leftstr, 4, 1) + NumberToUpperChar(Mid(leftstr, 5, 1)) + NumberToUpperChar(Mid(leftstr, 6, 1))
- ElseIf firstF = 5 Then
- leftK = "(!" + Left(leftstr, 1) + NumberToUpperChar(Mid(leftstr, 2, 1)) + NumberToUpperChar(Mid(leftstr, 3, 1)) + Mid(leftstr, 4, 1) + Mid(leftstr, 5, 1) + NumberToUpperChar(Mid(leftstr, 6, 1))
- ElseIf firstF = 6 Then
- leftK = ")!" + Left(leftstr, 1) + NumberToUpperChar(Mid(leftstr, 2, 1)) + NumberToUpperChar(Mid(leftstr, 3, 1)) + NumberToUpperChar(Mid(leftstr, 4, 1)) + Mid(leftstr, 5, 1) + Mid(leftstr, 6, 1)
- ElseIf firstF = 7 Then
- leftK = "*!" + Left(leftstr, 1) + NumberToUpperChar(Mid(leftstr, 2, 1)) + Mid(leftstr, 3, 1) + NumberToUpperChar(Mid(leftstr, 4, 1)) + Mid(leftstr, 5, 1) + NumberToUpperChar(Mid(leftstr, 6, 1))
- ElseIf firstF = 8 Then
- leftK = "+!" + Left(leftstr, 1) + NumberToUpperChar(Mid(leftstr, 2, 1)) + Mid(leftstr, 3, 1) + NumberToUpperChar(Mid(leftstr, 4, 1)) + NumberToUpperChar(Mid(leftstr, 5, 1)) + Mid(leftstr, 6, 1)
- ElseIf firstF = 9 Then
- leftK = ",!" + Left(leftstr, 1) + NumberToUpperChar(Mid(leftstr, 2, 1)) + NumberToUpperChar(Mid(leftstr, 3, 1)) + Mid(leftstr, 4, 1) + NumberToUpperChar(Mid(leftstr, 5, 1)) + Mid(leftstr, 6, 1)
- End If
-
- numToEAN13char = leftK + "-" + rightK + "!"
- End Function
-
- Public Function NumberToUpperChar(Num)
- UpperCharSet = "ABCDEFGHIJ"
- Num = Val(Right(Num, 1))
- mstr = Mid(UpperCharSet, Num + 1, 1)
- NumberToUpperChar = mstr
- End Function
-
- Public Function NumberToLowerChar(Num)
- LowerCharSet = "abcdefghij"
- Num = Val(Right(Num, 1))
- mstr = Mid(LowerCharSet, Num + 1, 1)
- NumberToLowerChar = mstr
- End Function
-
- Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
- If Sh.Name = ThisWorkbook.Sheets(1).Name And Target.Address = "$A$2" Then
- Call proverka
- Range("A1").Select
- End If
- End Sub
PS для отображения штрихкода требуется шрифт...
Ответить
|
Номер ответа: 11 Автор ответа: Alexander
Вопросов: 2 Ответов: 11
|
Профиль | | #11
|
Добавлено: 25.01.10 14:15
|
пРи запуске скрипта ссылается на If LCase(fso.GetExtensionName(file)) = "pdf" Then - пишет необходимо окончание инструкции, что пропустил подскажите
Ответить
|
Номер ответа: 12 Автор ответа: Alexander
Вопросов: 2 Ответов: 11
|
Профиль | | #12
|
Добавлено: 25.01.10 14:52
|
AxeL спасибо за помощь еще раз все заработало
Ответить
|
Номер ответа: 13 Автор ответа: Alexander
Вопросов: 2 Ответов: 11
|
Профиль | | #13
|
Добавлено: 25.01.10 15:41
|
((( Опять косяк ((
В чем проблема пометил в скрипте ниже
Dim fso2, Files, file
Dim FSO, fso3, wshShell
Set fso2 = CreateObject("Scripting.FileSystemObject"
Set fso3 = CreateObject("Scripting.FileSystemObject"
Set Files = fso2.GetFolder("E:\scan\in".Files
set wshShell = CreateObject("WScript.Shell"
Set fso3 = CreateObject("Scripting.FileSystemObject"
For Each file In files
If LCase(fso3.GetExtensionName(file)) = "pdf" Then
msgbox file
set oExec = wshShell.Exec("E:\\scan\\BarcodeReader.exe " & File)
barCode = oExec.StdOut.ReadAll
Set FSO = WScript.CreateObject("Scripting.FileSystemObject"
newFileName = "E:\\scan\\out\\" & barcode & ".pdf"
If FSO.FileExists(newFileName) Then
newFileName = "E:\\scan\\temp\\" & barcode & ".pdf"
set filesys=CreateObject("Scripting.FileSystemObject"
If filesys.FileExists(File) Then
filesys.CopyFile File, newFileName
End if
oldoldFileName = "E:\\scan\\out\\" & barcode & ".pdf"
barcode = 1
NewFileName = "E:\\scan\\temp\\" & barcode & ".pdf"
set filesys=CreateObject("Scripting.FileSystemObject"
If filesys.FileExists(oldoldFileName) Then
filesys.CopyFile oldoldFileName, newFileName
end if
Dim objWshShell2
Dim intErrorLevel
Dim combinedFile
Dim EndFile
Set objWshShell = WScript.CreateObject("WScript.Shell"
intErrorLevel = objWshShell.Run("E:\scan\pdftk.exe E:\scan\temp\*.pdf cat output E:\scan\temp\tmp\combined.pdf", 1, True)
combinedFile = objWshShell.Run("E:\scan\pdftk.exe E:\scan\temp\tmp\combined.pdf output E:\scan\temp\combined.pdf", 1, True)
endFile = objWshShell.Run("E:\scan\end_file.bat", 1, True)
Set objWshShell = Nothing
WScript.Quit 0
После выше написанного процесс не переходит к обработке следующего файла из папки, ХЕЛП подскажите что дописать надо. Иначе процесс просто обрывается обработки.
Else
set oExec = wshShell.Exec("E:\\scan\\BarcodeReader.exe " & File)
barCode = oExec.StdOut.ReadAll
Set FSO = WScript.CreateObject("Scripting.FileSystemObject"
newFileName = "E:\\scan\\out\\" & barcode & ".pdf"
set filesys=CreateObject("Scripting.FileSystemObject"
If filesys.FileExists(File) Then
filesys.CopyFile File, newFileName
End if
End If
End if
next
Set file = Nothing
Set files = Nothing
Set fso = Nothing
Set fso2 = Nothing
Set fso3 = Nothing
Ответить
|
Номер ответа: 15 Автор ответа: AxeL
ICQ: 264730390
Вопросов: 2 Ответов: 106
|
Профиль | | #15
|
Добавлено: 26.01.10 02:41
|
После выше написанного процесс не переходит к обработке следующего файла из папки и не будет ХЕЛП подскажите что дописать надо он у тебя отсутствует как таковой. А в будущем для более простого и удобного написания кода могу посоветовать пару редакторов с подсветкой синтаксиса: Bred3, Notepad++.
Ответить
|
Страница: 1 | 2 |
Поиск по форуму