2010-01-26 7 views
7

Je génère dynamiquement un PDF en utilisant ABCpdf qui contient une table des matières qui serait liée à d'autres pages dans le même PDF. Le problème est que le chemin des balises d'ancrage dans le code HTML est modifié en un chemin absolu vers un fichier temporaire.ABCpdf convertir des ancres html pour passer à une autre page dans le même PDF

Par exemple, ABCpdf rendrait href du lien:

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

dans le PDF comme: file: /// C: /Users/Aaron/AppData/Local/Temp/ABCpdf/pdfCMMYPSF.htm #elementId

Voilà comment je obtenir le 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(); 
} 

Toute idée comment je peux obtenir les liens d'ancrage pour rendre correctement si vous cliquez sur il sautera à un autre page?

+0

Juste pour votre information, j'ai eu beaucoup de chance d'obtenir de l'aide directement des créateurs de ABCpdf. J'ai essayé ça? – Bryan

+0

Je viens de leur envoyer un e-mail, merci pour la suggestion. – Aaron

+0

Le support de WebSuperGoo est excellent et l'un des meilleurs, Bryan est sur le point avec cette suggestion. – Jakkwylde

Répondre

6

Websupergoo est revenu à moi et j'étais capable de déboguer mon problème d'un projet d'exemple qu'ils ont fourni. La solution à mon problème était assez simple, je posterai la réponse ici au cas où quelqu'un d'autre est d'avoir le même problème:

Mon HTML a été mis en place comme ceci:

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

J'ai simplement besoin de changer à:

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

Vous devez utiliser une balise d'ancrage avec le nom spécifié pour que ABCpdf pour faire le lien saut vers une autre page dans le même PDF.

+1

Cela fonctionne!Aussi une note pour les autres, si vous utilisez dans votre tag de tête, il va bousiller vos ancres, donc vous aurez besoin de référence tout avec une url absolue –

+1

Cela fonctionne pour moi aussi bien. J'ai également dû définir document.HtmlOptions.AddLinks = true; et exécutez document.HtmlOptions.LinkPages(); après aplatissement du document. –

3

Pour ce que cela vaut, j'ai eu des résultats inconsistant via le AddImageHtml concernant les signets ancrés. Le moyen le plus fiable d'y parvenir est la méthode AddBookMark, mais cela impliquerait beaucoup plus de travail car vous travailleriez à reconstruire manuellement les contenus PDF et le support HTML de cette manière est limité. Plus d'informations sur cette méthode se trouve à:

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

Peut-être leur dernière version 8 aborde cette question. Les signets semblent toujours se résoudre à un emplacement absolu plutôt que relatif comme vous le voyez dans votre navigateur via le HTML conventionnel.

1

Une autre méthode qui a fonctionné pour moi dans la dernière version ABCpdf (9) est d'ajouter un signet à chaque page dans votre document:

For i = 1 to pdf.PageCount 

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

Next 

ensuite où vous voulez insérer un lien que vous pouvez faire référence à la signet - dans ce cas, nous créons une table des matières en boucle à travers chaque signet, nous avons créé:

For Each bm As Bookmark In pdf.Bookmark 

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

Next 

pdf.AddHtml(toc) 

L'équipe Websupergoo m'a fourni quelques exemples de code et c'est ce que cela est basé sur des - donc grâce à eux !

Questions connexes