Из того, что я нашел в Интернете и прочитал в других похожих вопросах, способ удалять ссылки, чтобы не записывать их в аннотации, в основном заменяет аннотации, содержащие ссылки, на пустую аннотацию. Это работает в некоторой степени, но не удаляет все ссылки.
Кажется, я могу выписать все ссылки на 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;
}