دمج مستندات PDF في C#

نظرة عامة

تشرح هذه المقالة كيفية دمج أو توحيد أو دمج ملفات PDF مختلفة في ملف PDF واحد باستخدام C#. وتغطي مواضيع مثل

دمج ملفات PDF باستخدام مسارات الملفات

PdfFileEditor هي الفئة في Aspose.Pdf.Facades namespace التي تتيح لك دمج ملفات PDF متعددة. يمكنك ليس فقط دمج الملفات باستخدام FileStreams ولكن أيضًا باستخدام MemoryStreams أيضًا. في هذه المقالة، سيتم شرح عملية دمج الملفات باستخدام MemoryStreams ثم عرضها باستخدام مقتطف الكود.

يمكن استخدام طريقة Concatenate من فئة PdfFileEditor لدمج ملفي PDF. تتيح لك طريقة Concatenate تمرير ثلاث معلمات: ملف PDF المدخل الأول، ملف PDF المدخل الثاني، وملف PDF الناتج. يحتوي ملف PDF الناتج النهائي على كلا ملفي PDF المدخلين.

يوضح لك مقتطف الكود C# التالي كيفية دمج ملفات PDF باستخدام مسارات الملفات.

// For complete examples and data files, please go to https://github.com/aspose-pdf/Aspose.Pdf-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_AsposePdfFacades_Pages();
// Create PdfFileEditor object
PdfFileEditor pdfEditor = new PdfFileEditor();
// Concatenate files
pdfEditor.Concatenate(dataDir + "input.pdf", dataDir + "input2.pdf", dataDir + "ConcatenateUsingPath_out.pdf");

في بعض الحالات، عندما يكون هناك الكثير من المخططات، قد يقوم المستخدمون بتعطيلها من خلال تعيين CopyOutlines إلى false وتحسين أداء الدمج.

// For complete examples and data files, please go to https://github.com/aspose-pdf/Aspose.Pdf-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_AsposePdfFacades_Pages();
PdfFileEditor pfe = new PdfFileEditor();
string[] files = Directory.GetFiles(dataDir);
pfe.CopyOutlines = false;
pfe.Concatenate(files, dataDir + "CopyOutline_out.pdf");

دمج ملفات PDF متعددة باستخدام MemoryStreams

طريقة Concatenate من فئة PdfFileEditor تأخذ ملفات PDF المصدر وملف PDF الوجهة كمعاملات. يمكن أن تكون هذه المعاملات إما مسارات لملفات PDF على القرص أو يمكن أن تكون MemoryStreams. الآن، في هذا المثال، سنقوم أولاً بإنشاء تدفقين للملفات لقراءة ملفات PDF من القرص. ثم سنقوم بتحويل هذه الملفات إلى مصفوفات بايت. سيتم تحويل هذه المصفوفات البايتية لملفات PDF إلى MemoryStreams. بمجرد حصولنا على MemoryStreams من ملفات PDF، سنكون قادرين على تمريرها إلى طريقة الدمج والدمج في ملف إخراج واحد.

يظهر لك مقتطف الكود C# التالي كيفية دمج ملفات PDF متعددة باستخدام MemoryStreams:

// For complete examples and data files, please go to https://github.com/aspose-pdf/Aspose.Pdf-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_AsposePdfFacades_TechnicalArticles();
// Create two file streams to read pdf files
FileStream fs1 = new FileStream(dataDir + "inFile.pdf", FileMode.Open, FileAccess.Read);
FileStream fs2 = new FileStream(dataDir + "inFile2.pdf", FileMode.Open, FileAccess.Read);
// Create byte arrays to keep the contents of PDF files
byte[] buffer1 = new byte[Convert.ToInt32(fs1.Length)];
byte[] buffer2 = new byte[Convert.ToInt32(fs2.Length)];
int i = 0;
// Read PDF file contents into byte arrays
i = fs1.Read(buffer1, 0, Convert.ToInt32(fs1.Length));
i = fs2.Read(buffer2, 0, Convert.ToInt32(fs2.Length));
// Now, first convert byte arrays into MemoryStreams and then concatenate those streams
using (MemoryStream pdfStream = new MemoryStream())
{
using (MemoryStream fileStream1 = new MemoryStream(buffer1))
{
using (MemoryStream fileStream2 = new MemoryStream(buffer2))
{
// Create instance of PdfFileEditor class to concatenate streams
PdfFileEditor pdfEditor = new PdfFileEditor();
// Concatenate both input MemoryStreams and save to putput MemoryStream
pdfEditor.Concatenate(fileStream1, fileStream2, pdfStream);
// Convert MemoryStream back to byte array
byte[] data = pdfStream.ToArray();
// Create a FileStream to save the output PDF file
FileStream output = new FileStream(dataDir + "merged_out.pdf", FileMode.Create,
FileAccess.Write);
// Write byte array contents in the output file stream
output.Write(data, 0, data.Length);
// Close output file
output.Close();
}
}
}
// Close input files
fs1.Close();
fs2.Close();

