C#에서 PDF 문서 연결
개요
이 문서는 C#을 사용하여 서로 다른 PDF 파일을 하나의 PDF로 병합, 결합 또는 연결하는 방법을 설명합니다. 다음과 같은 주제를 다룹니다.
파일 경로를 사용하여 PDF 파일 연결
PdfFileEditor는 여러 PDF 파일을 연결할 수 있도록 하는 Aspose.Pdf.Facades 네임스페이스 내의 클래스입니다. 파일 스트림을 사용하여 파일을 연결할 수 있을 뿐만 아니라 메모리 스트림을 사용하여도 가능합니다. 이 문서에서는 메모리 스트림을 사용하여 파일을 연결하는 과정을 설명하고 코드 스니펫을 사용하여 이를 보여줍니다.
PdfFileEditor 클래스의 Concatenate 메소드는 두 개의 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"); |
MemoryStreams를 사용하여 여러 PDF 파일 연결
PdfFileEditor 클래스의 Concatenate 메서드는 소스 PDF 파일과 대상 PDF 파일을 매개변수로 사용합니다. 이러한 매개변수는 디스크에 있는 PDF 파일의 경로일 수도 있고 MemoryStreams일 수도 있습니다. 이제 이 예제에서는 먼저 두 개의 파일 스트림을 만들어 디스크에서 PDF 파일을 읽습니다. 그런 다음 이러한 파일을 바이트 배열로 변환합니다. PDF 파일의 이러한 바이트 배열은 MemoryStreams로 변환됩니다. PDF 파일에서 MemoryStreams를 얻으면 이를 연결 메서드로 전달하고 하나의 출력 파일로 병합할 수 있습니다.
다음 C# 코드 스니펫은 MemoryStreams를 사용하여 여러 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 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 파일을 연결하려면 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(); | |
// 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# 코드 스니펫을 사용해 보십시오.
PDF 양식 연결 및 필드 이름 고유 유지
PdfFileEditor 클래스는 Aspose.Pdf.Facades namespace에서 PDF 파일을 연결할 수 있는 기능을 제공합니다. 이제, 결합할 Pdf 파일들에 유사한 필드 이름을 가진 양식 필드가 있는 경우, Aspose.PDF는 결과 Pdf 파일에서 필드를 고유하게 유지할 수 있는 기능을 제공합니다. 또한, 필드 이름을 고유하게 만들기 위해 접미사를 지정할 수도 있습니다. PdfFileEditor의 KeepFieldsUnique 속성을 true로 설정하면 Pdf 양식이 결합될 때 필드 이름이 고유해집니다. 또한, PdfFileEditor의 UniqueSuffix 속성을 사용하여 결합 시 필드 이름에 추가되어 고유하게 만드는 사용자 정의 형식의 접미사를 지정할 수 있습니다. 이 문자열은 결과 파일에서 숫자로 대체될 %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 }; |
로컬 링크 생성
이제 연결된 파일 내부의 페이지로 향하는 링크를 추가해야 합니다. 이 요구 사항을 충족하기 위해, PdfContentEditor 클래스의 CreateLocalLink(..)
메서드를 사용할 수 있습니다. 다음 코드 스니펫에서는 링크 주위의 사각형이 보이지 않도록 하기 위해 네 번째 인수로 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(); | |
// 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"); | |
} | |
} | |
} |
폴더 내 PDF 파일 연결
Aspose.Pdf.Facades 네임스페이스의 PdfFileEditor 클래스는 PDF 파일을 연결할 수 있는 기능을 제공합니다. 실행 시 특정 폴더에 있는 모든 PDF 파일을 읽고 파일 이름을 알지 못하더라도 연결할 수 있습니다. 연결하고자 하는 PDF 문서를 포함하는 디렉토리의 경로를 제공하기만 하면 됩니다.
다음 C# 코드 조각을 사용하여 Aspose.PDF의 이 기능을 구현해 보십시오:
// 문서 디렉토리의 경로.
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();
// PdfFileEditor 객체의 Concatenate 메서드를 호출하여 모든 입력 파일을
// 단일 출력 파일로 연결합니다.
pdfEditor.Concatenate(fileEntries, dataDir + masterFileName);