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.
// 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(); | |
// 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(new FileStream(dataDir + "Concatenated_Table_Of_Contents.pdf", FileMode.Open)); | |
// Create link for first document | |
contentEditor.CreateLocalLink(new System.Drawing.Rectangle(150, 650, 100, 20), 2, 1, System.Drawing.Color.Transparent); |
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);