我需要将图像(例如.jpg
)转换为PDF文件,以便进行学校作业。我有一个ListBox
,在其中放置了PDF文件的页面,因此用户可以重新排序列表并按该顺序转换文件。
我将文件放在一个临时文件夹中,以便将文件转换为PDF。
我的问题是::如何按照用户选择的顺序转换文件?
我已经搜索过,并且尝试使用字符串ID
和Name
进行Class,因此我从ListBox中的项目获取ID并在新列表中对其进行更改。我想之后,我做了一个foreach()循环,从临时文件夹中获取文件并将它们合并到一个新的PDF文件中,但是按照我想要的顺序,我认为我必须比较文件名列表中的名称,如果匹配,则将其转换并添加,如果不匹配,则传递到下一个文件。
但是我不知道该怎么做。
可以请人帮我弄清楚这个吗? 预先感谢!
我要将代码发送到:
//the open files button
private void proc2_Click(object sender, EventArgs e)
{
OpenFileDialog dialogo = new OpenFileDialog();
dialogo.Title = "Search files";
dialogo.InitialDirectory = @"E:\";
dialogo.Filter = "Images (.bmp,.jpg,.png,.tiff,.tif) |*.bmp;*.jpg;*.png;*tiff;*tif|All of the files (*.*)|*.*";
DialogResult resposta = dialogo.ShowDialog();
if (resposta == DialogResult.OK)
{
string caminhoCompleto = dialogo.FileName;
caminho2 = dialogo.SafeFileName;
caminhotb2.Text = caminhoCompleto;
string fish = "";
string path = @"C:\temporario";
if(Directory.Exists(path))
{
fish=Path.Combine(path, caminho2);
}
else
{
Directory.CreateDirectory(path);
fish = Path.Combine(path, caminho2);
}
File.Create(fish);
listaimg.Items.Add(caminho2);
}
}
public string[] GetFilesImg4() //jpg files
{
if (!Directory.Exists(@"C:\temporario"))
{
Directory.CreateDirectory(@"C:\temporario");
}
DirectoryInfo dirInfo = new DirectoryInfo(@"C:\temporario");
FileInfo[] fileInfos4 = dirInfo.GetFiles("*.jpg");
foreach (FileInfo info in fileInfos4)
{
if (info.Name.IndexOf("protected") == -1)
list4.Add(info.FullName);
}
return (string[])list4.ToArray(typeof(string));
}
答案 0 :(得分:0)
如果两个动作都在同一过程中发生,则只需将文件名列表存储在内存中(并且已经将它们添加到listaimg
中):
public string[] GetFilesImg4() //jpg files
{
string tempPath = @"C:\temporario";
if (!Directory.Exists(tempPath))
{
foreach (string filename in listimga.Items)
{
if (!filename.Contains("protected"))
list4.Add(Path.Combine(tempPath, filename);
}
}
return (string[])list4.ToArray(typeof(string));
}
如果这些过程是不同的,那么您可以在某个时候转储listimga
的内容,然后从同一文件中读取它。在下面的示例中,我将其存储到同一目录中名为“ order.txt”的文件中,但是逻辑可能更加复杂,例如将多个文件与时间戳等合并。
// somewhere in after selecting all files
File.WriteAllLines(@"c:\temporario\order.txt", listimga.Items.Select(t=>t.ToString()));
public string[] GetFilesImg4() //jpg files
{
string tempPath = @"C:\temporario";
if (!Directory.Exists(tempPath))
{
var orderedFilenames = File.ReadAllLines(Path.Combine(tempPath, "order.txt")); // list of files loaded in order
foreach (string filename in orderedFilenames)
{
if (!filename.Contains("protected"))
list4.Add(Path.Combine(tempPath, filename);
}
}
return (string[])list4.ToArray(typeof(string));
}
检查类上的可用方法也是一个好主意,例如,在这种情况下,string.IndexOf(s) == -1
等效于!string.Contains(s)
,而后者至少对于说英语的人更具可读性。 / p>
我还注意到您的用户必须一个一个地选择文档,但是FileOpen对话框允许一次选择多个文件,我相信它也保留了选择的顺序。
如果选择顺序很重要,并且文件打开对话框没有保留顺序,或者用户发现难以遵循,则仍然可以使用多个文件选择打开对话框,然后允许对listimga
列表框进行重新排序以获取订购权。