使用基于lastwriteaccess的itextsharp将multiiltple tiff合并为一个pdf



不知道该怎么做?我可以将一个 tif 转换为一个 pdf。我可以将一个目录中的所有 tif 转换为一个 pdf。我想做的是根据 tifs 的最后写入访问权限或创建日期或修改日期转换一组 tif。

例如,如果我在一个目录中有 7 个 tif,其中 3 个具有相同的时间戳,4 个具有另一个相同的时间戳,我想将 3 合并为一个 pdf,然后将其他 4 个合并到另一个 pdf 中。我有点纠结于如何处理这个问题。我是否需要创建所有文件的列表,然后对它们进行分组,或者我可以合并 3 然后下一组合并这些等,等等,每个文件?

下面的代码是我用来收集前 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

如果文件的时间戳相差不到某个时间跨度,那么将文件捆绑在一起就足够了。

因此,如果您按文件.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 记忆棒、旧磁盘驱动器等上使用(文件系统上,那么时间戳的分辨率将是两秒钟。

最新更新