Слияние muiltple TIFF в один PDF-файл, используя itextsharp на основе lastwriteaccess

Не знаете, как на самом деле это сделать? Я могу конвертировать один TIF в один PDF. Я могу конвертировать все TIFS в одном каталоге в один PDF. То, что я хочу сделать, - это преобразовать группу tif-файлов на основе их последнего написанного доступа или созданной даты или измененной даты.

Например, если у меня есть 7 tif в одном каталоге, где 3 имеют одинаковую временную метку, а 4 имеют другую одинаковую временную метку, я хочу объединить 3 в один pdf, а затем объединить остальные 4 в другой pdf. Я застрял на том, как подойти к этому. Нужно ли мне создавать список всех файлов, затем группировать их, или я могу объединить 3, затем перейти к следующей группе, объединить эти и т. Д. И т. Д., Используя a для каждого?

Код ниже - то, что я использую, чтобы собрать первые 5 файлов:

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

1 ответ

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

Итак, если вы заказываете файлы по их .LastWriteTimeUtc Затем вы можете перебрать этот список и проверить, сколько времени прошло между одним и предыдущим. Если разрыв небольшой, добавьте его в текущий список, в противном случае создайте новый список.

Я проверил следующий код в каталоге со случайным выбором файлов, поэтому 30 дней были подходящим временным промежутком для этого, похоже, что две-три секунды подойдут для вашего использования:

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

Я предлагаю две или три секунды, потому что, если файлы были сохранены в файловой системе типа FAT (например, FAT32 или exFAT, которую можно использовать на USB-накопителях, старых дисках и т. Д.), Тогда разрешение временной метки будет две секунды

Другие вопросы по тегам