Удаление ссылок из PDF с помощью iSharpText, не все ссылки удалены - PullRequest
5 голосов
/ 31 мая 2019

Из того, что я нашел в Интернете и прочитал в других похожих вопросах, способ удалять ссылки, чтобы не записывать их в аннотации, в основном заменяет аннотации, содержащие ссылки, на пустую аннотацию. Это работает в некоторой степени, но не удаляет все ссылки.

Кажется, я могу выписать все ссылки на TXT-файл, но не могу их удалить. Ниже приведен мой код, я просто читаю .pdf в байтах, а затем записываю обратно в файл из возвращенных байтов для целей тестирования.

Как мне удалить или отключить все гиперссылки, почтовые ссылки и т. Д., Даже если пользователь, обращающийся к PDF, использует программу чтения PDF, для которой для параметра «Создать ссылки из URL» задано значение true?

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

Я также открыт для использования других PDF SDK, таких как ActivePDFToolkit или Aspose PDF.

Если vb.net не ваша вещь, я могу преобразовать это в C #.

  Public Function RemoveHyperLinks(bytes As Byte()) As Byte()
            Dim reader As PdfReader = New PdfReader(bytes)
            Try
                Dim pageCount As Integer = reader.NumberOfPages
                For i As Integer = 1 To pageCount
                    Try
                        Dim pageDictionary As PdfDictionary = reader.GetPageN(i)
                        Dim annots As PdfArray = pageDictionary.GetAsArray(PdfName.ANNOTS)
                        Dim newAnnots As New PdfArray()
                        If annots IsNot Nothing AndAlso annots.Length > 0 AndAlso annots.ArrayList.Count > 0 Then
                            If Not ContainsHyperLinks(annots) Then
                                reader.Dispose()
                                Return bytes
                            End If
                            For Each a As PdfObject In annots.ArrayList
                                Dim annotDict As PdfDictionary = CType(PdfReader.GetPdfObject(a), PdfDictionary)
                                If annotDict.Get(PdfName.SUBTYPE) IsNot Nothing AndAlso Not annotDict.Get(PdfName.SUBTYPE).Equals(PdfName.LINK) Then
                                    newAnnots.Add(annotDict)
                                End If
                            Next
                            pageDictionary.Put(PdfName.ANNOTS, newAnnots)
                        End If
                    Catch ex As Exception
                        Return bytes
                    End Try
                Next
            Catch ex As Exception
            End Try

            Using ms As New MemoryStream()
                Using Doc As New iTextSharp.text.Document()
                    Using writer As New PdfCopy(Doc, ms)
                        Doc.Open()
                        Dim i As Integer = 1
                        While i <= reader.NumberOfPages
                            writer.AddPage(writer.GetImportedPage(reader, i))
                            System.Math.Max(System.Threading.Interlocked.Increment(i), i - 1)
                        End While
                        Doc.Close()
                    End Using
                End Using
                reader.Dispose()
                Return ms.ToArray()
            End Using
            Return bytes
        End Function

        Private Function ContainsHyperLinks(list As PdfArray) As Boolean
            Dim t As Boolean
            Try
                For Each a As PdfObject In list.ArrayList
                    Dim annotDict As PdfDictionary = CType(PdfReader.GetPdfObject(a), PdfDictionary)

                    If annotDict.Get(PdfName.SUBTYPE).Equals(PdfName.LINK) OrElse annotDict.Get(PdfName.A) IsNot Nothing Then
                        Dim annotAction As PdfDictionary = annotDict.GetAsDict(PdfName.A)
                        If annotAction.Get(PdfName.S).Equals(PdfName.URI) Then
                            Dim uriLink As PdfString = annotAction.GetAsString(PdfName.URI)
                            If annotAction.GetAsString(PdfName.URI) IsNot Nothing Then
                                File.AppendAllText("C:\pdfTests\links.txt", uriLink.ToString & " " & vbNewLine)
                                t = True
                            End If
                        End If
                        If annotAction.Get(PdfName.S).Equals(PdfName.URL) Then
                            Dim urlLink As PdfString = annotAction.GetAsString(PdfName.URL)
                            If annotAction.GetAsString(PdfName.URL) IsNot Nothing Then
                                File.AppendAllText("C:\pdfTests\links.txt", urlLink.ToString & " " & vbNewLine)
                                t = True
                            End If
                        End If
                        If annotAction.Get(PdfName.S).Equals(PdfName.GOTOR) Then
                            Dim gotorLink As PdfString = annotAction.GetAsString(PdfName.GOTOR)
                            If annotAction.GetAsString(PdfName.GOTOR) IsNot Nothing Then
                                File.AppendAllText("C:\pdfTests\links.txt", gotorLink.ToString & " " & vbNewLine)
                                t = True
                            End If
                        End If
                        If annotAction.Get(PdfName.S).Equals(PdfName.GOTOE) Then
                            Dim gotoeLink As PdfString = annotAction.GetAsString(PdfName.GOTOE)
                            If annotAction.GetAsString(PdfName.GOTOE) IsNot Nothing Then
                                File.AppendAllText("C:\pdfTests\links.txt", gotoeLink.ToString & " " & vbNewLine)
                                t = True
                            End If
                        End If
                        If annotAction.Get(PdfName.S).Equals(PdfName.GOTO) Then
                            Dim gotoLink As PdfString = annotAction.GetAsString(PdfName.GOTO)
                            If annotAction.GetAsString(PdfName.GOTO) IsNot Nothing Then
                                File.AppendAllText("C:\pdfTests\links.txt", gotoLink.ToString & " " & vbNewLine)
                                t = True
                            End If
                        End If
                        If annotAction.Get(PdfName.S).Equals(PdfName.JAVASCRIPT) Then
                            Dim js As PdfString = annotAction.GetAsString(PdfName.JAVASCRIPT)
                            If annotAction.GetAsString(PdfName.JAVASCRIPT) IsNot Nothing Then
                                File.AppendAllText("C:\pdfTests\links.txt", js.ToString & " " & vbNewLine)
                                t = True
                            End If
                        End If
                    End If
                Next
            Catch ex As Exception
                File.AppendAllText("C:\pdfTests\errors.txt", ex.ToString)
            Return False
        End Try
        Return t
    End Function

