首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么GetPageLabels的结果不同于Acrobat

为什么GetPageLabels的结果不同于Acrobat
EN

Stack Overflow用户
提问于 2015-09-04 08:48:13
回答 2查看 146关注 0票数 0

我在中编辑pdf的页码。测试PDF

  • 结果:
    • 1-FrontCover
    • 2-前沿
    • 三-一
    • 4-二
    • 五-三
    • 6-1
    • 7-2
    • 8-3
    • 9-4
    • 10-5
    • 11-BackFold
    • 12-BackCover

但是GetPageLabels的这个结果是错误的

  • 页码:
    • 0-FrontCover1 1
    • 1-FrontFold 1
    • 2-FrontFoldi
    • 3-FrontFoldii
    • 4-FrontFoldiii
    • 5-FrontFold 1
    • 6-FrontFold2 2
    • 7-FrontFold 3
    • 8-边境福利4
    • 9-边境5
    • 10-BackFold1 1
    • 11-BackCover1 1

C#代码:

代码语言:javascript
复制
objLabels = PdfPageLabels.GetPageLabels(objReader);
TextBox1.Text += "page number:" + Environment.NewLine;
if (objLabels != null) {
    for (i = 0; i <= objLabels.Length - 1; i++) {
        TextBox1.Text += i + "-" + objLabels(i) + Environment.NewLine;
    }
}

如何获得像这样的正确结果?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-07 13:00:31

PdfPageLabels.GetPageLabels(PdfReader)中有一个小错误。当遇到没有P (前缀)条目的新页标签字典时,它不会重置当前的prefix值:

代码语言:javascript
复制
int pagecount = 1;
String prefix = "";
char type = 'D';
for (int i = 0; i < n; i++) {
    if (numberTree.ContainsKey(i)) {
        PdfDictionary d = (PdfDictionary)PdfReader.GetPdfObjectRelease(numberTree[i]);
        if (d.Contains(PdfName.ST)) {
            pagecount = ((PdfNumber)d.Get(PdfName.ST)).IntValue;
        }
        else {
            pagecount = 1;
        }
        if (d.Contains(PdfName.P)) {
            prefix = ((PdfString)d.Get(PdfName.P)).ToUnicodeString();
        }
        if (d.Contains(PdfName.S)) {
            type = ((PdfName)d.Get(PdfName.S)).ToString()[1];
        }
        else {
            type = 'e';
        }
    } 
    ...
}

可以通过将以下else子句添加到所讨论的if中来解决这个问题:

代码语言:javascript
复制
        if (d.Contains(PdfName.P)) {
            prefix = ((PdfString)d.Get(PdfName.P)).ToUnicodeString();
        }
        else
        {
            prefix = "";
        }

有了这个零钱我就得到了

页码:0- FrontCover 1- FrontFold 2-i 3- ii 4- iii 5-1 6-2 7-3 8-4 9-5 10 - BackFold 11 - BackCover

PS:同样的问题出现在用ReadPageLabels.java测试的Java版本中。

票数 1
EN

Stack Overflow用户

发布于 2015-09-08 03:21:32

谢谢你帮助解决我的问题,这是我的完整程序。

代码语言:javascript
复制
public string[] ReadPageLabel(PdfReader objReader, int intPageCount)
{
    PdfDictionary objDictionary ;
    Dictionary<int, PdfObject> objTree ;
    string[] arrLabels ;
    int i ;
    char chrLabelKind ;
    string strLabelPrefix ;
    int intLableNumber ;
    //PdfPageLabels is wrong
    //arrLabels = PdfPageLabels.GetPageLabels(objReader)


    arrLabels = new string[intPageCount];

    if (objReader.Catalog.Get(PdfName.PAGELABELS) != null) {
        objTree = PdfNumberTree.ReadTree(PdfReader.GetPdfObjectRelease(objReader.Catalog.Get(PdfName.PAGELABELS)));

        chrLabelKind = 'D';
        strLabelPrefix = "";
        intLableNumber = 1;
        for (i = 0; i <= intPageCount - 1; i++) {
            if (objTree.ContainsKey(i)) { //if reset page number
                objDictionary = PdfReader.GetPdfObjectRelease(objTree[i]);
                //PdfName.S:Number Kind
                if (objDictionary.Contains(PdfName.S)) {
                    chrLabelKind = ((PdfName)objDictionary.Get(PdfName.S)).ToString()(1);
                    //PdfName.S:/R,/r,/A,/a,/e,/D,ToString()(1)get alphabet of Index=1
                } else {
                    chrLabelKind = 'e';
                }
                //PdfName.P:Prefix
                if (objDictionary.Contains(PdfName.P)) {
                    strLabelPrefix = ((PdfString)objDictionary.Get(PdfName.P)).ToUnicodeString();               
                } else {
                    strLabelPrefix = "";
                }
                //PdfName.ST:Start Number
                if (objDictionary.Contains(PdfName.ST)) {
                    intLableNumber = ((PdfNumber)objDictionary.Get(PdfName.ST)).IntValue;
                } else {
                    intLableNumber = 1;
                }
            }
            switch (chrLabelKind) {
                case 'R':
                    //I,II,III
                    arrLabels[i] = strLabelPrefix + factories.RomanNumberFactory.GetUpperCaseString(intLableNumber);
                    break;
                case 'r':
                    //i,ii,iii
                    arrLabels[i] = strLabelPrefix + factories.RomanNumberFactory.GetLowerCaseString(intLableNumber);
                    break;
                case 'A':
                    //A,B,C
                    arrLabels[i] = strLabelPrefix + factories.RomanAlphabetFactory.GetUpperCaseString(intLableNumber);
                    break;
                case 'a':
                    //a,b,c
                    arrLabels[i] = strLabelPrefix + factories.RomanAlphabetFactory.GetLowerCaseString(intLableNumber);
                    break;
                case 'e':
                    //no number kind
                    arrLabels[i] = strLabelPrefix;
                    break;
                default:
                    //1,2,3
                    arrLabels[i] = strLabelPrefix + intLableNumber;
                    break;
            }
            intLableNumber += 1;

        }
    } else {
        for (i = 0; i <= intPageCount - 1; i++) {
            arrLabels[i] = i + 1;
        }
    }
    return arrLabels;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32393858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档