itextSharp - объединение PDF-файлов отключает расширенные права чтения - PullRequest
2 голосов
/ 28 июня 2011

Я использую Itextsharp v5.1 и создал включенный PDF-файл для чтения.Я написал ac # класс, который заполняет форму и сохраняет каждый отдельный PDF-файл расширенным читателем.Но когда я использую эту функцию MergeFiles здесь, она создает новый читатель НЕ объединенный файл, а мне нужна ваша помощь с этим, чтобы превратить его в расширенный читатель ...

моя функция MergeFiles:

public static void MergeFiles(string destinationFile, string[] sourceFiles)
{
    try
    {
        //1:  Create the MemoryStream for the destination document.
        using (MemoryStream ms = new MemoryStream())
        {
            //2:  Create the PdfCopyFields object.
            PdfCopyFields copy = new PdfCopyFields(ms);
            // - Set the security and other settings for the destination file.
            //copy.Writer.SetEncryption(PdfWriter.STRENGTH128BITS, null, "1234", PdfWriter.AllowPrinting | PdfWriter.AllowCopy | PdfWriter.AllowFillIn);
            copy.Writer.ViewerPreferences = PdfWriter.PageModeUseOutlines;

            // - Create an arraylist to hold bookmarks for later use.
            ArrayList outlines = new ArrayList();
            int pageOffset = 0;
            int f = 0;
            //3:  Import the documents specified in args[1], args[2], etc...
            while (f < sourceFiles.Length)
            {
                //  Grab the file from args[] and open it with PdfReader.
                string file = sourceFiles[f];
                PdfReader reader = new PdfReader(file, PdfEncodings.ConvertToBytes("1234", null));
               // PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(newFile, FileMode.Create), '\0', true);

                //  Import the pages from the current file.
                copy.AddDocument(reader);

                //  Create an ArrayList of bookmarks in the file being imported.
                //      ArrayList bookmarkLst = SimpleBookmark.GetBookmark(reader);
                //  Shift the pages to accomidate any pages that were imported before the current document.
                //     SimpleBookmark.ShiftPageNumbers(bookmarkLst, pageOffset, null);
                //  Fill the outlines ArrayList with each bookmark as a HashTable.
                //      foreach (Hashtable ht in bookmarkLst)
                //      {
                //         outlines.Add(ht);
                //     }
                //  Set the page offset to the last page imported.
                pageOffset += reader.NumberOfPages;
                f++;
            }
            //4:  Put the outlines from all documents under a new "Root" outline and 
            //    set them for destination document 
            //   copy.Writer.Outlines = GetBookmarks("Root", ((Hashtable)outlines[0])["Page"], outlines);
            //5:  Close the PdfCopyFields object.
                copy.Close();
            //6:  Save the MemoryStream to a file.
                MemoryStreamToFile(ms, destinationFile);
        }
    }
    catch (System.Exception e)
    {
        Console.Error.WriteLine(e.Message);
        Console.Error.WriteLine(e.StackTrace);
        Console.ReadLine();
    }
}
#endregion


#region MemoryStreamToFile
/// <summary>
/// Saves a MemoryStream to the specified file name
/// </summary>
/// <param name="MS">MemoryStream to save</param>
/// <param name="FileName">File name to save MemoryStream as</param>
public static void MemoryStreamToFile(MemoryStream MS, string FileName)
{
    using (FileStream fs = new FileStream(@FileName, FileMode.Create))
    {
        byte[] data = MS.ToArray();
        fs.Write(data, 0, data.Length);
        fs.Close();
    }
}
#endregion

Ответы [ 2 ]

1 голос
/ 28 июня 2011

Чтобы сохранить существующие разрешения на чтение, вы должны использовать PdfStamper в режиме APPEND.

Есть также несколько вещей, которые вы не должны делать с таким PDF, или вы отключитев любом случае дополнительные разрешения ... Я считаю, что "добавить страницы" и "добавить аннотации / поля" находятся в списке вещей, которые вы не можете сделать.

1 голос
/ 28 июня 2011

Разрешения для чтения могут быть включены только продуктами Adobe.Они основаны на пользовательской цифровой подписи, которая становится недействительной при изменении файла.Сертификат для этой цифровой подписи является собственностью Adobe и не является общедоступным, также вычисление этой цифровой подписи не задокументировано.После объединения файлов вы не сможете повторно разрешить права доступа для чтения, если только вы не используете Acrobat для объединенного файла.

...