2017-08-16 4 views
2

Je ne sais pas vraiment comment s'y prendre? Je peux convertir un tif en un pdf. Je peux convertir tous les tifs dans un répertoire en un pdf. Ce que je veux faire est de convertir un groupe de tifs basé sur leur lastwriteaccess ou createddate ou modifieddate. Par exemple, si j'ai 7 tifs dans un répertoire où 3 ont le même horodatage et 4 ont un autre même horodatage, je veux fusionner les 3 en un pdf puis fusionner les 4 autres en un autre pdf. Je suis un peu coincé sur la façon d'aborder cela. Ai-je besoin de créer une liste de tous les fichiers puis de les grouper ou puis-je fusionner 3 puis aller au groupe suivant fusionner ces etc, etc, etc en utilisant un pour chaque?Fusionner muiltple tiff en un pdf en utilisant itextsharp basé sur lastwriteaccess

Le code ci-dessous est ce que j'utilise pour recueillir les 5 premiers fichiers:

Dim dir As New DirectoryInfo(tiffPath) 
Dim files As List(Of FileInfo) = 
dir.GetFiles("*.tif").OrderByDescending(Function(fc) 
fc.LastAccessTime).Take(5).ToList 

For Each lfi As FileInfo In files 
MsgBox(lfi.Name) 
Next 
+0

J'ai enlevé l'étiquette iText parce que, pendant que vous écrivez vous-même, vous avez déjà la partie iText de votre question couverte. Pour vous aider j'ai ajouté quelques tags qui semblaient plus pertinents. –

+0

Quelle est la correspondance exacte entre les horodatages de chaque groupe de fichiers que vous considérez comme identiques? Pourraient-ils être à moins d'une minute l'un de l'autre, dans une heure, une seconde ...? –

+0

la date et l'heure sont exactement les mêmes à la seconde, ne sais pas comment cela se passe, mais un autre programme fournit le tiff pour nous –

Répondre

0

On dirait qu'il serait suffisant pour les fichiers tassent si leurs horodatages diffèrent de moins que certains timespan. Donc, si vous commandez les fichiers par leur .LastWriteTimeUtc, vous pouvez parcourir cette liste et vérifier combien de temps il était entre l'un et le précédent. Si l'écart est faible, ajoutez-le à la liste actuelle, sinon démarrez une nouvelle liste.

J'ai testé le code suivant dans un répertoire avec une sélection aléatoire de fichiers, donc 30 jours était un laps de temps approprié pour cela, il ressemble peut-être deux ou trois secondes serait bon pour votre utilisation:

Option Infer On 
Option Strict On 

Imports System.IO 

Module Module1 

    ''' <summary> 
    ''' Get FileInfos bunched by virtue of having less than some time interval between their consecutive LastWriteTimeUtc when ordered by that. 
    ''' </summary> 
    ''' <param name="srcDir">Directory to get files from.</param> 
    ''' <param name="adjacencyLimit">The allowable timespan to count as in the same bunch.</param> 
    ''' <returns>A List(Of List(Of FileInfo). Each outer list has consecutive LastWriteTimeUtc differences less than some time interval.</returns> 
    Function GetTimeAdjacentFiles(srcDir As String, adjacencyLimit As TimeSpan) As List(Of List(Of FileInfo)) 
     Dim di = New DirectoryInfo(srcDir) 
     Dim fis = di.GetFiles().OrderBy(Function(fi) fi.LastWriteTimeUtc) 

     If fis.Count = 0 Then 
      Return Nothing 
     End If 

     Dim bins As New List(Of List(Of FileInfo)) 
     Dim thisBin As New List(Of FileInfo) From {(fis(0))} 

     For i = 1 To fis.Count - 1 
      If fis(i).LastWriteTimeUtc - fis(i - 1).LastWriteTimeUtc < adjacencyLimit Then 
       thisBin.Add(fis(i)) 
      Else 
       bins.Add(thisBin) 
       thisBin = New List(Of FileInfo) From {fis(i)} 
      End If 
     Next 

     bins.Add(thisBin) 

     Return bins 

    End Function 

    Sub Main() 
     Dim src = "E:\temp" 
     'TODO: choose a suitable TimeSpan, e.g. TimeSpan.FromSeconds(3) 
     Dim adjacencyLimit = TimeSpan.FromDays(30) 
     Dim x = GetTimeAdjacentFiles(src, adjacencyLimit) 

     For Each b In x 
      Console.WriteLine("***********") 
      For Each fi In b 
       'TODO: merge each fi into a PDF. 
       Console.WriteLine(fi.Name) 
      Next 
     Next 

     Console.ReadLine() 

    End Sub 

End Module 

Je suggère deux ou trois secondes, car si les fichiers ont été stockés sur un type FAT (par exemple FAT32 ou exFAT, comme sur les clés USB, les anciens lecteurs de disque, etc.), la résolution de l'horodatage aura été deux secondes.

+0

cela a fonctionné pour mon merci Andrew. J'ai marqué la réponse acceptée mais je n'ai pas assez de points de réputation –

+0

@ElNottoWorry De rien :) Je pense que vous * pourriez * devoir attendre un certain temps (peut-être 24 ou 48 heures) avant de pouvoir accepter une réponse - jusqu'à ce que vous obteniez représentant. –