2016-10-19 5 views
0

Je travaille actuellement sur vb.net. Mon entreprise est en passe de devenir sans papier et je veux faire une analyse de réduction des coûts sur les économies de papier. Actuellement, nous sauvegardons tous nos fichiers PDF sur un serveur. Le chemin du fichier est comme ceci: "Serveur> Dossier1> Dossier2> Dossier3> Dossier4> Fichiers PDF." Les dossiers 1 et 2 sont toujours utilisés pour naviguer. Le dossier 3 est une liste de départements et le dossier 4 est chaque travail. Chaque dossier 4 a plusieurs fichiers pdf. Pour être mis simplement les noms de Dossier 1 et Dossier 2 sont statiques tandis que les dossiers 3 et 4 sont dynamiques. Pour rendre les choses encore plus difficiles, tous les fichiers PDF situés après le dossier 4 ont des noms différents. J'ai le peu de code ci-dessous pour détecter combien de pages un pdf est sans avoir à l'ouvrir mais il nécessite le chemin du fichier. Considérant qu'il y a des centaines sinon plus de mille fichiers pdf, je veux boucler par programme tous ces fichiers, détecter si le fichier est un fichier pdf, puis additionner toutes les pages trouvées. Je peux ensuite utiliser ce nombre pour calculer les économies de coûts liées à la dématérialisation.Calculez par programme le nombre total de pages dans plusieurs fichiers pdf enregistrés dans différents emplacements

PdfReader pr = new PdfReader("/path/to/yourFile.pdf"); 
return pr.getNumberOfPages(); 

Une autre idée serait de fusionner en quelque sorte tous les fichiers togther dans un seul fichier PDF qui le rendre aussi simple que d'ouvrir le fichier pour voir combien de pages sont là.

+0

Faut-il l'utiliser sur vb.net? Cette tâche semble être beaucoup plus simple dans un langage de script shell. –

+0

@EliSadoff il peut très bien être plus facile dans une autre langue, mais je ne connais que C# et VB.NET. Si le code n'est pas difficile, je serai peut-être capable de le comprendre. – Cheddar

+0

On dirait un sous-récursif qui vérifie les fichiers de chaque répertoire, puis voit s'il a des sous-répertoires qui fonctionneraient bien. Si sun-répertoires trouvés, puis l'appeler à nouveau et effectue les mêmes contrôles sur chaque sous-répertoire ... etc – soohoonigan

Répondre

0

Voici une solution VBA. Exécutez le code dans Excel.

Sub PDFandNumPages() 

    Dim Folder As Object 
    Dim file As Object 
    Dim fso As Object 
    Dim iExtLen As Integer, iRow As Integer 
    Dim sFolder As String, sExt As String 
    Dim sPDFName As String 

    sExt = "pdf" 
    iExtLen = Len(sExt) 
    iRow = 1 
    ' Must have a '\' at the end of path 
    sFolder = "C:\your_path_here\" 

    Set fso = CreateObject("Scripting.FileSystemObject") 

    If sFolder <> "" Then 
     Set Folder = fso.GetFolder(sFolder) 
     For Each file In Folder.Files 
     If Right(file, iExtLen) = sExt Then 
      Cells(iRow, 1).Value = file.Name 
      Cells(iRow, 2).Value = pageCount(sFolder & file.Name) 
      iRow = iRow + 1 
     End If 
     Next file 
    End If 

End Sub 

Function pageCount(sFilePathName As String) As Integer 

Dim nFileNum As Integer 
Dim sInput As String 
Dim sNumPages As String 
Dim iPosN1 As Integer, iPosN2 As Integer 
Dim iPosCount1 As Integer, iPosCount2 As Integer 
Dim iEndsearch As Integer 

' Get an available file number from the system 
nFileNum = FreeFile 

'OPEN the PDF file in Binary mode 
Open sFilePathName For Binary Lock Read Write As #nFileNum 

    ' Get the data from the file 
    Do Until EOF(nFileNum) 
     Input #1, sInput 
     sInput = UCase(sInput) 
     iPosN1 = InStr(1, sInput, "/N ") + 3 
     iPosN2 = InStr(iPosN1, sInput, "/") 
     iPosCount1 = InStr(1, sInput, "/COUNT ") + 7 
     iPosCount2 = InStr(iPosCount1, sInput, "/") 

    If iPosN1 > 3 Then 
     sNumPages = Mid(sInput, iPosN1, iPosN2 - iPosN1) 
     Exit Do 
    ElseIf iPosCount1 > 7 Then 
     sNumPages = Mid(sInput, iPosCount1, iPosCount2 - iPosCount1) 
     Exit Do 
    ' Prevent overflow and assigns 0 to number of pages if strings are not in binary 
    ElseIf iEndsearch > 1001 Then 
     sNumPages = "0" 
     Exit Do 
    End If 
     iEndsearch = iEndsearch + 1 
    Loop 

    ' Close pdf file 
    Close #nFileNum 
    pageCount = CInt(sNumPages) 

End Function 

Voici une autre façon de faire essentiellement la même chose.

Sub Test() 
    Dim MyPath As String, MyFile As String 
    Dim i As Long 
    MyPath = "C:\your_path_here\" 
    MyFile = Dir(MyPath & Application.PathSeparator & "*.pdf", vbDirectory) 
    Range("A:B").ClearContents 
    Range("A1") = "File Name": Range("B1") = "Pages" 
    Range("A1:B1").Font.Bold = True 
    i = 1 
    Do While MyFile <> "" 
     i = i + 1 
     Cells(i, 1) = MyFile 
     Cells(i, 2) = GetPageNum(MyPath & Application.PathSeparator & MyFile) 
     MyFile = Dir 
    Loop 
    Columns("A:B").AutoFit 
    MsgBox "Total of " & i - 1 & " PDF files have been found" & vbCrLf _ 
      & " File names and corresponding count of pages have been written on " _ 
      & ActiveSheet.Name, vbInformation, "Report..." 
End Sub 
' 
Function GetPageNum(PDF_File As String) 
    'Haluk 19/10/2008 
    Dim FileNum As Long 
    Dim strRetVal As String 
    Dim RegExp 
    Set RegExp = CreateObject("VBscript.RegExp") 
    RegExp.Global = True 
    RegExp.Pattern = "/Type\s*/Page[^s]" 
    FileNum = FreeFile 
    Open PDF_File For Binary As #FileNum 
     strRetVal = Space(LOF(FileNum)) 
     Get #FileNum, , strRetVal 
    Close #FileNum 
    GetPageNum = RegExp.Execute(strRetVal).Count 
End Function