2016-08-24 15 views
1

PDF文書の作成ant私はテキストの章へのリンクに問題があります。 私はhereからBruno Lowagieのコードを使用しますが、それはJavaであり、いくつかの問題があります。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); 


       } 

私が持っている問題このwhith:私がやっている何

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を作成している:あなたは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の任意の宛先が定義されていないためです。

私はあなたのためにJavaで書かれたコード、具体的には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  | 

私はTOCを作成するときに、私はこれらの名前、dest0dest1を、使用して...このようなアクションを作成するには:あなたが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) 

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

あなたは間違った値を使用し、次のようなリンクを作成します名前付きの目的地。それらの名前が常にユニークであると確信できないので、私は自分のアプローチがより良い選択だと思っています。

質問への回答私は間違っていますか?は簡単です:あなたはリンクを作成していますが、目的地を作成するのを忘れました。

+0

ありがとうございます!私はそれをしました!私は間違いを理解した。 – Naomiss

+0

私は質問があります。どのようにPDF文書のメニューに目次を追加できますか?ブックマークについては、左の枠内にあるブックマークを検索します。 'Chapter'と' Section'を使うと、自動的に作成されました。私はそれについて新しい質問を作成する必要がありますか? – Naomiss

+1

ブックマークは 'PdfOutline'クラスを使って簡単に作ることができます。すでに名前付きの宛先*を作成しています。これらの名前付き宛先を使用してアウトラインツリーを作成できます。 –

関連する問題