itext更改所有超链接的缩放级别以继承现有pdf的缩放

时间:2014-06-17 09:34:16

标签: java itext

我使用以下代码将所有超链接的缩放级别更改为继承缩放,但无法更改。

可能是我在PdfName.DEST和条件中犯了一些错误,因为第一页的pdf中没有DEST数组(查看屏幕截图)。

for (int count = 0; count < reader.getNumberOfPages(); count++) {
        PdfDictionary page = reader.getPageN(count+1);
        PdfArray annots = page.getAsArray(PdfName.ANNOTS);
        if (annots != null) {
            for (int i = 0; i < annots.size(); i++) {
                PdfDictionary annotation = annots.getAsDict(i);
                if (PdfName.LINK.equals(annotation.getAsName(PdfName.SUBTYPE))) {
                     if(annotation.get(PdfName.A)==null){
                          continue;
                     }
                    PdfArray d = annotation.getAsArray(PdfName.DEST);
                    if (d != null && d.size() == 5 && PdfName.XYZ.equals(d.getAsName(1)))
                        d.set(4, new PdfNumber(0));
                }
            }
        }
    }

我在第一页到第二页创建了链接,查看图像中的结构。

enter image description here

我也尝试使用以下代码...我每次调试并检查 d 的值为空

for (int count = 0; count < reader.getNumberOfPages(); count++) {
            PdfDictionary page = reader.getPageN(count+1);
            PdfArray annots = page.getAsArray(PdfName.ANNOTS);
            if (annots != null) {
                for (int i = 0; i < annots.size(); i++) {
                    PdfDictionary annotation = annots.getAsDict(i);
                    if (PdfName.LINK.equals(annotation.getAsName(PdfName.SUBTYPE))) {

                        PdfArray d = annotation.getAsArray(PdfName.DEST);
                        // d is null every time
                    }
                }
            }
        }

1 个答案:

答案 0 :(得分:0)

添加一个屏幕截图,可以查看PDF内部。在此屏幕截图中,您清楚地看到目的地为[5 0 R, /FitH, 795]。但是,您只更改包含5个值且类型为/XYZ的目标的缩放系数。

 if (d != null && d.size() == 5 && PdfName.XYZ.equals(d.getAsName(1)))
      d.set(4, new PdfNumber(0));

[5 0 R, /FitH, 795]有3个元素(换句话说,d.size() == 5false),数组中的第一个条目是PdfName.FITH(换句话说,PdfName.XYZ.equals(d.getAsName(1)是假)。

你的问题应该被低估,因为你展示了一件事,然后做了别的事情,然后问我们为什么你没有得到预期的结果。好像有人为你提供汤,你在桌子上看到一把勺子和一把叉子。尽管你知道汤应该用勺子吃,你拿叉子然后抱怨你不能用叉子吃汤。那是......很奇怪。

更新在评论中,您抱怨dnull,但在查看您的屏幕截图时,您已经知道d为空。< / p>

您遍历页面并获得第1页(对象4)的页面字典。您检查此页面词典中是否有/Annots条目。有(对象40)。你循环遍历annots并遇到一个注释字典(对象30或39,屏幕截图的分辨率对我来说太糟糕了)。您检查/Subtype是否为Link。它是。您检查注释是否具有/A条目。它有。然后你得到/Dest条目。没有这样的条目。因此,你得到null。目的地在这里:

PdfDictionary action = annotation.get(PdfName.A);
if (action != null) {
    PdfArray d = action.getAsArray(PdfName.D);
    // now examine and change D
}

请注意,您要求SO社区在您的位置编写您的应用程序。您可以获得此解决方案的报酬,但您希望其他人在您的位置上完成您的工作。此外:您可能没有iText的商业许可......