kmcnet
kmcnet

Reputation: 115

Merging All Pdf Files in Directory Using iText

Hello everyone and thanks for your help in advance. I am trying to use iText to merge all Pdf files contained within a directory. Here is my code:

public class MergeFiles
{
    public MergeFiles(string targetDirectory) {
        string dest = targetDirectory +  @"\Merged.pdf";
        PdfDocument pdfDoc = new PdfDocument(new PdfWriter(dest));
        PdfMerger merger = new PdfMerger(pdfDoc);            

        string[] fileEntries = Directory.GetFiles(targetDirectory);
        foreach (string fileName in fileEntries) {                

            //PdfMerger merger = new PdfMerger(pdfDoc);
            PdfDocument newDoc = new PdfDocument(new PdfReader(fileName));
            merger.Merge(newDoc, 1, newDoc.GetNumberOfPages());

            newDoc.Close();                                

        };
        pdfDoc.Close();
    }
}

This code is resulting in the error "System.IO.IOException: The process cannot access the file 'E:\Merged.pdf' because it is being used by another process." however, I am not sure why. Any help would be appreciated.

Upvotes: 1

Views: 2845

Answers (1)

Alexey Subach
Alexey Subach

Reputation: 12312

After these two lines:

string dest = targetDirectory +  @"\Merged.pdf";
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(dest));

A new (empty) file with name "Merged.pdf" is created in your target directory, with file stream opened in writing mode to write the result of the merging process.

Then, you are getting the list of file in target directory with string[] fileEntries = Directory.GetFiles(targetDirectory);. This array already includes your newly created Merged.pdf file.

Eventually the code tries to merge the resultant file into itself, which obviously fails.

To avoid this error, either collect the files to merge before creating the target document (but make sure there is no existing "Merged.pdf" file in the target directory already):

string[] fileEntries = Directory.GetFiles(targetDirectory);

string dest = targetDirectory +  @"\Merged.pdf";
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(dest));

// The rest of the code

Or, simply remove the target file from fileEntries array manually before merging the files.

Upvotes: 5

Related Questions