2010-01-26 3 views
7

Generalmente sto generando un PDF utilizzando ABCpdf che contiene un sommario che collegherebbe ad altre pagine all'interno dello stesso PDF. Il problema è che il percorso dei tag di ancoraggio nell'HTML viene modificato in un percorso assoluto di un file temporaneo.ABCpdf che converte gli ancoraggi html per passare a un'altra pagina nello stesso PDF

Per esempio, ABCpdf renderebbe href del link:

<a href="#elementId">Link</a> 

nel PDF come: file: /// C: /Users/Aaron/AppData/Local/Temp/ABCpdf/pdfCMMYPSF.htm #elementId

Questo è come genero il PDF:

Doc pdf = new Doc(); 
pdf.HtmlOptions.AddLinks = true; 
pdf.Rect.Rectangle = new System.Drawing.Rectangle(20, 80, 572, 702); 
int id = pdf.AddImageHtml(pdfHTML, true, pdf.HtmlOptions.BrowserWidth, true); 

while (pdf.Chainable(id)) 
{ 
    pdf.Page = pdf.AddPage(); 
    id = pdf.AddImageToChain(id); 
} 

pdf.HtmlOptions.LinkPages(); 
for (int i = 0; i < pdf.PageCount; i++) 
{ 
    pdf.PageNumber = i; 
    pdf.Flatten(); 
} 

Tutte le idee come posso ottenere i link di ancoraggio per rendere propriamente clic su di esso salterà ad un altro pagina?

+0

Proprio per la cronaca, ho avuto abbastanza fortuna ricevendo supporto direttamente dai produttori di ABCpdf. Hai provato? – Bryan

+0

Appena inviato loro una e-mail, grazie per il suggerimento. – Aaron

+0

Il supporto di WebSuperGoo è eccellente e uno dei migliori in circolazione, Bryan è azzeccato con questo suggerimento. – Jakkwylde

risposta

6

Websupergoo è tornato da me e sono riuscito a eseguire il debug del mio problema da un progetto di esempio che hanno fornito. La soluzione al mio problema era piuttosto semplice, vi posterò qui la risposta nel caso in cui qualcun altro sta avendo lo stesso problema:

mio HTML è stato impostato in questo modo:

<a href="#elementId">Link to another page</a> 
<div id="elementId">A div that's on another page</div> 

ho semplicemente bisogno di cambiare a:

<a href="#elementId">Link to another page</a> 
<div><a name="elementId">A div that's on another page</a></div> 

è necessario utilizzare un tag di ancoraggio con il nome specificato in modo che ABCpdf per creare il collegamento passare a un'altra pagina all'interno dello stesso in formato PDF.

+1

Questo funziona!Anche una nota per gli altri, se stai usando nel tuo head tag rovinerà le tue ancore quindi avrai bisogno di referenziare tutto con un url assoluto –

+1

Funziona anche per me. Ho anche dovuto impostare document.HtmlOptions.AddLinks = true; ed esegui document.HtmlOptions.LinkPages(); dopo aver appiattito il documento. –

3

Per quello che vale, ho avuto risultati inconsistenti tramite il AddImageHtml per i segnalibri ancorati. Il modo più affidabile per farlo è tramite il metodo AddBookMark, ma questo implicherebbe un lavoro molto più impegnativo, in quanto dovresti lavorare per ricostruire manualmente i contenuti PDF e il supporto HTML in quel modo è limitato. Maggiori informazioni riguardo questo metodo sono disponibili all'indirizzo:

http://www.websupergoo.com/helppdf7net/source/5-abcpdf6/doc/1-methods/addbookmark.htm

Forse le loro ultime versioni 8 indirizzi questo problema. I segnalibri sembrano sempre risolversi in una posizione assoluta piuttosto che relativa, come si vede nel tuo browser tramite HTML convenzionale.

1

Un altro metodo che ha funzionato per me nella sua ultima versione ABCpdf (9) è quello di aggiungere un segnalibro a ogni pagina del documento:

For i = 1 to pdf.PageCount 

    pdf.PageNumber = i 
    pdf.AddBookmark("Page " & i, True) 

Next 

Poi in cui si desidera inserire un link è possibile fare riferimento alla bookmark - in questo caso si crea una tabella di contenuti da loop attraverso ogni segnalibro che abbiamo creato:

For Each bm As Bookmark In pdf.Bookmark 

    toc &= "<Font annots='goto:" + bm.Page.PageNumber.ToString() + "'>" & bm.Title & "</Font><br>" 

Next 

pdf.AddHtml(toc) 

Il team WebSupergoo mi ha fornito qualche esempio di codice e questo è ciò che questo è basato su - quindi grazie a loro !