Добавьте закладки страницы в существующий 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;