دمج مجموعة من ملفات PDF باستخدام مسارات الملفات

إذا كنت تريد دمج ملفات PDF متعددة، يمكنك استخدام التحميل الزائد لطريقة Concatenate، والتي تسمح لك بتمرير مصفوفة من ملفات PDF. يتم حفظ الناتج النهائي كملف مدمج تم إنشاؤه من جميع الملفات في المصفوفة. يظهر لك مقتطف الشيفرة C# التالي كيفية دمج مجموعة من ملفات PDF باستخدام مسارات الملفات.

// For complete examples and data files, please go to https://github.com/aspose-pdf/Aspose.Pdf-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_AsposePdfFacades_Pages();
// Create PdfFileEditor object
PdfFileEditor pdfEditor = new PdfFileEditor();
// Array of files
string[] filesArray = new string[2];
filesArray[0] = dataDir + "input.pdf";
filesArray[1] = dataDir + "input2.pdf";
// Concatenate files
pdfEditor.Concatenate(filesArray, dataDir + "ConcatenateArrayOfFilesWithPath_out.pdf");

دمج مجموعة من ملفات PDF باستخدام التدفقات

دمج مجموعة من ملفات PDF لا يقتصر فقط على الملفات الموجودة على القرص. يمكنك أيضًا دمج مجموعة من ملفات PDF من التدفقات. إذا كنت ترغب في دمج ملفات PDF متعددة، يمكنك استخدام التحميل الزائد المناسب لطريقة Concatenate. أولاً، تحتاج إلى إنشاء مجموعة من تدفقات الإدخال وتدفق واحد لملف PDF الناتج، ثم استدعاء طريقة Concatenate. سيتم حفظ الناتج في تدفق الإخراج. يوضح لك جزء الشفرة C# التالي كيفية دمج مجموعة من ملفات PDF باستخدام التدفقات.

// For complete examples and data files, please go to https://github.com/aspose-pdf/Aspose.Pdf-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_AsposePdfFacades_Pages();
// Create PdfFileEditor object
PdfFileEditor pdfEditor = new PdfFileEditor();
// Output stream
FileStream outputStream = new FileStream(dataDir + "ConcatenateArrayOfPdfUsingStreams_out.pdf", FileMode.Create);
// Array of streams
FileStream[] inputStreams = new FileStream[2];
inputStreams[0] = new FileStream(dataDir + "input.pdf", FileMode.Open);
inputStreams[1] = new FileStream(dataDir + "input2.pdf", FileMode.Open);
// Concatenate file
pdfEditor.Concatenate(inputStreams, outputStream);

دمج جميع ملفات Pdf في مجلد معين

يمكنك حتى قراءة جميع ملفات Pdf في مجلد معين أثناء وقت التشغيل ودمجها، دون حتى معرفة أسماء الملفات. قدم مسار الدليل الذي يحتوي على مستندات PDF التي ترغب في دمجها.

يرجى تجربة استخدام جزء الكود C# التالي لتحقيق هذه الوظيفة.

