2016-08-24 4 views
1

PDF 문서 작성 개미 텍스트의 장과 링크로 문제가 있습니다. 브루노 로우 아기 코드를 here에서 사용합니다.하지만 자바입니다.PDF의 목차 텍스트 장의 링크로의 목차

나는이 같은 일을 해요 :

클래스 TOCEvents

public class TOCEvents : PdfPageEventHelper 
{ 

    //protected System.Collections.Generic.List<TitleTOC> toc = new System.Collections.Generic.List<TitleTOC>(); 
    protected Dictionary<string, int> toc = new Dictionary<string, int>(5); 

    public override void OnGenericTag(PdfWriter writer, Document document, Rectangle rect, String text) 
    { 
     toc.Add(text, writer.PageNumber); 
    } 

    public Dictionary<string, int> GetTOC() 
    { 
     return toc; 
    } 

} 

주요

    for (int i = 0; i < 10; i++) 
       { 
        String title = "This is title " + i; 
        Chunk c = new Chunk(title, f14); 
        c.SetGenericTag(title); 
        doc.Add(new Paragraph(c)); 
        for (int j = 0; j < 50; j++) 
        { 
         doc.Add(new Paragraph("Line " + j + " of title " + i)); 
        } 
       } 
       doc.NewPage(); 

       doc.Add(new Paragraph("Table of Contents", f24)); 

       Chunk dottedLine = new Chunk(new iTextSharp.text.pdf.draw.DottedLineSeparator()); 
       Dictionary<string, int> entries = ev.GetTOC(); 
       Paragraph p; 

       foreach (KeyValuePair<string, int> entry in entries) 
       { 
        Chunk chunk = new Chunk(entry.Key); 
        chunk.SetAction(PdfAction.GotoLocalPage(entry.Key, false)); 

        p = new Paragraph(chunk); 
        p.Add(dottedLine); 

        chunk = new Chunk(entry.Value.ToString()); 
        chunk.SetAction(PdfAction.GotoLocalPage(entry.Key, false)); 

        p.Add(chunk); 

        doc.Add(p); 


       } 

내가 가지고 문제이 아 파크 : 내가 뭐하는 거지

foreach (KeyValuePair<string, int> entry in entries) 
       { 
        Chunk chunk = new Chunk(entry.Key); 
        chunk.SetAction(PdfAction.GotoLocalPage(entry.Key, false)); 

        p = new Paragraph(chunk); 
        p.Add(dottedLine); 

        chunk = new Chunk(entry.Value.ToString()); 
        chunk.SetAction(PdfAction.GotoLocalPage(entry.Key, false)); 

        p.Add(chunk); 

        doc.Add(p); 


       } 

잘못된? 텍스트 챕터에 대한 링크를 설정할 수 없습니다. 제 생각에는, 제가 잘못 사용하고 있습니다 Dictionary<string, int>. 나는 어디에서 실수 했는가?

감사합니다.

답변

2

는이 같은 TOC를 만들 : 당신은 목차에서 제목을 클릭하는 방식으로이 작업을 수행

Chapter 1 ................... 1 
Chapter 2 ................... 5 
Chapter 3 ................... 7 
Chapter 4 ................... 9 
Chapter 5 .................. 10 

:

| key  | page number | 
|-----------|-------------| 
| Chapter 1 | 1  | 
| Chapter 2 | 5  | 
| Chapter 3 | 7  | 
| Chapter 4 | 9  | 
| Chapter 5 | 10  | 

당신은이 같은 정보를 렌더링 또는 페이지 번호를 사용하면 Chapter X (X는 1에서 5까지의 숫자 임)이라는 이름의 대상에 대한 링크를 트리거합니다.

링크를 클릭해도 아무런 변화가 없습니다. 어디서나 이름이 Chapter X 인 대상을 정의하지 않았기 때문에

자바로 작성한 코드, 특히 CreateTOC2을 복사했습니다. 우리는 추적이 새로운 TOCEvent에서

public class TOCEvent extends PdfPageEventHelper { 

