[英]Alter Links to Other PDF Documents
我們有大量的pdf文件,每個文件都有打開其他pdf文件的鏈接。 單擊鏈接時,它將在同一文件系統中打開其他pdf文檔。 問題是我們需要更改某些目錄的名稱,這將需要更改指向該目錄中pdf文檔的所有鏈接。 我們將手動執行此操作,但實際上有數千個鏈接需要更改。
我們試圖使用iTextSharp和PdfSharp來更改鏈接,但是很難找到正確的對象。 下面顯示了帶有兩個鏈接的示例pdf文件的內容。 您可以看到對象12是引用對象21的鏈接,而對象21使用對象20中的引用打開了一個新窗口。對象類型為Filespec的對象20包含鏈接的pdf的路徑Folder-Name / A.pdf。 第二個鏈接遵循相同的模式,但使用對象16、23和22。
12 0 obj<</Type/Annot/P 5 0 R/F 4/C[1 0 0]/Subtype/Link/A 21 0 R/M(D:20130710103035-07'00')/Border[0 0 0]/Rect[144 612 216 630]/NM(QVDTKWKAZGVAAGHJ)/BS 13 0 R>>
endobj
13 0 obj<</W 0/S/S/Type/Border>>
endobj
16 0 obj<</Type/Annot/P 5 0 R/F 4/C[1 0 0]/Subtype/Link/A 23 0 R/M(D:20130710103040-07'00')/Border[0 0 0]/Rect[126 594 216 612]/NM(WFAYQFGTTIESQOKW)/BS 17 0 R>>
endobj
17 0 obj<</W 0/S/S/Type/Border>>
endobj
20 0 obj<</Type/Filespec/F(Folder-Name/A.pdf)/UF(Folder-Name/A.pdf)/Desc()>>
endobj
21 0 obj<</S/GoToR/D[0/Fit]/NewWindow true/F 20 0 R>>
endobj
22 0 obj<</Type/Filespec/F(Folder-Name-2/B.pdf)/UF(Folder-Name-2/B.pdf)/Desc()>>
endobj
23 0 obj<</S/GoToR/D[0/Fit]/NewWindow true/F 22 0 R>>
endobj
我們如何使用iTextSharp或PdfSharp將“文件夾名稱”和“文件夾名稱-2”更改為其他任意文件夾路徑?
萬一有人在意,我可以使用Chris Haas在上面的第一條評論中鏈接的代碼,但對其進行了如下修改:
foreach (FileInfo file in files)
{
PdfReader reader = default(PdfReader);
bool linkReplaced = false;
//Setup some variables to be used later
reader = new PdfReader(file.FullName);
int pageCount = reader.NumberOfPages;
PdfDictionary pageDictionary = default(PdfDictionary);
PdfArray annots = default(PdfArray);
//Loop through each page
for (int i = 1; i <= pageCount; i++)
{
//Get the current page
pageDictionary = reader.GetPageN(i);
//Get all of the annotations for the current page
annots = pageDictionary.GetAsArray(PdfName.ANNOTS);
//Make sure we have something
if ((annots == null) || (annots.Length == 0))
continue;
foreach (PdfObject A in annots.ArrayList)
{
//Convert the itext-specific object as a generic PDF object
PdfDictionary AnnotationDictionary = (PdfDictionary)PdfReader.GetPdfObject(A);
//Make sure this annotation has a link
if (!AnnotationDictionary.Get(PdfName.SUBTYPE).Equals(PdfName.LINK))
continue;
//Make sure this annotation has an ACTION
if (AnnotationDictionary.Get(PdfName.A) == null)
continue;
string fValue = string.Empty;
string ufValue = string.Empty;
string uriValue = string.Empty;
PdfObject a = AnnotationDictionary.Get(PdfName.A);
if (a.IsDictionary())
{
//Get the ACTION for the current annotation
PdfDictionary AnnotationAction = (PdfDictionary)a;
//Test if it is a URI action
if (AnnotationAction.Get(PdfName.S).Equals(PdfName.URI))
{
uriValue = AnnotationAction.Get(PdfName.URI).ToString();
if ((uriValue.IndexOf(findValue, StringComparison.OrdinalIgnoreCase) > -1))
{
string uriValueReplace = Replace(uriValue, findValue, replaceValue, StringComparison.OrdinalIgnoreCase);
//Change the URI to something else
AnnotationAction.Put(PdfName.URI, new PdfString(uriValueReplace));
linkReplaced = true;
}
}
}
else if (a.IsIndirect())
{
// Get the indirect reference
PdfIndirectReference indirectRef = (PdfIndirectReference)a;
// Get the GoToR type object which is at the document level
PdfDictionary goToR = (PdfDictionary)reader.GetPdfObject(indirectRef.Number);
// Get the FileSpec object whic his at the document lelvel
PdfObject f = goToR.Get(PdfName.F);
if (f == null || !f.IsIndirect())
continue;
PdfObject fileSpecObject = reader.GetPdfObject(((PdfIndirectReference)goToR.Get(PdfName.F)).Number);
if (!fileSpecObject.IsDictionary())
continue;
PdfDictionary fileSpec = (PdfDictionary)fileSpecObject;
fValue = fileSpec.Get(PdfName.F).ToString();
ufValue = fileSpec.Get(PdfName.UF).ToString();
if ((fValue.IndexOf(findValue, StringComparison.OrdinalIgnoreCase) > -1) || (ufValue.IndexOf(findValue, StringComparison.OrdinalIgnoreCase) > -1))
{
string fValueReplace = Replace(fValue, findValue, replaceValue, StringComparison.OrdinalIgnoreCase);// fValue.Replace(findValue, replaceValue);
string ufValueReplace = Replace(fValue, findValue, replaceValue, StringComparison.OrdinalIgnoreCase);// ufValue.Replace(findValue, replaceValue);
// Update the references to the file
fileSpec.Put(PdfName.F, new PdfString(fValueReplace));
fileSpec.Put(PdfName.UF, new PdfString(ufValueReplace));
linkReplaced = true;
}
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.