Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - ASP и VBScript

Страница: 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


Помогите в написании скрипта или укажите верный путь, сразу оговорюсь в написании скриптов не силен, брал все по шаблонам, далее сделать не получается. Добился только склейки разных файлов и вытаскивание кодов.

Ответить

  Ответы Всего ответов: 17  

Номер ответа: 1
Автор ответа:
 AxeL



ICQ: 264730390 

Вопросов: 2
Ответов: 106
 Профиль | | #1 Добавлено: 21.01.10 03:45
Список файлов можно получить через FSO так
  1. Option Explicit
  2. Dim fso, files, file
  3.  
  4. Set fso = CreateObject("Scripting.FileSystemObject")
  5. Set files = fso.GetFolder("c:\xml\test").Files
  6.  
  7. For Each file In files
  8. MsgBox file
  9. Next
  10.  
  11. Set files = Nothing
  12. Set  fso  = Nothing
или через WMI так
  1. Option Explicit
  2. Dim oWMI, oSelQ, file
  3.  
  4. Set oWMI  = GetObject("WinMgmts:{impersonationLevel=impersonate}!//" & "." & "/root/cimv2")
  5. Set oSelQ = oWMI.ExecQuery("Select * FROM CIM_DataFile Where Drive = 'C:' And Path = '\\xml\\test\\'")
  6.  
  7. If oSelQ.Count > 0 Then
  8. For Each file In oSelQ
  9. MsgBox file.Name
  10. Next
  11. End If
  12.  
  13. Set oSelQ = Nothing
  14. Set oWMI  = Nothing

Ответить

Номер ответа: 2
Автор ответа:
 Alexander



Вопросов: 2
Ответов: 11
 Профиль | | #2 Добавлено: 21.01.10 10:13
Есть у меня скрипт , как применить его по очереди на каждом файле находящемся в папке, имена файлов разные , одинаковое только расширение? На сколько понимаю должен быть цикл применения скрипта для файлов.

Ответить

Номер ответа: 3
Автор ответа:
 AxeL



ICQ: 264730390 

Вопросов: 2
Ответов: 106
 Профиль | | #3 Добавлено: 22.01.10 02:37
Выбирай один из двух мною предложенных циклов... Каждый цикл проходит по ВСЕМ файлам в определенной папке, а на выходе получаешь полный путь к файлу. Вместо
  1. MsgBox file
в первом случае и
  1. MsgBox file.Name
во втором случае пиши что-то типа
  1. MyFunction(file)
или
  1. MyFunction(file.Name)
,а в функции(процедуре) MyFunction обрабатываешь то, что тебе надо. я тебе вряд ли смогу в этом помочь, так как: 1. Не понимаю, чо ты конкретно хочешь получить на выходе, постоянно скрещивая pdf'ки с одинаковыми штрихкодами? 2. Что за проги Reader и pdftk? 3. У меня отсутствуют pdf'ки со штрихкодами...

Ответить

Номер ответа: 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
  1. For Each file In files
  2. MsgBox file
  3. Next
делаешь так
  1. For Each file In files
  2. If LCase(fso.GetExtensionName(file)) = "pdf" Then
  3. MsgBox file ' делаешь все, что нужно
  4. End If
  5. Next
, а для WMI так
  1. For Each file In oSelQ
  2. If LCase(file.Extension) = "pdf" Then
  3. MsgBox file.Name
  4. End If
  5. 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...
  1. Sub proverka()
  2.  
  3. bc = Range("barcod").Value
  4.  
  5. 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))
  6.  
  7. 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))
  8. b = b * 3
  9. a = a + b
  10. b = (a \ 10) * 10
  11. c = a - b
  12. If c > 0 Then c = 10 - c
  13. a = CInt(Mid(bc, 13, 1))
  14. If c = a Then
  15. Range("bcod").Value = numToEAN13char(bc)
  16. Else
  17. MsgBox "Введенный штрихкод неверен."
  18. End If
  19. End Sub
  20.  
  21. Public Function numToEAN13char(ByVal kod)
  22.     'Разбор строки
  23.     firstF = Val(Mid(kod, 1, 1))
  24.     leftstr = Mid(kod, 2, 6)
  25.     rightstr = Mid(kod, 8, 6)
  26.  
  27.     rightK = ""
  28.     For i = 1 To 6
  29.         rightK = rightK + NumberToLowerChar(Mid(rightstr, i, 1))
  30.     Next
  31.  
  32.     '  Формирование Левой части кода зависит от значениа firstF
  33.     If firstF = 0 Then
  34. '    0           A  A  A  A  A
  35.         leftK = "#!" + Left(leftstr, 1) + Mid(leftstr, 2, 1) + Mid(leftstr, 3, 1) + Mid(leftstr, 4, 1) + Mid(leftstr, 5, 1) + Mid(leftstr, 6, 1)
  36.     ElseIf firstF = 1 Then
  37. '    1           A  A  B  A  B  B
  38.         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))
  39.     ElseIf firstF = 2 Then
  40. '    2           A  A  B  B  A  B
  41.         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))
  42.     ElseIf firstF = 3 Then
  43. '    3           A  A  B  B  B  A
  44.         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)
  45.     ElseIf firstF = 4 Then
  46. '    4           A  B  A  A  B  B
  47.         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))
  48.     ElseIf firstF = 5 Then
  49. '    5           A  B  B  A  A  B
  50.         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))
  51.     ElseIf firstF = 6 Then
  52. '    6           A  B  B  B  A  A
  53.         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)
  54.     ElseIf firstF = 7 Then
  55. '    7           A  B  A  B  A  B
  56.         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))
  57.     ElseIf firstF = 8 Then
  58. '    8           A  B  A  B  B  A
  59.         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)
  60.     ElseIf firstF = 9 Then
  61. '    9           A  B  B  A  B  A
  62.         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)
  63.     End If
  64.  
  65.     numToEAN13char = leftK + "-" + rightK + "!"
  66. End Function
  67.  
  68. Public Function NumberToUpperChar(Num)
  69.     UpperCharSet = "ABCDEFGHIJ"
  70.     Num = Val(Right(Num, 1))
  71.     mstr = Mid(UpperCharSet, Num + 1, 1)
  72.     NumberToUpperChar = mstr
  73. End Function
  74.  
  75. Public Function NumberToLowerChar(Num)
  76.     LowerCharSet = "abcdefghij"
  77.     Num = Val(Right(Num, 1))
  78.     mstr = Mid(LowerCharSet, Num + 1, 1)
  79.     NumberToLowerChar = mstr
  80. End Function
  81.  
  82. Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
  83. If Sh.Name = ThisWorkbook.Sheets(1).Name And Target.Address = "$A$2" Then
  84. Call proverka
  85. Range("A1").Select
  86. End If
  87. 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

Ответить

Номер ответа: 14
Автор ответа:
 Шпион



ICQ: 250543104 

Вопросов: 13
Ответов: 118
 Профиль | | #14 Добавлено: 25.01.10 16:04
стукни в аську завтра (26 января 2010) - разберем твой пример

Ответить

Номер ответа: 15
Автор ответа:
 AxeL



ICQ: 264730390 

Вопросов: 2
Ответов: 106
 Профиль | | #15 Добавлено: 26.01.10 02:41
После выше написанного процесс не переходит к обработке следующего файла из папки
и не будет
ХЕЛП подскажите что дописать надо
  1. Next
он у тебя отсутствует как таковой. А в будущем для более простого и удобного написания кода могу посоветовать пару редакторов с подсветкой синтаксиса: Bred3, Notepad++.

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам