#c# #pdf #itext #itext7
#c# #PDF #itext #itext7
Вопрос:
У меня есть существующий PDF-файл, в котором есть ссылки на внешние PDF-файлы. Я хочу отредактировать эти ссылки, чтобы они указывали на страницы в том же документе PDF. Эта функциональность ранее работала с iTextSharp, теперь я перехожу на iText7, но не могу заставить ее работать.
Ниже приведен пример кода, который я пробовал и чувствую, что он очень близок к решению, но чего-то не хватает. Этот код в основном загружает PDF с 2 страницами. На первой странице около 15 ссылок, указывающих на внешний файл. Я пытаюсь отредактировать ссылки так, чтобы они переводили пользователя на страницу 2 того же документа. Я могу загружать все ссылки и запрашивать их значения, но их изменение не происходит.
private bool MakeLinksInternal(string inputFile)
{
if (Path.GetExtension(inputFile).ToLower() != ".pdf")
return false;
using (PdfDocument pdfDocument = new PdfDocument(new PdfReader(inputFile)))
{
//get the index page
PdfPage pdfPage = pdfDocument.GetPage(1);
//get all of the link annotations for the current page
var annots = pdfPage.GetAnnotations().Where(a => a.GetSubtype().Equals(PdfName.Link));
//Make sure we have something
if ((annots == null) || (annots.Count() == 0))
return true;
foreach (PdfLinkAnnotation linkAnnotation in annots)
{
//get action associated to the annotation
var action = linkAnnotation.GetAction();
if (action == null)
continue;
// Test if it is a URI action
if (action.Get(PdfName.S).Equals(PdfName.URI)
|| action.Get(PdfName.S).Equals(PdfName.GoToR))
{
action.Remove(PdfName.S);
action.Put(PdfName.S, PdfName.GoTo);
var newLocalDestination = new PdfArray();
newLocalDestination.Add(pdfDocument.GetPage(2).GetPdfObject());
newLocalDestination.Add(PdfName.Fit);
action.Put(PdfName.D, newLocalDestination);
}
}
pdfDocument.Close();
}
return true;
}
Это мой первый вопрос в stackoverflow, поэтому, пожалуйста, будьте добры, если я допустил какие-либо ошибки при создании этого сообщения.
Комментарии:
1. Я видел, что могу создать PdfAction, используя
PdfAction.CreateGoTo(PdfDestination.MakeDestination(pdfDocument.GetPage(2).GetPdfObject()));
, но не смог понять, как прикрепить его к аннотации ссылки
Ответ №1:
Вы создаете PdfDocument
подобное
using (PdfDocument pdfDocument = new PdfDocument(new PdfReader(inputFile)))
Это создает PdfDocument
только для чтения. Если вы хотите также записать изменения, которые вы применяете, вы должны использовать
using (PdfDocument pdfDocument = new PdfDocument(new PdfReader(inputFile), new PdfWriter(outputFile)))
Вы должны использовать разные имена для inputFile
и outputFile
.