Concatenar documentos PDF em C#
Visão Geral
Este artigo explica como mesclar, combinar ou concatenar diferentes arquivos PDF em um único PDF usando C#. Ele cobre tópicos como:
Concatenar arquivos PDF usando caminhos de arquivos
PdfFileEditor é a classe no namespace Aspose.Pdf.Facades que permite concatenar múltiplos arquivos PDF. Você pode não apenas concatenar arquivos usando FileStreams, mas também usando MemoryStreams. Neste artigo, o processo de concatenação dos arquivos usando MemoryStreams será explicado e, em seguida, mostrado usando o trecho de código.
O método Concatenate da classe PdfFileEditor pode ser usado para concatenar dois arquivos PDF. O método Concatenate permite que você passe três parâmetros: primeiro PDF de entrada, segundo PDF de entrada e PDF de saída. O PDF de saída final contém ambos os arquivos PDF de entrada.
O trecho de código C# a seguir mostra como concatenar arquivos PDF usando caminhos de arquivo.
// 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"); |
Em alguns casos, quando há muitos contornos, os usuários podem desativá-los configurando CopyOutlines para false e melhorar o desempenho da concatenação.
// 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"); |
Concatenar vários arquivos PDF usando MemoryStreams
O método Concatenate da classe PdfFileEditor leva os arquivos PDF de origem e o arquivo PDF de destino como parâmetros. Esses parâmetros podem ser caminhos para os arquivos PDF no disco ou podem ser MemoryStreams. Agora, para este exemplo, primeiro criaremos dois fluxos de arquivos para ler os arquivos PDF do disco. Em seguida, converteremos esses arquivos em arrays de bytes. Esses arrays de bytes dos arquivos PDF serão convertidos em MemoryStreams. Uma vez que obtemos os MemoryStreams dos arquivos PDF, seremos capazes de passá-los para o método de concatenação e mesclar em um único arquivo de saída.
O snippet de código C# a seguir mostra como concatenar vários arquivos PDF usando 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(); |
Concatenar Array de Arquivos PDF Usando Caminhos de Arquivo
Se você deseja concatenar vários arquivos PDF, pode usar a sobrecarga do método Concatenate, que permite passar um array de arquivos PDF. O resultado final é salvo como um arquivo mesclado criado a partir de todos os arquivos no array. O seguinte trecho de código C# mostra como concatenar um array de arquivos PDF usando caminhos de arquivo.
// 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"); |
Concatenar Array de Arquivos PDF Usando Streams
Concatenar um array de arquivos PDF não se limita apenas a arquivos que residem no disco. Você também pode concatenar um array de arquivos PDF a partir de fluxos. Se você quiser concatenar vários arquivos PDF, pode usar a sobrecarga apropriada do método Concatenate. Primeiro, você precisa criar um array de fluxos de entrada e um fluxo para o PDF de saída e, em seguida, chamar o método Concatenate. A saída será salva no fluxo de saída. O seguinte trecho de código C# mostra como concatenar um array de arquivos PDF usando fluxos.
// 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); |
Concatenando todos os arquivos Pdf em uma pasta específica
Você pode até mesmo ler todos os arquivos Pdf em uma pasta específica em tempo de execução e concatená-los, sem nem mesmo saber os nomes dos arquivos. Forneça simplesmente o caminho do diretório, que contém os documentos PDF, que você gostaria de concatenar.
Por favor, tente usar o seguinte trecho de código C# para alcançar essa funcionalidade.
// 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); |
Concatenar Formulários PDF e manter nomes de campos únicos
A classe PdfFileEditor no namespace Aspose.Pdf.Facades oferece a capacidade de concatenar os arquivos PDF. Agora, se os arquivos Pdf que devem ser concatenados tiverem campos de formulário com nomes de campo semelhantes, o Aspose.PDF fornece o recurso para manter os campos no arquivo Pdf resultante como únicos e também é possível especificar o sufixo para tornar os nomes dos campos únicos. A propriedade KeepFieldsUnique de PdfFileEditor como verdadeira fará com que os nomes dos campos sejam únicos quando os formulários Pdf forem concatenados. Além disso, a propriedade UniqueSuffix de PdfFileEditor pode ser usada para especificar o formato definido pelo usuário do sufixo que é adicionado ao nome do campo para torná-lo único quando os formulários são concatenados. Esta string deve conter a substring %NUM%
, que será substituída por números no arquivo resultante.
Veja o seguinte trecho de código simples para alcançar essa funcionalidade.
// 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); |
Concatenate PDF files and create Table Of Contents
Concatenate PDF files
Por favor, dê uma olhada no seguinte trecho de código para informações sobre como mesclar os arquivos 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)); |
Insert blank page
Uma vez que os arquivos PDF foram mesclados, podemos inserir uma página em branco no início do documento na qual podemos criar o Índice. Para realizar este requisito, podemos carregar o arquivo mesclado no objeto Document e precisamos chamar o método Page.Insert(…) para inserir uma página em branco.
// 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); |
Add Text Stamps
Para criar um Índice, precisamos adicionar selos de texto na primeira página usando os objetos PdfFileStamp e Stamp. Classe Stamp fornece o método BindLogo(...)
para adicionar FormattedText e também podemos especificar a localização para adicionar essas marcas de texto usando o método SetOrigin(..)
. Neste artigo, estamos concatenando dois arquivos PDF, então precisamos criar dois objetos de marca de texto apontando para esses documentos individuais.
// 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 }; |
Criar links locais
Agora precisamos adicionar links para as páginas dentro do arquivo concatenado. Para cumprir esse requisito, podemos usar o método CreateLocalLink(..)
da classe PdfContentEditor. No trecho de código a seguir, passamos Transparente como 4º argumento para que o retângulo ao redor do link não seja visível.
// 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); |
Código Completo
// 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"); | |
} | |
} | |
} |
Concatenar arquivos PDF na pasta
A classe PdfFileEditor no namespace Aspose.Pdf.Facades oferece a capacidade de concatenar o arquivo PDF. Você pode até mesmo ler todos os arquivos Pdf em uma pasta específica em tempo de execução e concatená-los, sem sequer saber os nomes dos arquivos. Basta fornecer o caminho do diretório, que contém os documentos PDF, que você gostaria de concatenar.
Por favor, tente usar o seguinte trecho de código C# para alcançar essa funcionalidade do Aspose.PDF:
// O caminho para o diretório dos documentos.
string dataDir = RunExamples.GetDataDir_AsposePdfFacades_TechnicalArticles();
// Recuperar nomes de todos os arquivos Pdf em um Diretório específico
string[] fileEntries = Directory.GetFiles(dataDir, "*.pdf");
// Obter a data atual do Sistema e definir seu formato
string date = DateTime.Now.ToString("MM-dd-yyyy");
// Obter a hora atual do Sistema e definir seu formato
string hoursSeconds = DateTime.Now.ToString("hh-mm");
// Definir o valor para o documento Pdf Resultante final
string masterFileName = date + "_" + hoursSeconds + "_out.pdf";
// Instanciar objeto PdfFileEditor
Aspose.Pdf.Facades.PdfFileEditor pdfEditor = new PdfFileEditor();
// Chamar o método Concatenate do objeto PdfFileEditor para concatenar todos os arquivos de entrada
// Em um único arquivo de saída
pdfEditor.Concatenate(fileEntries, dataDir + masterFileName);