C# 和 PDFsharp 按名称合并目录中的 2 个 pdf 文件。有许多
C# and PDFsharp to merge 2 pdf files in a directory by their name. There are many
大家好,请耐心等待,因为我对 C# 和 visual studio 还很陌生。
我有一堆 PDF 被转储到一个目录中。通常在 300 左右。每个 PDF 看起来像这样
TP031041
TP031041_1
TP031337
TP031337_1
...等等
手动完成的方法是将文件号与其相同的文件号+下划线和1组合
所以
TP031041 + TP031041_1 合并后,保留第一个文件的名称
TP031041 + TP031041_1 = TP031041
编辑:这是经过多次试验和错误后的工作代码:
using PdfSharp.Pdf;
using PdfSharp.Pdf.IO;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
private const string dir = @"C:\Users\Pr0x1mo\Desktop\IMAGES\";
static void Main(string[] args)
{
//files in files folder and named like: TP031041 TP031041 TP031337 TP031337_1
File.SetAttributes(dir, FileAttributes.Normal);
string[] files = Directory.GetFiles(dir, "*.pdf");
IEnumerable<IGrouping<string, string>> groups = files.GroupBy(n => n.Split('.')[0].Split('_')[0]);
//string f = files[0].Split('_')[0];
foreach (var items in groups)
{
Console.WriteLine(items.Key);
PdfDocument outputPDFDocument = new PdfDocument();
foreach (var pdfFile in items)
{
Merge(outputPDFDocument, pdfFile);
}
outputPDFDocument.Save(Path.GetDirectoryName(items.Key) + @"\Merge\" + Path.GetFileNameWithoutExtension(items.Key) + ".pdf");
}
Console.ReadKey();
}
private static void Merge(PdfDocument outputPDFDocument, string pdfFile)
{
PdfDocument inputPDFDocument = PdfReader.Open(pdfFile, PdfDocumentOpenMode.Import);
outputPDFDocument.Version = inputPDFDocument.Version;
foreach (PdfPage page in inputPDFDocument.Pages)
{
outputPDFDocument.AddPage(page);
}
}
}
}
编辑:有效的新代码
这是我编辑的新代码,感谢 murat 和我朋友的建议。
MergeMultiplePDFIntoSinglePDF
方法会将所有文件合并为一个 PDF,但不包括您想要的分组逻辑。
一种方法是对列表中的文件名进行排序,然后按前缀对它们进行分组。
//example data. replace with files = openFileDialog.FileNames
var files = new List<string>
{
"TP031337_1",
"TP031041",
"TP031041",
"TP031041_1",
"TP031337",
"TP031337_1"
};
var groupedFiles = files.Distinct()
.OrderBy(s => s)
.GroupBy(s => s.Split('_')[0]);
foreach (var group in groupedFiles)
{
MergeMultiplePDFIntoSinglePDF(group.First(), group.ToArray());
}
您可以按照下面的方法进行;
using System;
using System.IO;
using System.Linq;
using PdfSharp.Pdf;
using PdfSharp.Pdf.IO;
namespace pdf_merger
{
class Program
{
static void Main(string[] args)
{
//files in files folder and named like: TP031041 TP031041 TP031337 TP031337_1
var files = Directory.GetFiles("files", "*.pdf");
var groups = files.GroupBy(n => n.Split('.')[0].Split('_')[0]);
foreach (var items in groups)
{
Console.WriteLine(items.Key);
PdfDocument outputPDFDocument = new PdfDocument();
foreach (var pdfFile in items)
{
Merge(outputPDFDocument, pdfFile);
}
outputPDFDocument.Save(items.Key.Replace("files", "files/compiled") + ".pdf");
}
Console.ReadKey();
}
private static void Merge(PdfDocument outputPDFDocument, string pdfFile)
{
PdfDocument inputPDFDocument = PdfReader.Open(pdfFile, PdfDocumentOpenMode.Import);
outputPDFDocument.Version = inputPDFDocument.Version;
foreach (PdfPage page in inputPDFDocument.Pages)
{
outputPDFDocument.AddPage(page);
}
}
}
}
大家好,请耐心等待,因为我对 C# 和 visual studio 还很陌生。
我有一堆 PDF 被转储到一个目录中。通常在 300 左右。每个 PDF 看起来像这样
TP031041 TP031041_1 TP031337 TP031337_1 ...等等
手动完成的方法是将文件号与其相同的文件号+下划线和1组合 所以
TP031041 + TP031041_1 合并后,保留第一个文件的名称 TP031041 + TP031041_1 = TP031041
编辑:这是经过多次试验和错误后的工作代码:
using PdfSharp.Pdf;
using PdfSharp.Pdf.IO;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
private const string dir = @"C:\Users\Pr0x1mo\Desktop\IMAGES\";
static void Main(string[] args)
{
//files in files folder and named like: TP031041 TP031041 TP031337 TP031337_1
File.SetAttributes(dir, FileAttributes.Normal);
string[] files = Directory.GetFiles(dir, "*.pdf");
IEnumerable<IGrouping<string, string>> groups = files.GroupBy(n => n.Split('.')[0].Split('_')[0]);
//string f = files[0].Split('_')[0];
foreach (var items in groups)
{
Console.WriteLine(items.Key);
PdfDocument outputPDFDocument = new PdfDocument();
foreach (var pdfFile in items)
{
Merge(outputPDFDocument, pdfFile);
}
outputPDFDocument.Save(Path.GetDirectoryName(items.Key) + @"\Merge\" + Path.GetFileNameWithoutExtension(items.Key) + ".pdf");
}
Console.ReadKey();
}
private static void Merge(PdfDocument outputPDFDocument, string pdfFile)
{
PdfDocument inputPDFDocument = PdfReader.Open(pdfFile, PdfDocumentOpenMode.Import);
outputPDFDocument.Version = inputPDFDocument.Version;
foreach (PdfPage page in inputPDFDocument.Pages)
{
outputPDFDocument.AddPage(page);
}
}
}
}
编辑:有效的新代码
这是我编辑的新代码,感谢 murat 和我朋友的建议。
MergeMultiplePDFIntoSinglePDF
方法会将所有文件合并为一个 PDF,但不包括您想要的分组逻辑。
一种方法是对列表中的文件名进行排序,然后按前缀对它们进行分组。
//example data. replace with files = openFileDialog.FileNames
var files = new List<string>
{
"TP031337_1",
"TP031041",
"TP031041",
"TP031041_1",
"TP031337",
"TP031337_1"
};
var groupedFiles = files.Distinct()
.OrderBy(s => s)
.GroupBy(s => s.Split('_')[0]);
foreach (var group in groupedFiles)
{
MergeMultiplePDFIntoSinglePDF(group.First(), group.ToArray());
}
您可以按照下面的方法进行;
using System;
using System.IO;
using System.Linq;
using PdfSharp.Pdf;
using PdfSharp.Pdf.IO;
namespace pdf_merger
{
class Program
{
static void Main(string[] args)
{
//files in files folder and named like: TP031041 TP031041 TP031337 TP031337_1
var files = Directory.GetFiles("files", "*.pdf");
var groups = files.GroupBy(n => n.Split('.')[0].Split('_')[0]);
foreach (var items in groups)
{
Console.WriteLine(items.Key);
PdfDocument outputPDFDocument = new PdfDocument();
foreach (var pdfFile in items)
{
Merge(outputPDFDocument, pdfFile);
}
outputPDFDocument.Save(items.Key.Replace("files", "files/compiled") + ".pdf");
}
Console.ReadKey();
}
private static void Merge(PdfDocument outputPDFDocument, string pdfFile)
{
PdfDocument inputPDFDocument = PdfReader.Open(pdfFile, PdfDocumentOpenMode.Import);
outputPDFDocument.Version = inputPDFDocument.Version;
foreach (PdfPage page in inputPDFDocument.Pages)
{
outputPDFDocument.AddPage(page);
}
}
}
}