Menggabungkan Dokumen PDF di C#

Ikhtisar

Artikel ini menjelaskan cara menggabungkan, mengkombinasikan, atau menyatukan berbagai file PDF menjadi satu PDF menggunakan C#. Ini mencakup topik-topik seperti

Gabungkan file PDF menggunakan jalur file

PdfFileEditor adalah kelas dalam Aspose.Pdf.Facades namespace yang memungkinkan Anda untuk menggabungkan beberapa file PDF. Anda tidak hanya dapat menggabungkan file menggunakan FileStreams tetapi juga menggunakan MemoryStreams. Dalam artikel ini, proses penggabungan file menggunakan MemoryStreams akan dijelaskan dan kemudian ditunjukkan menggunakan cuplikan kode.

Metode Concatenate dari kelas PdfFileEditor dapat digunakan untuk menggabungkan dua file PDF. Metode Concatenate memungkinkan Anda untuk memasukkan tiga parameter: PDF input pertama, PDF input kedua, dan PDF output. PDF output akhir berisi kedua file PDF input.

Cuplikan kode C# berikut menunjukkan cara menggabungkan file PDF menggunakan jalur file.

// 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");

Dalam beberapa kasus, ketika ada banyak outline, pengguna dapat menonaktifkannya dengan mengatur CopyOutlines ke false dan meningkatkan kinerja penggabungan.

// 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");

Menggabungkan beberapa file PDF menggunakan MemoryStreams

Metode Concatenate dari kelas PdfFileEditor mengambil file PDF sumber dan file PDF tujuan sebagai parameter. Parameter ini dapat berupa jalur ke file PDF di disk atau mereka bisa berupa MemoryStreams. Sekarang, untuk contoh ini, kita akan terlebih dahulu membuat dua aliran file untuk membaca file PDF dari disk. Kemudian kita akan mengonversi file-file ini menjadi array byte. Array byte dari file PDF ini akan diubah menjadi MemoryStreams. Setelah kita mendapatkan MemoryStreams dari file PDF, kita akan dapat meneruskannya ke metode penggabungan dan menggabungkannya menjadi satu file keluaran.

Cuplikan kode C# berikut menunjukkan cara menggabungkan beberapa file PDF menggunakan 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();

Menggabungkan Array File PDF Menggunakan Jalur File

Jika Anda ingin menggabungkan beberapa file PDF, Anda dapat menggunakan overload dari metode Concatenate, yang memungkinkan Anda untuk memasukkan array file PDF. Output akhir disimpan sebagai file gabungan yang dibuat dari semua file dalam array. Potongan kode C# berikut menunjukkan cara menggabungkan array file PDF menggunakan jalur file.

// 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");

Menggabungkan Array File PDF Menggunakan Streams

Menggabungkan array file PDF tidak terbatas hanya pada file yang berada di disk. Anda juga dapat menggabungkan array file PDF dari aliran. Jika Anda ingin menggabungkan beberapa file PDF, Anda dapat menggunakan overload yang sesuai dari metode Concatenate. Pertama, Anda perlu membuat array dari aliran input dan satu aliran untuk output PDF dan kemudian memanggil metode Concatenate. Output akan disimpan dalam aliran output. Potongan kode C# berikut menunjukkan cara menggabungkan array file PDF menggunakan aliran.

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

Menggabungkan semua file Pdf dalam folder tertentu

Anda bahkan dapat membaca semua file Pdf dalam folder tertentu saat runtime dan menggabungkannya, tanpa perlu mengetahui nama file. Berikan jalur direktori, yang berisi dokumen PDF, yang ingin Anda gabungkan.

Silakan coba gunakan potongan kode C# berikut untuk mencapai fungsi ini.

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

Menggabungkan Formulir PDF dan menjaga nama bidang tetap unik

