2013-06-03 55 views
2

我試圖爲現有的pdf文件創建一個目錄表,然後將目錄頁面合併到pdf文件中。頁面標題和相應的頁碼可在單獨的Excel中使用文件。爲現有的Pdf創建目錄

我正在使用iText進行PDF操作。 我遇到的所有例子都與創建新pdf時插入鏈接有關。但在我的情況下,我想創建現有網頁的鏈接。

任何建議或例子將不勝感激。

+1

在我看來,部分內容的表是一個細節。你真正要問的是如何修改一個已經存在的PDF。我知道我揮手致意,但如果您可以閱讀PDF並編寫PDF,那麼您所需要做的就是在這些步驟之間添加TOC。有什麼問題? –

+0

我的問題是如何創建現有網頁的鏈接?我可以在pdf中添加一個新頁面並添加標籤,但是如何將該標籤指向某個頁碼? –

+0

啊,這是我不知道如何在iText中做的事情,但我做了一個補丁,使它可以在飛碟https://code.google.com/p/flying-saucer/中使用iText,所以我知道這一定是可能的。你應該看看飛碟。它可能是一個更好的API。 –

回答

1

我終於找到答案。感謝我的朋友指點我在c#中的一個例子。

在Java代碼如下所示:

public class Test1 { 
public static void main(String args[]) throws Exception{ 
      PdfReader reader = new PdfReader(new RandomAccessFileOrArray("C:\\test.pdf"), null); 
      Document doc = new Document(reader.getPageSize(1)); 
      PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream("C:\\result.pdf")); 
      Font link = FontFactory.getFont("Arial", 12, Font.UNDERLINE); 
      doc.open(); 
      PdfContentByte pdfContentByte = writer.getDirectContent(); 
      Anchor topAnchor = null; 
      PdfImportedPage page = null; 
      for (int i = 1; i < reader.getNumberOfPages(); i++) 
      { 
       if (i == 1) 
       { 
        Anchor click = new Anchor("Click to go to Target"); 
        click.setReference("#target"); 
        Paragraph p1 = new Paragraph(); 
        p1.add(click); 
        doc.add(p1); 
        page = writer.getImportedPage(reader, i); 
        doc.newPage(); 
        pdfContentByte.addTemplate(page, 0, 0); 
       } 
       else 
       { 
        if (i == 5) 
        { 

         Anchor target = new Anchor("My targer"); 
         target.setName("target"); 
         Paragraph p3 = new Paragraph(); 
         p3.add(target); 
         doc.add(p3); 
        } 
        page = writer.getImportedPage(reader, i); 
        doc.newPage(); 
        pdfContentByte.addTemplate(page, 0, 0); 
       } 

      } 


      doc.close(); 
     } 
} 
0

我查找了我在Flying Saucer中製作的補丁,可以點擊鏈接並使其執行某些操作。這是很久以前的,所以我不確定這是否會有所幫助,但似乎是使用iText。下面是代碼,我覺得我寫的這個片斷:P

private void processLink(RenderingContext c, Box box) { 
    Element elem = box.getElement(); 
    if (elem != null) { 
     NamespaceHandler handler = _sharedContext.getNamespaceHandler(); 
     String uri = handler.getLinkUri(elem); 
     if (uri != null) { 
      if (uri.length() > 1 && uri.charAt(0) == '#') { 
       String anchor = uri.substring(1); 
       Box target = _sharedContext.getBoxById(anchor); 
       if (target != null) { 
        PdfDestination dest = createDestination(c, target); 

        if (dest != null) { 
         PdfAction action = new PdfAction(); 
         if (!"".equals(handler.getAttributeValue(elem, "onclick"))) { 
          action = PdfAction.javaScript(handler.getAttributeValue(elem, "onclick"), _writer); 
         } else { 
          action.put(PdfName.S, PdfName.GOTO); 
          action.put(PdfName.D, dest); 
         } 

         com.lowagie.text.Rectangle targetArea = checkLinkArea(c, box); 
         if (targetArea == null) { 
          return; 
         } 

         targetArea.setBorder(0); 
         targetArea.setBorderWidth(0); 

         PdfAnnotation annot = new PdfAnnotation(_writer, targetArea.getLeft(), targetArea.getBottom(), 
           targetArea.getRight(), targetArea.getTop(), action); 
         annot.put(PdfName.SUBTYPE, PdfName.LINK); 
         annot.setBorderStyle(new PdfBorderDictionary(0.0f, 0)); 
         annot.setBorder(new PdfBorderArray(0.0f, 0.0f, 0)); 
         _writer.addAnnotation(annot); 
        } 
       } 
      } else if (uri.indexOf("://") != -1) { 
       PdfAction action = new PdfAction(uri); 

       com.lowagie.text.Rectangle targetArea = checkLinkArea(c, box); 
       if (targetArea == null) { 
        return; 
       } 
       PdfAnnotation annot = new PdfAnnotation(_writer, targetArea.getLeft(), targetArea.getBottom(), targetArea.getRight(), 
         targetArea.getTop(), action); 
       annot.put(PdfName.SUBTYPE, PdfName.LINK); 

       annot.setBorderStyle(new PdfBorderDictionary(0.0f, 0)); 
       annot.setBorder(new PdfBorderArray(0.0f, 0.0f, 0)); 
       _writer.addAnnotation(annot); 
      } 
     } 
    } 
} 

這是org.xhtmlrenderer.pdf.ITextOutputDevice

我不確定你的工作環境。是否有足夠的信息來弄清楚如何做到這一點?

+0

我不確定上述代碼是如何工作的。我會檢查這一點,並讓你知道。 –

+0

@RachitAgrawal看到我的編輯。我在這個重要的路線上包含了更多的背景。這有幫助嗎? –

相關問題