Nano Hash - криптовалюты, майнинг, программирование

iTextSharp объединяет и сохраняет плагины

У меня есть PDF-файл с элементом управления плагином на одной странице. Мне нужно объединить его с другим PDF-файлом, но когда я это делаю, плагин перерисовывается как пустой прямоугольник. Есть ли способ объединить и сохранить управление надстройками? Если это важно, подключаемый модуль представляет собой элемент управления Dessault Systemes 3D Via Composer Player, установленный с http://www.3ds.com/products/3dvia/3dvia-composer/resource-center/

Код, который я использую, это простой писатель getinstance, contentbyte directcontent, getimportedpage, addtemplate. Ничего фантастического.

FileStream docStream = new FileStream(@"C:\Temp\Merged.pdf", FileMode.Create);
            Document newDocument = new Document(PageSize.A4.Rotate());
            PdfWriter pdfWriter = PdfWriter.GetInstance(newDocument, docStream);
        try
        {
            newDocument.Open();
            PdfContentByte pdfContentByte = pdfWriter.DirectContent;

            newDocument.NewPage();
            PdfReader mainPage = new PdfReader(@"C:\Temp\PageWithPlugin.pdf");
            PdfImportedPage importedPage1 = pdfWriter.GetImportedPage(mainPage, 1);
            pdfContentByte.AddTemplate(importedPage1, 0, 0);
            mainPage.Close();

            PdfReader smgPages = new PdfReader(@"C:\Temp\MorePages.pdf");
            for (int page = 1; page <= smgPage.NumberOfPages; page++)
            {
                newDocument.NewPage();
                PdfImportedPage importedPage = pdfWriter.GetImportedPage(smgPages, page);
                pdfContentByte.AddTemplate(importedPage, 0, 0);
            }
            smgPages.Close();

            }
        finally
        {
            docStream.Flush();
            if (newDocument != null)
                newDocument.Close();
            docStream.Close();
        }
19.07.2011

Ответы:


1

Попробуйте это.

List<byte[]> fileList = new List<byte[]>();

using (FileStream fileSteam = File.OpenRead((@"C:\Temp\PageWithPlugin.pdf")))
{
     Byte[] byteArray = new byte[fileSteam.Length];
     fileSteam.Read(byteArray, 0, byteArray.Length);

     fileList.Add(byteArray);
}

using (FileStream fileSteam = File.OpenRead((@"C:\Temp\MorePages.pdf")))
{
     Byte[] byteArray = new byte[fileSteam.Length];
     fileSteam.Read(byteArray, 0, byteArray.Length);

     fileList.Add(byteArray);
}

using(MemoryStream msOutput = new MemoryStream())
{
     PdfReader pdfFile = new PdfReader(fileList[0]);
     Document doc = new Document();
     PdfWriter pCopy = new PdfSmartCopy(doc, msOutput);

     doc.Open();

     for (int k = 0; k < fileList.Count; k++)
     {
         for (int i = 1; i < pdfFile.NumberOfPages + 1; i++)
         {
             pdfFile = new PdfReader(fileList[k]);
             ((PdfSmartCopy)pCopy).AddPage(pCopy.GetImportedPage(pdfFile, i));
             pCopy.FreeReader(pdfFile);
         }
     }

     pdfFile.Close();
     pCopy.Close();
     doc.Close();
     fileList.Clear();

     byte[] form = msOutput.ToArray();

     using (FileStream fileSteam = new FileStream(@"C:\Temp\Merged.pdf", FileMode.Create))
     {
          fileStream.Write(form, 0, form.Length);
     }
}
19.07.2011
  • Подойдет либо PdfCopy, либо PdfSmartCopy. PdfSmartCopy сравнивает все потоки, импортированные в PDF, чтобы убедиться в отсутствии дубликатов. Накладные расходы, но в некоторых случаях это может привести к гораздо меньшему размеру PDF-файлов. 20.07.2011
  • Это сработало отлично. Большое спасибо за своевременный ответ. 20.07.2011
  • Не для того, чтобы смотреть дареному коню в зубы, но... На случай, если кто-то еще воспользуется решением, есть небольшая проблема с циклом k. Количество страниц будет отличаться на один документ после нулевого, а pdfReader будет освобождаться и перечитываться для каждой страницы, что не обязательно. Я думаю, что это улучшение для этой части кода: 20.07.2011
  • Еще один вопрос... В MorePages.pdf есть главы. При открытии отдельно оглавление можно просмотреть, но не оглавление в Merged.pdf. Есть ли способ сохранить главы/оглавление при слиянии? 20.07.2011
  • @JeffLit Это хороший вопрос, я не знаком с тем, как главы обрабатываются в iTextSharp. Что касается ошибки, которую вы видите в цикле k, у меня не было с ней проблем. Цикл k выполняет итерацию по списку файлов, который представляет собой массив, начинающийся с 0, и когда он достигает последнего документа, цикл продолжается, снова повторяя k, который затем равен счетчику списка, и цикл завершается. Тем не менее, я попробую PdfReader и FeeReader, перемещенные за пределы цикла. Спасибо и удачи. 20.07.2011

  • 2

    Не для того, чтобы смотреть дареному коню в зубы, но... На случай, если кто-то еще воспользуется решением, есть небольшая проблема с циклом k. Количество страниц будет отличаться на один документ после нулевого, а pdfReader будет освобождаться и перечитываться для каждой страницы, что не обязательно. Я думаю, что это улучшение для этой части кода:

    using (MemoryStream msOutput = new MemoryStream())
                {
                    Document doc = new Document();
                    PdfWriter pCopy = new PdfCopy(doc, msOutput);
                    doc.Open();
                    for (int k = 0; k < fileList.Count; k++)
                    {
                        PdfReader pdfFile = new PdfReader(fileList[k]);                        
                        for (int i = 1; i < pdfFile.NumberOfPages + 1; i++)
                        {
                            ((PdfCopy)pCopy).AddPage(pCopy.GetImportedPage(pdfFile, i));
                        }
                        pCopy.FreeReader(pdfFile);
                        pdfFile.Close();
                    }
                    pCopy.Close();
                    doc.Close();
                    fileList.Clear();
    
    20.07.2011
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..