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);
            }
        }
    }
}