如何使用带C#的iTextSharp编辑PDF文件中的命名目的地?

如何使用带C#的iTextSharp编辑PDF文件中的命名目的地?,c#,itextsharp,itext,C#,Itextsharp,Itext,在这里,我想使用C#with iTextSharp.dll编辑PDF文件中已经存在的命名目的地 这里我展示了PS脚本的示例 旧版: [/Dest /bmkaff1 /View [/FitR 59 516 435 504] /DEST pdfmark [/Dest /bmkaff1 /View [/XYZ 59 516 0] /DEST pdfmark string pdfFilePath = @"D:\Raja\Testing\AuthorQuery\xxx.pdf"; string dPD

在这里,我想使用C#with iTextSharp.dll编辑PDF文件中已经存在的命名目的地

这里我展示了PS脚本的示例

旧版:

[/Dest /bmkaff1 /View [/FitR 59 516 435 504] /DEST pdfmark
[/Dest /bmkaff1 /View [/XYZ 59 516 0] /DEST pdfmark
string pdfFilePath = @"D:\Raja\Testing\AuthorQuery\xxx.pdf";
string dPDFFile = @"D:\Raja\Testing\AuthorQuery\YYY.pdf";

PdfReader pdfR = new PdfReader(pdfFilePath);
Dictionary<object, PdfObject> nDest = new Dictionary<object, PdfObject>();

nDest = pdfR.GetNamedDestination();

List<object> nDesColl = new List<object>();

nDesColl.Clear();

foreach (KeyValuePair<object, PdfObject> sEntry in nDest)
{
    PdfArray pArr = (PdfArray)sEntry.Value;
    if(pArr.ArrayList.Count== 6)
    {
        if (pArr[1].ToString() == "/FitR")
        {
nDesColl.Add(sEntry.Key);
        }
    }
}

if (nDesColl.Count > 0)
{
    foreach (object keyVal in nDesColl)
    {
        PdfNumber pNo = new PdfNumber(0);
        PdfArray pArr = (PdfArray)nDest[keyVal];
        pArr[1] = PdfName.XYZ;
        pArr[4] = (PdfObject)pNo;
        pArr.ArrayList.RemoveAt(5);
        PdfObject fVal = (PdfObject)pArr;
        nDest[keyVal] = fVal;
    }
}

using (PdfStamper stamper = new PdfStamper(pdfR, new FileStream(dPDFFile, FileMode.Create)))
{
}
更新:

[/Dest /bmkaff1 /View [/FitR 59 516 435 504] /DEST pdfmark
[/Dest /bmkaff1 /View [/XYZ 59 516 0] /DEST pdfmark
string pdfFilePath = @"D:\Raja\Testing\AuthorQuery\xxx.pdf";
string dPDFFile = @"D:\Raja\Testing\AuthorQuery\YYY.pdf";

PdfReader pdfR = new PdfReader(pdfFilePath);
Dictionary<object, PdfObject> nDest = new Dictionary<object, PdfObject>();

nDest = pdfR.GetNamedDestination();

List<object> nDesColl = new List<object>();

nDesColl.Clear();

foreach (KeyValuePair<object, PdfObject> sEntry in nDest)
{
    PdfArray pArr = (PdfArray)sEntry.Value;
    if(pArr.ArrayList.Count== 6)
    {
        if (pArr[1].ToString() == "/FitR")
        {
nDesColl.Add(sEntry.Key);
        }
    }
}

if (nDesColl.Count > 0)
{
    foreach (object keyVal in nDesColl)
    {
        PdfNumber pNo = new PdfNumber(0);
        PdfArray pArr = (PdfArray)nDest[keyVal];
        pArr[1] = PdfName.XYZ;
        pArr[4] = (PdfObject)pNo;
        pArr.ArrayList.RemoveAt(5);
        PdfObject fVal = (PdfObject)pArr;
        nDest[keyVal] = fVal;
    }
}

using (PdfStamper stamper = new PdfStamper(pdfR, new FileStream(dPDFFile, FileMode.Create)))
{
}
PDF字典屏幕截图:

[/Dest /bmkaff1 /View [/FitR 59 516 435 504] /DEST pdfmark
[/Dest /bmkaff1 /View [/XYZ 59 516 0] /DEST pdfmark
string pdfFilePath = @"D:\Raja\Testing\AuthorQuery\xxx.pdf";
string dPDFFile = @"D:\Raja\Testing\AuthorQuery\YYY.pdf";

PdfReader pdfR = new PdfReader(pdfFilePath);
Dictionary<object, PdfObject> nDest = new Dictionary<object, PdfObject>();

nDest = pdfR.GetNamedDestination();

List<object> nDesColl = new List<object>();

nDesColl.Clear();

foreach (KeyValuePair<object, PdfObject> sEntry in nDest)
{
    PdfArray pArr = (PdfArray)sEntry.Value;
    if(pArr.ArrayList.Count== 6)
    {
        if (pArr[1].ToString() == "/FitR")
        {
nDesColl.Add(sEntry.Key);
        }
    }
}

if (nDesColl.Count > 0)
{
    foreach (object keyVal in nDesColl)
    {
        PdfNumber pNo = new PdfNumber(0);
        PdfArray pArr = (PdfArray)nDest[keyVal];
        pArr[1] = PdfName.XYZ;
        pArr[4] = (PdfObject)pNo;
        pArr.ArrayList.RemoveAt(5);
        PdfObject fVal = (PdfObject)pArr;
        nDest[keyVal] = fVal;
    }
}

using (PdfStamper stamper = new PdfStamper(pdfR, new FileStream(dPDFFile, FileMode.Create)))
{
}

原始PDF文件

更新的PDF文件

注意:

[/Dest /bmkaff1 /View [/FitR 59 516 435 504] /DEST pdfmark
[/Dest /bmkaff1 /View [/XYZ 59 516 0] /DEST pdfmark
string pdfFilePath = @"D:\Raja\Testing\AuthorQuery\xxx.pdf";
string dPDFFile = @"D:\Raja\Testing\AuthorQuery\YYY.pdf";

PdfReader pdfR = new PdfReader(pdfFilePath);
Dictionary<object, PdfObject> nDest = new Dictionary<object, PdfObject>();

nDest = pdfR.GetNamedDestination();

List<object> nDesColl = new List<object>();

nDesColl.Clear();

foreach (KeyValuePair<object, PdfObject> sEntry in nDest)
{
    PdfArray pArr = (PdfArray)sEntry.Value;
    if(pArr.ArrayList.Count== 6)
    {
        if (pArr[1].ToString() == "/FitR")
        {
nDesColl.Add(sEntry.Key);
        }
    }
}

if (nDesColl.Count > 0)
{
    foreach (object keyVal in nDesColl)
    {
        PdfNumber pNo = new PdfNumber(0);
        PdfArray pArr = (PdfArray)nDest[keyVal];
        pArr[1] = PdfName.XYZ;
        pArr[4] = (PdfObject)pNo;
        pArr.ArrayList.RemoveAt(5);
        PdfObject fVal = (PdfObject)pArr;
        nDest[keyVal] = fVal;
    }
}

using (PdfStamper stamper = new PdfStamper(pdfR, new FileStream(dPDFFile, FileMode.Create)))
{
}

更新的PDF文件是通过更新PS文件生成的

我得到了问题的解决方案

首先,我使用
GetNamedDestination()
方法读取命名的目标,然后检查条件,然后编辑命名的目标值

这里是我的C代码:

[/Dest /bmkaff1 /View [/FitR 59 516 435 504] /DEST pdfmark
[/Dest /bmkaff1 /View [/XYZ 59 516 0] /DEST pdfmark
string pdfFilePath = @"D:\Raja\Testing\AuthorQuery\xxx.pdf";
string dPDFFile = @"D:\Raja\Testing\AuthorQuery\YYY.pdf";

PdfReader pdfR = new PdfReader(pdfFilePath);
Dictionary<object, PdfObject> nDest = new Dictionary<object, PdfObject>();

nDest = pdfR.GetNamedDestination();

List<object> nDesColl = new List<object>();

nDesColl.Clear();

foreach (KeyValuePair<object, PdfObject> sEntry in nDest)
{
    PdfArray pArr = (PdfArray)sEntry.Value;
    if(pArr.ArrayList.Count== 6)
    {
        if (pArr[1].ToString() == "/FitR")
        {
nDesColl.Add(sEntry.Key);
        }
    }
}

if (nDesColl.Count > 0)
{
    foreach (object keyVal in nDesColl)
    {
        PdfNumber pNo = new PdfNumber(0);
        PdfArray pArr = (PdfArray)nDest[keyVal];
        pArr[1] = PdfName.XYZ;
        pArr[4] = (PdfObject)pNo;
        pArr.ArrayList.RemoveAt(5);
        PdfObject fVal = (PdfObject)pArr;
        nDest[keyVal] = fVal;
    }
}

using (PdfStamper stamper = new PdfStamper(pdfR, new FileStream(dPDFFile, FileMode.Create)))
{
}
string pdfFilePath=@“D:\Raja\Testing\AuthorQuery\xxx.pdf”;
字符串dPDFFile=@“D:\Raja\Testing\AuthorQuery\YYY.pdf”;
PdfReader pdfR=新的PdfReader(pdfFilePath);
字典nDest=新字典();
nDest=pdfR.GetNamedDestination();
List nDesColl=新列表();
nDesColl.Clear();
foreach(nDest中的KeyValuePair哨兵)
{
PdfArray pArr=(PdfArray)sEntry.Value;
if(pArr.ArrayList.Count==6)
{
if(pArr[1].ToString()==“/FitR”)
{
nDesColl.Add(哨兵钥匙);
}
}
}
如果(nDesColl.Count>0)
{
foreach(nDesColl中的对象keyVal)
{
PdfNumber pNo=新的PdfNumber(0);
PdfArray pArr=(PdfArray)nDest[keyVal];
pArr[1]=PdfName.XYZ;
pArr[4]=(PdfObject)pNo;
pArr.ArrayList.RemoveAt(5);
PdfObject fVal=(PdfObject)pArr;
nDest[keyVal]=fVal;
}
}
使用(PdfStamper stamper=newpdfstamper(pdfR,newfilestream(dPDFFile,FileMode.Create)))
{
}

寻求调试帮助的问题(“为什么此代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现这些问题所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。看:。@Alexis鸽子看下面我的问题得到了答案。太好了!非常感谢你对这个问题进行了跟进,这对未来可能面临同样问题的读者来说是很有价值的。记住,接受解决问题的答案被认为是一种很好的做法,即使答案是你自己提供的。@Alexis鸽子,谢谢你Alexis,我被推荐到下面的链接来收集想法,[和][