// For complete examples and data files, please go to https://github.com/aspose-pdf/Aspose.Pdf-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_AsposePdfFacades_TechnicalArticles();
// Retrieve names of all the Pdf files in a particular Directory
string[] fileEntries = Directory.GetFiles(dataDir, "*.pdf");
// Get the current System date and set its format
string date = DateTime.Now.ToString("MM-dd-yyyy");
// Get the current System time and set its format
string hoursSeconds = DateTime.Now.ToString("hh-mm");
// Set the value for the final Resultant Pdf document
string masterFileName = date + "_" + hoursSeconds + "_out.pdf";
// Instantiate PdfFileEditor object
Aspose.Pdf.Facades.PdfFileEditor pdfEditor = new PdfFileEditor();
// Call Concatenate method of PdfFileEditor object to concatenate all input files
// Into a single output file
pdfEditor.Concatenate(fileEntries, dataDir + masterFileName);

دمج نماذج PDF والحفاظ على أسماء الحقول فريدة

توفر فئة PdfFileEditor في Aspose.Pdf.Facades namespace القدرة على دمج ملفات PDF. الآن، إذا كانت ملفات Pdf التي سيتم دمجها تحتوي على حقول نموذج بأسماء حقول مشابهة، يوفر Aspose.PDF ميزة الحفاظ على الحقول في ملف Pdf الناتج كفريدة كما يمكنك تحديد اللاحقة لجعل أسماء الحقول فريدة. خاصية KeepFieldsUnique الخاصة بـ PdfFileEditor كـ true ستجعل أسماء الحقول فريدة عند دمج نماذج Pdf. أيضًا، يمكن استخدام خاصية UniqueSuffix الخاصة بـ PdfFileEditor لتحديد تنسيق اللاحقة الذي يحدده المستخدم والذي يضاف إلى اسم الحقل لجعله فريدًا عند دمج النماذج. يجب أن تحتوي هذه السلسلة على الجزء الفرعي %NUM% والذي سيتم استبداله بالأرقام في الملف الناتج.

يرجى الاطلاع على مقتطف الكود البسيط التالي لتحقيق هذه الوظيفة.

// For complete examples and data files, please go to https://github.com/aspose-pdf/Aspose.Pdf-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_AsposePdfFacades_TechnicalArticles();
// Set input and output file paths
string inputFile1 = dataDir + "inFile1.pdf";
string inputFile2 = dataDir + "inFile2.pdf";
string outFile = dataDir + "ConcatenatePDFForms_out.pdf";
// Instantiate PdfFileEditor Object
PdfFileEditor fileEditor = new PdfFileEditor();
// To keep unique field Id for all the fields
fileEditor.KeepFieldsUnique = true;
// Format of the suffix which is added to field name to make it unique when forms are concatenated.
fileEditor.UniqueSuffix = "_%NUM%";
// Concatenate the files into a resultant Pdf file
fileEditor.Concatenate(inputFile1, inputFile2, outFile);

دمج ملفات PDF وإنشاء جدول المحتويات

دمج ملفات PDF

يرجى الإطلاع على مقتطف الشيفرة التالية للحصول على معلومات حول كيفية دمج ملفات PDF.

// For complete examples and data files, please go to https://github.com/aspose-pdf/Aspose.Pdf-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_AsposePdfFacades_TechnicalArticles();
// Create PdfFileEditor object
PdfFileEditor pdfEditor = new PdfFileEditor();
// Save concatenated output file
pdfEditor.Concatenate(new FileStream(dataDir + "input1.pdf", FileMode.Open), new FileStream(dataDir + "input2.pdf", FileMode.Open), new FileStream(dataDir + "ConcatenatePdfFilesAndCreateTOC_out.pdf", FileMode.Create));

إدراج صفحة فارغة

بمجرد دمج ملفات PDF، يمكننا إدراج صفحة فارغة في بداية المستند حيث يمكننا إنشاء جدول المحتويات. لتحقيق هذا المتطلب، يمكننا تحميل الملف المدمج في كائن Document ونحتاج إلى استدعاء طريقة Page.Insert(…) لإدراج صفحة فارغة.

// For complete examples and data files, please go to https://github.com/aspose-pdf/Aspose.Pdf-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_AsposePdfFacades_TechnicalArticles();
// Insert a blank page at the begining of concatenated file to display Table of Contents
Aspose.Pdf.Document concatenated_pdfDocument = new Aspose.Pdf.Document(new FileStream(dataDir + "Concatenated_Table_Of_Contents.pdf", FileMode.Open));
// Insert a empty page in a PDF
concatenated_pdfDocument.Pages.Insert(1);