Kelas PdfFileEditor dalam namespace Aspose.Pdf.Facades menawarkan kemampuan untuk menggabungkan file PDF. Sekarang, jika file Pdf yang akan digabungkan memiliki bidang formulir dengan nama bidang yang serupa, Aspose.PDF menyediakan fitur untuk menjaga agar bidang dalam file Pdf hasil tetap unik dan Anda juga dapat menentukan akhiran untuk membuat nama bidang unik. Properti KeepFieldsUnique dari PdfFileEditor sebagai true akan membuat nama bidang unik ketika formulir Pdf digabungkan. Juga, properti UniqueSuffix dari PdfFileEditor dapat digunakan untuk menentukan format akhiran yang ditentukan pengguna yang ditambahkan ke nama bidang untuk membuatnya unik ketika formulir digabungkan. String ini harus mengandung substring %NUM% yang akan diganti dengan angka dalam file hasil.

Silakan lihat cuplikan kode sederhana berikut untuk mencapai fungsionalitas ini.

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

Menggabungkan file PDF dan membuat Daftar Isi

Menggabungkan file PDF

Silakan lihat potongan kode berikut untuk informasi tentang cara menggabungkan file 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));

Menyisipkan halaman kosong

Setelah file PDF digabungkan, kita dapat menyisipkan halaman kosong di awal dokumen di mana kita dapat membuat Daftar Isi. Untuk memenuhi persyaratan ini, kita dapat memuat file yang digabungkan ke dalam objek Document dan kita perlu memanggil metode Page.Insert(…) untuk menyisipkan halaman kosong.

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

Menambahkan Stempel Teks

Untuk membuat Daftar Isi, kita perlu menambahkan stempel teks pada halaman pertama menggunakan objek PdfFileStamp dan Stamp. Stamp class menyediakan metode BindLogo(...) untuk menambahkan FormattedText dan kita juga dapat menentukan lokasi untuk menambahkan stempel teks ini menggunakan metode SetOrigin(..). Dalam artikel ini, kita menggabungkan dua file PDF, jadi kita perlu membuat dua objek stempel teks yang mengarah ke dokumen individual ini.

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

Buat tautan lokal

Sekarang kita perlu menambahkan tautan ke halaman di dalam file yang digabungkan. Untuk memenuhi persyaratan ini, kita dapat menggunakan metode CreateLocalLink(..) dari kelas PdfContentEditor. Dalam cuplikan kode berikut, kami telah mengirimkan Transparent sebagai argumen ke-4 sehingga persegi panjang di sekitar tautan tidak terlihat.

Complete code

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

Menggabungkan file PDF dalam folder

Kelas PdfFileEditor dalam namespace Aspose.Pdf.Facades menawarkan kemampuan untuk menggabungkan file PDF. Anda bahkan dapat membaca semua file Pdf dalam folder tertentu pada waktu proses dan menggabungkannya, tanpa harus mengetahui nama file. Cukup berikan jalur direktori yang berisi dokumen PDF yang ingin Anda gabungkan.

Silakan coba gunakan potongan kode C# berikut untuk mencapai fungsi ini dari Aspose.PDF:

// Jalur ke direktori dokumen.
string dataDir = RunExamples.GetDataDir_AsposePdfFacades_TechnicalArticles();

// Ambil nama semua file Pdf dalam Direktori tertentu
string[] fileEntries = Directory.GetFiles(dataDir, "*.pdf");

// Dapatkan tanggal Sistem saat ini dan atur formatnya
string date = DateTime.Now.ToString("MM-dd-yyyy");
// Dapatkan waktu Sistem saat ini dan atur formatnya
string hoursSeconds = DateTime.Now.ToString("hh-mm");
// Tetapkan nilai untuk dokumen Pdf Hasil Akhir
string masterFileName = date + "_" + hoursSeconds + "_out.pdf";

// Instansiasi objek PdfFileEditor
Aspose.Pdf.Facades.PdfFileEditor pdfEditor = new PdfFileEditor();

// Panggil metode Concatenate dari objek PdfFileEditor untuk menggabungkan semua file input
// Menjadi satu file output
pdfEditor.Concatenate(fileEntries, dataDir + masterFileName);