    protected int counter = 0; 
    protected List<SimpleEntry<String, SimpleEntry<String, Integer>>> toc = new ArrayList<>(); 

    @Override 
    public void onGenericTag(PdfWriter writer, Document document, Rectangle rect, String text) { 
     String name = "dest" + (counter++); 
     int page = writer.getPageNumber(); 
     toc.add(new SimpleEntry<String, SimpleEntry<String, Integer>>(text, new SimpleEntry<String, Integer>(name, page))); 
     writer.addNamedDestination(name, page, new PdfDestination(PdfDestination.FITH, rect.getTop())); 
    } 

    public List<SimpleEntry<String, SimpleEntry<String, Integer>>> getTOC() { 
     return toc; 
    } 
} 

: 당신은 TOCEvent 변경 사실을 간과 How to create Table Of Contents in iTextSharp

그러나 이전 질문에 대한 응답으로 작성되었습니다 예에 따라이 예제를 썼다 counter. 매번 제목이 나오고 새로운 (고유 한!) 이름이 만들어지고 카운터가 올라갑니다.

String name = "dest" + (counter++); 

이 이름으로 이름이 지정된 대상을 만들어야합니다. 이 경우, 우리는 특정 Y 위치에서, /FitH (수평에 맞게) 대상을 만들 :

writer.addNamedDestination(
    name, // the unique name 
    page, // the current page number where the title is added 
    new PdfDestination(  // the destination on that page 
     PdfDestination.FITH, rect.getTop())); 

당신은 그러한 대상을 추가하지 않습니다 따라서 당신은 문서의 이름이 지정된 대상에 연결할 수 없습니다. 내 예에서

, 나는 TOC에 고유 이름을 전달 : 나는 목차를 만들 때

| key  | named destination | page number | 
|-----------|-------------------|-------------| 
| Chapter 1 | dest0   | 1  | 
| Chapter 2 | dest1   | 5  | 
| Chapter 3 | dest2   | 7  | 
| Chapter 4 | dest3   | 9  | 
| Chapter 5 | dest4   | 10  | 

, 나는이 이름을 사용, dest0, dest1, ...이 같은 동작을 만들 : 당신은 잘못된 값을 사용

PdfAction.gotoLocalPage("dest0", false) 
PdfAction.gotoLocalPage("dest1", false) 
PdfAction.gotoLocalPage("dest2", false) 
PdfAction.gotoLocalPage("dest3", false) 
PdfAction.gotoLocalPage("dest4", false) 

를, 당신은 다음과 같은 링크를 만들 : 당신이 Chapter 1, Chapter 2를 사용하지 않는

PdfAction.gotoLocalPage("Chapter 1", false) 
PdfAction.gotoLocalPage("Chapter 2", false) 
PdfAction.gotoLocalPage("Chapter 3", false) 
PdfAction.gotoLocalPage("Chapter 4", false) 
PdfAction.gotoLocalPage("Chapter 5", false) 

의 이름으로 ..., 작동하지 않을 수 있습니다 그 이름이 지정된 목적지. 그 이름이 항상 고유 할 것이라고 확신 할 수 없기 때문에 제 접근 방식이 더 나은 선택이라고 생각합니다.

질문에 대한 답변 무엇이 잘못 되었나요?은 간단합니다. 링크를 만들지 만 대상을 만드는 것을 잊었습니다.

+0

대단히 감사합니다! 나는 그것을했다! 나는 내 실수를 이해했다. – Naomiss

+0

질문이 있습니다. 목차를 PDF 문서의 메뉴에 어떻게 추가 할 수 있습니까? 북마크에 관해서는 왼쪽 테두리 문서에서 찾는다. 'Chapter'와'Section'을 사용할 때 자동으로 생성됩니다. 그것에 대해 새로운 질문을 만들어야합니까? – Naomiss

+1

책갈피는'PdfOutline' 클래스를 사용하여 쉽게 생성 할 수 있습니다. 이미 * 명명 된 목적지 *를 작성 중입니다. 명명 된 대상을 사용하여 개요 트리를 만들 수 있습니다. –