C#和PDFsharp按名称将两个pdf文件合并到一个目录中。有很多

C#和PDFsharp按名称将两个pdf文件合并到一个目录中。有很多,c#,pdfsharp,C#,Pdfsharp,嘿,伙计们,请容忍我,因为我对C#和VisualStudio还相当陌生 我有一堆PDF文件,它们被转储到一个目录中。通常在300左右。每个PDF看起来像这样 TP031041 TP031041_1 TP031337 TP031337_1 …等等 手动执行的方式是将文件号与其相同的文件号+下划线和1组合 所以 TP031041+TP031041_1合并后,保留第一个文件的名称,以便 TP031041+TP031041_1=TP031041 编辑:这是经过多次尝试和错误后的工作代码: using P

嘿,伙计们,请容忍我,因为我对C#和VisualStudio还相当陌生

我有一堆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);
            }
        }
    }
}
使用PdfSharp.Pdf;
使用PdfSharp.Pdf.IO;
使用制度;
使用System.Collections.Generic;
使用System.IO;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
名称空间控制台EAPP1
{
班级计划
{
private const string dir=@“C:\Users\Pr0x1mo\Desktop\IMAGES\”;
静态void Main(字符串[]参数)
{
//文件文件夹中的文件,命名为:TP031041 TP031041 TP031337 TP031337_1
SetAttributes(dir,FileAttributes.Normal);
string[]files=Directory.GetFiles(dir,*.pdf”);
IEnumerable groups=files.GroupBy(n=>n.Split('.')[0].Split('.')[0]);
//字符串f=文件[0]。拆分(“”“)[0];
foreach(组中的var项目)
{
Console.WriteLine(items.Key);
PdfDocument outputPDFDocument=新PdfDocument();
foreach(项目中的var Pdfile)
{
合并(outputPDFDocument,pdfFile);
}
outputPDFDocument.Save(Path.GetDirectoryName(items.Key)+@“\Merge\”+Path.GetFileNameWithoutExtension(items.Key)+“.pdf”);
}
Console.ReadKey();
}
私有静态无效合并(PdfDocument outputPDFDocument,字符串pdfFile)
{
PdfDocument inputPDFDocument=PdfReader.Open(pdfFile,PdfDocumentOpenMode.Import);
outputPDFDocument.Version=inputPDFDocument.Version;
foreach(inputPDFDocument.Pages中的PDF页面)
{
outputPDFDocument.AddPage(第页);
}
}
}
}
编辑:有效的新代码


这是我编辑的新代码,感谢murat和我朋友的建议

该方法将所有文件合并为一个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());
}
//示例数据。替换为files=openFileDialog.filename
var files=新列表
{ 
“TP031337_1”,
“TP031041”,
“TP031041”,
“TP031041_1”,
“TP031337”,
“TP031337_1”
};
var groupedFiles=files.Distinct()
.OrderBy(s=>s)
.GroupBy(s=>s.Split(“”“)[0]);
foreach(groupedFiles中的var组)
{
MergeMultiplePDIntoSinglePDF(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);
            }
        }
    }
}

要合并的文件列表取自
OpenFileDialog
。当您通过多项选择确认时,它将返回路径列表。“这些都不管用”。。。编译器错误,运行时异常,哪个?当所有源文件都位于同一个目录中时,怎么会有重复的文件?meta,为什么代码是红色的?它看起来像一个未终止的字符串常量,但没有。SO code view是否已开始错误分配@syntax?@dlatikay第一个错误是“InitializeComponent”名称在当前上下文中不存在。下一个问题是当前上下文中不存在名称“openFileDialog1”。并且程序不包含适用于任何入口点的静态“Main”方法。您的问题不是关于itext,因此我将删除标记。这意味着您需要一个没有GUI的代码版本,该版本从目录而不是从windows“open…”对话框读取要合并的文件列表。也许最好从
Directory.GetFiles()
开始。是的,它们被转储到我的目录中的方式已经按照您上面发布的方式进行了排序。以防万一,我添加了OrderBy来按名称对条目进行排序。在这段代码中,我看到您输入了我列出的数字。。我列出的数字只是示例数字,所以我每次使用它时都必须在其中写入pdf文件的实际数字吗?不,你可以用
openFileDialog1替换
files
。文件名
请原谅我的无知,但这如何知道我的pdf文件在哪个目录下?我尝试运行代码,但它给了我以下错误:System.IO.DirectoryNotFoundException Message=找不到路径“C:\Users\XBorja\source\repos\ConsoleApp2\ConsoleApp2\bin\Debug\files”的一部分。我知道您转储pdf的目录,对吗?所以您更改这一行var files=Directory.GetFiles(“files”,“*.pdf”);第一个参数是目录物理地址。代码获取目录中的pdf文件列表,在debug folderok中称为“文件”,因此我编辑了我的代码,以与目录的预期方式相匹配。。。我执行代码,但所发生的一切是出现一个空白的cmd提示符,并保持空白,而不做任何事情。当我点击回车键时,它就关闭了,什么也没做。文件夹里有PDF文件,不是吗?是的。我的代码现在在编辑中的方式是正确的,对吗?