Страница: 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
, а для WMI такFor Each file In files 
If LCase(fso.GetExtensionName(file)) = "pdf" Then
MsgBox file End If
Next
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... PS для отображения штрихкода требуется шрифт...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
Ответить
       | 
  
	  
    
      | Номер ответа: 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 | 
 
		
			Поиск по форуму