Объединение файлов PDF

#pdf #itext

#PDF #itext

Вопрос:

Возможно ли объединить заполняемый PDF-файл с обычным PDF-файлом в asp.net C # с использованием itextsharp. Буду признателен за любую помощь.

Ответ №1:

Мне потребовалось много времени, чтобы разобраться в этом, но вот рабочий пример:

 public static void MergeFiles(string destinationFile, string[] sourceFiles)
    {
        try 
        {
            int f = 0;
            String outFile = destinationFile;
            Document document = null;
            PdfCopy  writer = null;
            while (f < sourceFiles.Length) {
                // Create a reader for a certain document
                PdfReader reader = new PdfReader(sourceFiles[f]);

                // Retrieve the total number of pages
                int n = reader.NumberOfPages;
                //Trace.WriteLine("There are "   n   " pages in "   sourceFiles[f]);
                if (f == 0) 
                {
                    // Step 1: Creation of a document-object
                    document = new Document(reader.GetPageSizeWithRotation(1));
                    // Step 2: Create a writer that listens to the document
                    writer = new PdfCopy(document, new FileStream(outFile, FileMode.Create));
                    // Step 3: Open the document
                    document.Open();
                }
                // Step 4: Add content
                PdfImportedPage page;
                for (int i = 0; i < n; ) 
                {
                      i;
                    page = writer.GetImportedPage(reader, i);
                    writer.AddPage(page);
                }
                PRAcroForm form = reader.AcroForm;
                if (form != null)
                    writer.CopyAcroForm(reader);
                f  ;
            }
            // Step 5: Close the document
            document.Close();
        }
        catch(Exception) 
        {
            //handle exception
        }
    }
  

Надеюсь, это поможет!

Источник: http://www.ujihara.jp/iTextdotNET/examples/concat_pdf.java

Комментарии:

1. Сработало как по волшебству, большое спасибо! (Я тоже поддержал ответ)

Ответ №2:

Да.

PdfCopyFields звучит примерно так. Таким образом, даже если ваш «обычный PDF-файл» содержит аннотации любого рода (ссылки, flash, что угодно), они все равно будут работать нормально.

В качестве альтернативы вы могли бы открыть форму с помощью PdfStamper и добавить PDF-импортированные страницы из «обычного» PDF. Это позволило бы сохранить все об исходном PDF (метаданные, структуру, скрипты на уровне документа и т.д.) И удалить страницы (без всего, что не было содержимым страницы) из «обычного pdf».

К сожалению, здесь нет идеального ответа, но есть по крайней мере два жизнеспособных варианта на выбор.

Ответ №3:

Вы можете использовать PdfCopyFields для объединения любых сложных заполняемых PDF-форм. Он поддерживает все стили, поля формы и функциональные возможности pdf, просто попробуйте этот код..

 PdfReader readerfile1 = new PdfReader("File1");
PdfReader readerfile2 = new PdfReader("File2");


    PdfCopyFields copyfile =
    new PdfCopyFields(new FileStream("OutputFilewithFullPath", FileMode.Create));
    copyfile.AddDocument(readerfile1);
    copyfile.AddDocument(readerfile2);
    copyfile.Close();
  

В результате будет создан новый файл, который вы указали, и это будет полная заполняемая форма.

Ответ №4:

Я понимаю, что это довольно старая тема, однако у меня была похожая проблема, и вот более чистое решение

 public string GetMergedPdfPath(List<KeyValuePair<AccountHolder, string>> filePaths, string outputFilename)
{

string directory = ApplicationDeployment.IsNetworkDeployed ? ApplicationDeployment.CurrentDeployment.DataDirectory : NoticeConstants.Paths.TestDirectory;
string outputFilepath = directory   "\"   outputFilename;

Document outputDocument = null;
PdfCopy outputCopier = null;

try
{
   using (outputDocument = new Document())
   {
       using (FileStream fs = new FileStream(outputFilepath, FileMode.Create))
       {
            using (outputCopier = new PdfCopy(outputDocument, fs))
            {
                outputDocument.Open();

                for (int i = 0; i < filePaths.Count; i  )
                {
                    if (string.IsNullOrEmpty(filePaths[i].Value))
                    {
                        continue;
                    }

                    using (PdfReader reader = new PdfReader(filePaths[i].Value))
                    {
                        NoticeUtil.GetPdfPages(reader, ref outputCopier);
                    }
                }

                outputDocument.Close();
            }
        }
    }

      return outputFilepath;
  }
  catch (Exception ex)
  {
      Log.Error(ex.Message, ex);

      return string.Empty;
  }

}

    private static List<PdfImportedPage> GetPdfPages(PdfReader reader, ref PdfCopy outputCopier)
    {
        List<PdfImportedPage> pages = new List<PdfImportedPage>();

        try
        {
            for (int p = 1; p <= reader.NumberOfPages; p  )
            {
                outputCopier.AddPage(outputCopier.GetImportedPage(reader, p));
            }
        }
        catch (Exception ex)
        {
            Log.Error(ex.Message, ex);
        }

        return pages;
    }