إضافة طوابع نصية

لإنشاء جدول محتويات، نحتاج إلى إضافة طوابع نصية في الصفحة الأولى باستخدام كائنات PdfFileStamp وStamp. توفر فئة Stamp طريقة BindLogo(...) لإضافة FormattedText ويمكننا أيضًا تحديد الموقع لإضافة هذه الأختام النصية باستخدام طريقة SetOrigin(..). في هذه المقالة، نحن نقوم بدمج ملفي PDF، لذلك نحتاج إلى إنشاء كائنين لختم النص يشيران إلى هذه المستندات الفردية.

// For complete examples and data files, please go to https://github.com/aspose-pdf/Aspose.Pdf-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_AsposePdfFacades_TechnicalArticles();
// Set Text Stamp to display string Table Of Contents
Aspose.Pdf.Facades.Stamp stamp = new Aspose.Pdf.Facades.Stamp();
stamp.BindLogo(new FormattedText("Table Of Contents", System.Drawing.Color.Maroon, System.Drawing.Color.Transparent, Aspose.Pdf.Facades.FontStyle.Helvetica, EncodingType.Winansi, true, 18));
// Specify the origin of Stamp. We are getting the page width and specifying the X coordinate for stamp
stamp.SetOrigin((new PdfFileInfo(new FileStream(dataDir + "input1.pdf", FileMode.Open)).GetPageWidth(1) / 3), 700);
// Set particular pages
stamp.Pages = new int[] { 1 };

إنشاء روابط محلية

الآن نحن بحاجة إلى إضافة روابط نحو الصفحات داخل الملف المدمج. لتحقيق هذا المتطلب، يمكننا استخدام طريقة CreateLocalLink(..) لفئة PdfContentEditor. في مقطع الكود التالي، قمنا بتمرير Transparent كحجة رابعة بحيث لا يظهر المستطيل حول الرابط.

### الشيفرة الكاملة

