Как мне изменить внешнюю ссылку в существующем PDF-файле таким образом, чтобы она указывала на внутреннюю страницу в документе, используя iText7 и C #?

#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 .