Добавьте закладки страницы в существующий PDF-файл, используя iTextSharp, используя код C#

Мое требование такое же, как описано в этом вопросе: добавить закладку на определенную страницу с помощью iTextSharp 4.1.6

Я попробовал ответ, но последняя строка выдает следующую ошибку:

Не может неявно конвертировать ArrayList в IList<Dictionar(strin,object)>

Я не уверен, как это исправить.

Строка, которая дала ошибку, находится в Ответе 1 вышеупомянутой ссылки

wri.Outlines = bookmarks

Я изменил пример следующим образом:

List<Dictionary<string, object>> testData = new List<Dictionary<string, object>>(100);
// Just Sample data for understanding.
//for (int i = 0; i < 100; i++)
//{
var test = new Dictionary<string, object>
{
    { "Action", "GoTo"},
    { "Title", "Page1 0 H 0" },
    {"Page", "1 XYZ 0 " + h + " 0" }
};
testData.Add(test);
//}
wri.Outlines = testData;

Теперь после добавления закладок я не могу открыть PDF, потому что файл был поврежден.

2 ответа

Решение

Пожалуйста, обратитесь к официальной документации.

Закладки обсуждаются в главе 7, где вы найдете пример BookmarkedTimeTable. Поскольку вы работаете с iTextSharp (C#), а не с iText (Java), вам нужно поискать соответствующий пример в списке примеров, портированных на C#, а точнее BookmarkedTimeTable.cs.

Обновите после того, как вы обновили вопрос:

Ваша ошибка указывает на то, что testdata не совсем типа IList<Dictionar(string,object)>; обратите внимание, что я добавил g к strin, предполагая, что это опечатка в вашем вопросе, а не в вашем реальном коде.

Пожалуйста, начните с примера из моей книги, а затем постепенно меняйте этот пример, пока вы не нарушите этот код.

Обновление на основе дополнительного комментария:

Когда PDF имеет цифровую подпись, существует ограниченное количество операций, которые могут (или не могут) быть разрешены. См. Какие операции разрешены для PDF с цифровой подписью? Добавление закладок не является допустимой операцией, поэтому вам придется удалить все поля подписи перед применением изменения. В зависимости от того, хотите ли вы оставить пустое поле подписи или полностью удалить это поле, вы будете использовать любой из этих методов. clearSignatureField() или же removeField() передача имени поля подписи в качестве параметра. Вы можете получить ArrayList имен с использованием getSignatureNames() метод (см. ÀcroFields).

Попробуйте сделать его фактическим ArrayList из Hashtables:

            var outlines = firstComponentPages.Select(x => new Hashtable()
            {
                {"Title", x.Value},
                {"Action", "GoTo"},
                {"Page", $"{x.Key} Fit"}
            }).ToList();


            var outlinesArrayList = new ArrayList();
            foreach (var outline in outlines)
            {
                outlinesArrayList.Add(outline);
            }
            copy.Outlines = outlinesArrayList;
Другие вопросы по тегам