Страница: 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 | 
 
		
			Поиск по форуму