// For complete examples and data files, please go to https://github.com/aspose-pdf/Aspose.Pdf-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_AsposePdfFacades_TechnicalArticles();
// Create PdfFileEditor object
PdfFileEditor pdfEditor = new PdfFileEditor();
// Create a MemoryStream object to hold the resultant PDf file
using (MemoryStream Concatenated_Stream = new MemoryStream())
{
// Save concatenated output file
pdfEditor.Concatenate(new FileStream(dataDir + "input1.pdf", FileMode.Open), new FileStream(dataDir + "input2.pdf", FileMode.Open), Concatenated_Stream);
// Insert a blank page at the begining of concatenated file to display Table of Contents
Aspose.Pdf.Document concatenated_pdfDocument = new Aspose.Pdf.Document(Concatenated_Stream);
// Insert a empty page in a PDF
concatenated_pdfDocument.Pages.Insert(1);
// Hold the resultnat file with empty page added
using (MemoryStream Document_With_BlankPage = new MemoryStream())
{
// Save output file
concatenated_pdfDocument.Save(Document_With_BlankPage);
using (var Document_with_TOC_Heading = new MemoryStream())
{
// Add Table Of Contents logo as stamp to PDF file
PdfFileStamp fileStamp = new PdfFileStamp();
// Find the input file
fileStamp.BindPdf(Document_With_BlankPage);
// Set Text Stamp to display string Table Of Contents
Aspose.Pdf.Facades.Stamp stamp = new Aspose.Pdf.Facades.Stamp();
stamp.BindLogo(new FormattedText("Table Of Contents", System.Drawing.Color.Maroon, System.Drawing.Color.Transparent, Aspose.Pdf.Facades.FontStyle.Helvetica, EncodingType.Winansi, true, 18));
// Specify the origin of Stamp. We are getting the page width and specifying the X coordinate for stamp
stamp.SetOrigin((new PdfFileInfo(Document_With_BlankPage).GetPageWidth(1) / 3), 700);
// Set particular pages
stamp.Pages = new int[] { 1 };
// Add stamp to PDF file
fileStamp.AddStamp(stamp);
// Create stamp text for first item in Table Of Contents
var Document1_Link = new Aspose.Pdf.Facades.Stamp();
Document1_Link.BindLogo(new FormattedText("1 - Link to Document 1", System.Drawing.Color.Black, System.Drawing.Color.Transparent, Aspose.Pdf.Facades.FontStyle.Helvetica, EncodingType.Winansi, true, 12));
// Specify the origin of Stamp. We are getting the page width and specifying the X coordinate for stamp
Document1_Link.SetOrigin(150, 650);
// Set particular pages on which stamp should be displayed
Document1_Link.Pages = new int[] { 1 };
// Add stamp to PDF file
fileStamp.AddStamp(Document1_Link);
// Create stamp text for second item in Table Of Contents
var Document2_Link = new Aspose.Pdf.Facades.Stamp();
Document2_Link.BindLogo(new FormattedText("2 - Link to Document 2", System.Drawing.Color.Black, System.Drawing.Color.Transparent, Aspose.Pdf.Facades.FontStyle.Helvetica, EncodingType.Winansi, true, 12));
// Specify the origin of Stamp. We are getting the page width and specifying the X coordinate for stamp
Document2_Link.SetOrigin(150, 620);
// Set particular pages on which stamp should be displayed
Document2_Link.Pages = new int[] { 1 };
// Add stamp to PDF file
fileStamp.AddStamp(Document2_Link);
// Save updated PDF file
fileStamp.Save(Document_with_TOC_Heading);
fileStamp.Close();
// Now we need to add Heading for Table Of Contents and links for documents
PdfContentEditor contentEditor = new PdfContentEditor();
// Bind the PDF file in which we added the blank page
contentEditor.BindPdf(Document_with_TOC_Heading);
// Create link for first document
contentEditor.CreateLocalLink(new System.Drawing.Rectangle(150, 650, 100, 20), 2, 1, System.Drawing.Color.Transparent);
// Create link for Second document
// We have used new PdfFileInfo("d:/pdftest/Input1.pdf").NumberOfPages + 2 as PdfFileInfo.NumberOfPages(..) returns the page count for first document
// And 2 is because, second document will start at Input1+1 and 1 for the page containing Table Of Contents.
contentEditor.CreateLocalLink(new System.Drawing.Rectangle(150, 620, 100, 20), new PdfFileInfo(dataDir + "Input1.pdf").NumberOfPages + 2, 1, System.Drawing.Color.Transparent);
// Save updated PDF
contentEditor.Save( dataDir + "Concatenated_Table_Of_Contents.pdf");
}
}
}
## دمج ملفات PDF في مجلد فئة [PdfFileEditor](https://reference.aspose.com/pdf/net/aspose.pdf.facades/pdffileeditor) في مساحة الأسماء Aspose.Pdf.Facades تقدم لك القدرة على دمج ملف PDF. يمكنك حتى قراءة جميع ملفات Pdf في مجلد معين أثناء وقت التشغيل ودمجها، دون حتى معرفة أسماء الملفات. ببساطة قم بتوفير مسار الدليل الذي يحتوي على مستندات PDF التي ترغب في دمجها. يرجى محاولة استخدام مقتطف الشيفرة C# التالي لتحقيق هذه الوظيفة من Aspose.PDF: ```csharp // المسار إلى دليل المستندات. string dataDir = RunExamples.GetDataDir_AsposePdfFacades_TechnicalArticles(); // استرجاع أسماء جميع ملفات Pdf في دليل معين string[] fileEntries = Directory.GetFiles(dataDir, "*.pdf"); // الحصول على التاريخ الحالي للنظام وتعيين تنسيقه string date = DateTime.Now.ToString("MM-dd-yyyy"); // الحصول على الوقت الحالي للنظام وتعيين تنسيقه string hoursSeconds = DateTime.Now.ToString("hh-mm"); // تعيين القيمة للمستند النهائي الناتج Pdf string masterFileName = date + "_" + hoursSeconds + "_out.pdf"; // إنشاء كائن PdfFileEditor Aspose.Pdf.Facades.PdfFileEditor pdfEditor = new PdfFileEditor(); // استدعاء طريقة Concatenate لكائن PdfFileEditor لدمج جميع الملفات المدخلة // في ملف إخراج واحد pdfEditor.Concatenate(fileEntries, dataDir + masterFileName);