C #:

public byte[] RemoveHyperLinks(byte[] bytes)
    {
        PdfReader reader = new PdfReader(bytes);
        try
        {
            int pageCount = reader.NumberOfPages;
            for (int i = 1; i <= pageCount; i++)
            {
                try
                {
                    PdfDictionary pageDictionary = reader.GetPageN(i);
                    PdfArray annots = pageDictionary.GetAsArray(PdfName.ANNOTS);
                    PdfArray newAnnots = new PdfArray();
                    if (annots != null && annots.Length > 0 && annots.ArrayList.Count > 0)
                    {
                        if (!ContainsHyperLinks(annots))
                        {
                            reader.Dispose();
                            return bytes;
                        }
                        foreach (PdfObject a in annots.ArrayList)
                        {
                            PdfDictionary annotDict = (PdfDictionary)PdfReader.GetPdfObject(a);
                            if (annotDict.Get(PdfName.SUBTYPE) != null && !annotDict.Get(PdfName.SUBTYPE).Equals(PdfName.LINK))
                            {
                                newAnnots.Add(annotDict);
                            }
                        }
                        pageDictionary.Put(PdfName.ANNOTS, newAnnots);
                    }
                }
                catch (Exception ex)
                {
                    return bytes;
                }
            }
        }
        catch (Exception ex) { }

        using (MemoryStream ms = new MemoryStream())
        {
            using (iTextSharp.text.Document Doc = new iTextSharp.text.Document())
            {
                using (PdfCopy writer = new PdfCopy(Doc, ms))
                {
                    Doc.Open();
                    int i = 1;
                    while (i <= reader.NumberOfPages)
                    {
                        writer.AddPage(writer.GetImportedPage(reader, i));
                        System.Math.Max(System.Threading.Interlocked.Increment(ref i), i - 1);
                    }
                    Doc.Close();
                }
            }
            reader.Dispose();
            return ms.ToArray();
        }
        return bytes;
    }

    private bool ContainsHyperLinks(PdfArray list)
    {
        bool t = false;
        try
        {
            foreach (PdfObject a in list.ArrayList)
            {
                PdfDictionary annotDict = (PdfDictionary)PdfReader.GetPdfObject(a);

                if (annotDict.Get(PdfName.SUBTYPE).Equals(PdfName.LINK) || annotDict.Get(PdfName.A) != null)
                {
                    PdfDictionary annotAction = annotDict.GetAsDict(PdfName.A);
                    if (annotAction.Get(PdfName.S).Equals(PdfName.URI))
                    {
                        PdfString uriLink = annotAction.GetAsString(PdfName.URI);
                        if (annotAction.GetAsString(PdfName.URI) != null)
                        {
                            File.AppendAllText("C:\\pdfTests\\links.txt", uriLink.ToString() + " " + Environment.NewLine);
                            t = true;
                        }
                    }
                    if (annotAction.Get(PdfName.S).Equals(PdfName.URL))
                    {
                        PdfString urlLink = annotAction.GetAsString(PdfName.URL);
                        if (annotAction.GetAsString(PdfName.URL) != null)
                        {
                            File.AppendAllText("C:\\pdfTests\\links.txt", urlLink.ToString() + " " + Environment.NewLine);
                            t = true;
                        }
                    }
                    if (annotAction.Get(PdfName.S).Equals(PdfName.GOTOR))
                    {
                        PdfString gotorLink = annotAction.GetAsString(PdfName.GOTOR);
                        if (annotAction.GetAsString(PdfName.GOTOR) != null)
                        {
                            File.AppendAllText("C:\\pdfTests\\links.txt", gotorLink.ToString() + " " + Environment.NewLine);
                            t = true;
                        }
                    }
                    if (annotAction.Get(PdfName.S).Equals(PdfName.GOTOE))
                    {
                        PdfString gotoeLink = annotAction.GetAsString(PdfName.GOTOE);
                        if (annotAction.GetAsString(PdfName.GOTOE) != null)
                        {
                            File.AppendAllText("C:\\pdfTests\\links.txt", gotoeLink.ToString() + " " + Environment.NewLine);
                            t = true;
                        }
                    }
                    if (annotAction.Get(PdfName.S).Equals(PdfName.GOTO))
                    {
                        PdfString gotoLink = annotAction.GetAsString(PdfName.GOTO);
                        if (annotAction.GetAsString(PdfName.GOTO) != null)
                        {
                            File.AppendAllText("C:\\pdfTests\\links.txt", gotoLink.ToString() + " " + Environment.NewLine);
                            t = true;
                        }
                    }
                    if (annotAction.Get(PdfName.S).Equals(PdfName.JAVASCRIPT))
                    {
                        PdfString js = annotAction.GetAsString(PdfName.JAVASCRIPT);
                        if (annotAction.GetAsString(PdfName.JAVASCRIPT) != null)
                        {
                            File.AppendAllText("C:\\pdfTests\\links.txt", js.ToString() + " " + Environment.NewLine);
                            t = true;
                        }
                    }
                }
            }
        }
        catch (Exception ex)
        {
            File.AppendAllText("C:\\pdfTests\\errors.txt", ex.ToString());
            return false;
        }
        return t;
    }
...