2017-08-16 4 views
2

Ich weiß nicht wirklich, wie man das macht? Ich kann ein TIF zu einem pdf umwandeln. Ich kann alle tiffs in einem Verzeichnis in ein pdf umwandeln. Was ich tun möchte, ist eine Gruppe von TIFFs basierend auf ihrem LastWriteAccess oder CreatedDate oder ModifiedDate zu konvertieren.Merge muiltple tiff in ein pdf mit itextsharp basierend auf lastwriteaccess

Zum Beispiel, wenn ich 7 tiffs in einem Verzeichnis habe, wo 3 den gleichen Zeitstempel und 4 einen anderen Zeitstempel haben, möchte ich die 3 in eine pdf zusammenführen und dann die anderen 4 in eine andere pdf zusammenführen. Ich bleibe irgendwie dabei, wie ich das angehen kann. Muss ich eine Liste aller Dateien erstellen und sie dann gruppieren oder kann ich 3 zusammenführen, dann gehe ich in die nächste Gruppe, füge die usw., etc usw. mit einem für jeden hinzu?

Der folgende Code ist das, was ich die ersten 5 Dateien zu sammeln, bin mit:

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

Ich habe das iText-Tag entfernt, weil Sie bereits den iText-Teil Ihrer Frage abgedeckt haben, während Sie selbst schreiben. Um Ihnen zu helfen, habe ich einige Tags hinzugefügt, die relevanter erschienen. –

+0

Wie genau sind die Zeitstempel für jede Gruppe von Dateien abgestimmt, die Sie als identisch betrachten würden? Könnten sie innerhalb einer Minute, innerhalb einer Stunde, einer Sekunde ... sein? –

+0

das Datum und die Zeitstempel sind genau die gleichen, die zweite, weiß nicht, wie es funktioniert, aber ein anderes Programm bietet die TIFF für uns –

Antwort

0

Es sieht aus wie es zusammen Haufen Dateien ausreichen würde, wenn ihre Zeitstempel von weniger als einem gewissen Zeitraum abweichen.

Also, wenn Sie die Dateien durch ihre .LastWriteTimeUtc bestellen, dann können Sie über diese Liste iterieren und überprüfen, wie lange es zwischen dem einen und dem vorherigen war. Wenn die Lücke klein ist, fügen Sie sie der aktuellen Liste hinzu, andernfalls starten Sie eine neue Liste.

Getestet habe ich den folgenden Code in einem Verzeichnis mit einer zufälligen Auswahl von Dateien, so waren 30 Tage eine angemessene Zeitspanne für das, es wie vielleicht zwei oder drei Sekunden für Ihren Einsatz wären gut aussieht:

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 

Ich schlage zwei oder drei Sekunden vor, denn wenn die Dateien auf einem FAT-Typ (zB FAT32 oder exFAT, wie auf USB-Sticks, alten Festplattenlaufwerken und so weiter) verwendet werden können, dann hat die Auflösung des Timestamps waren zwei Sekunden.

+0

das funktionierte für meinen Dank Andrew. Ich habe die Antwort akzeptiert, aber ich habe nicht genug Reputationspunkte –

+0

@ElNottoWorry Gern geschehen :) Ich glaube, du * musst * etwas warten (vielleicht 24 oder 48 Stunden), bevor du eine Antwort annehmen kannst - bis du ausreichend bist rep. –