现有pdf的所有链接都会将action属性更改为继承zoom-iText库

时间:2014-04-03 05:42:49

标签: itext itextpdf

本准则非常完美。但唯一的问题是我想要复制链接,我想更改链接的属性以继承缩放。

public class links {
public static void main(String[] args) throws DocumentException, IOException,FileNotFoundException {

    String src = "E:/bookmark.pdf";
    String destination = "E:/links.pdf";

    PdfReader reader=new PdfReader(src);
    reader.consolidateNamedDestinations();

    Document doc=new Document();

    PdfCopy pdfCopy = new PdfCopy(doc,new FileOutputStream(destination));

    doc.open();

     int n = reader.getNumberOfPages();
     PdfDestination d = new PdfDestination(PdfDestination.XYZ,-1,-1,0.0F) ;
     PdfAction act = PdfAction.gotoLocalPage(1, d, pdfCopy);
     for (int i=1; i <= n ;i++)
    {

        PdfDictionary pageDic = reader.getPageN(i);
        PdfArray arrayann = pageDic.getAsArray(PdfName.ANNOTS);  
        if (arrayann != null)
        {
                //reader.addPdfObject(pageDic.get(PdfName.ANNOTS));
            PdfArray annot=(PdfArray)PdfReader.getPdfObject(pageDic.get(PdfName.ANNOTS)); 
            ArrayList<PdfObject> arrAnnot = new ArrayList<PdfObject>();
            arrAnnot = annot.getArrayList();

            for (int j = 0; j < arrAnnot.size(); j++)
            {
                PdfDictionary annots = (PdfDictionary)PdfReader.getPdfObject(arrAnnot.get(j));
                if (PdfName.LINK.equals(annots.get(PdfName.SUBTYPE)))
                {
                    annots.remove(PdfName.DEST);
                    annots.put(PdfName.DEST,act);

                }
            }
        }
        pdfCopy.addPage(pdfCopy.getImportedPage(reader, i));
        pdfCopy.freeReader(reader);
  }
     reader.close();
    pdfCopy.close(); 
    doc.close();
    System.out.println("The Pdf is Created..");
}

}

1 个答案:

答案 0 :(得分:1)

请查看ChangeZoomXYZDestination示例。您很快就会发现您的指控&#34;本规范是完美的&#34;是错的。正如我在评论中已经指出的那样,您不应该使用PdfCopy,您应该使用PdfStamper。此外,您不应该替换目的地,您应该替换缩放系数。

例如,第11页上的文件xyz_destination.pdf,有10个指向前10个页面的链接,每个页面都有一个/XYZ目标指向具有特定缩放系数的特定页面。您可以在以下屏幕截图中看到:

enter image description here

在第一个注释中,缩放因子为1,在第二个注释中为2,依此类推。

如果你想将这些链接的缩放系数更改为0,那么你需要循环注释(你已经这样做了),但是不需要用动作错误地替换/DEST,你需要更改/DEST数组中缩放系数的值:

PdfArray annots = page.getAsArray(PdfName.ANNOTS); 
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);
        if (d != null && d.size() == 5 && PdfName.XYZ.equals(d.getAsName(1)))
            d.set(4, new PdfNumber(0));
    }
}

现在您将拥有xyz_zoom.pdf这样的文件,其中/XYZ类型的所有链接的缩放系数将为零。