4

現在、カスタム PDF ライターを拡張して、Web サイトへのリンクを書き込めるようにしています。ただし、PDF にリンクを配置する方法がどこにも見つからないため、問題があります。

これは、テキストを出力するものです:

BT
70 50 TD
/F1 12 Tf
(visit my website!) Tj
ET

今必要なのは、これをハイパーリンクにラップして、「私のウェブサイトにアクセスしてください!」をクリックすると、ユーザーが私のウェブサイトにリダイレクトされるようにすることです。

どうすればいいですか?ツールなどを使用できません。多くのドキュメントが C# を使用して動的に生成されるため、適切な PDF コマンドをファイルに書き込む方法を知る必要があります。現在、私は iTextSharp を使用していますが、ハイパーリンクを書き込む機能が見つからなかったため、この機能を追加することにしました。

4

2 に答える 2

6

仕様の側面は次のとおりです。リンクは、リンク注釈をページに配置することによって作成されます。リンク注釈は、Rect キーまたは一連の四角形のいずれかで表されます。長方形を扱っているとしましょう。リンクを配置するには、少なくとも次のような辞書が必要です。

<< /Type /Annot /Subtype /Link /Rect [ x1 y1 x2 y2 ] >>

(x1, y1) と (x2, y2) は、リンクのアクティブ領域が存在する長方形の角を表します。

これを処理するには、これを PDF 内の間接オブジェクトにし、ページの Annots 配列から参照する必要があります。

これを作成できれば、どこにも行かないページにリンクが表示されます。

リンクをどこかに移動するには、リンク注釈に /Dest または /A エントリのいずれかが必要です (両方ではない)。/Dest は、ページ レベルのナビゲーション用の古いアーティファクトです。これは使用しません。代わりに、アクション ディクショナリである /A エントリを使用します。したがって、URL http://www.google.comに移動する場合は、注釈を次のようにします。

<< /Type /Annot /Subtype /Link /Rect [ x1 y1 x2 y2 ]
   /A << /Type /Action /S /URI /URI (http://www.google.com) >>
>>

iTextSharp でこれを行う方法については、特にお手伝いできません。私は、彼らが使用するモデルや抽象化が特に好きではありません。私は Atalasoft 用の PDF ツールキットを書いています。私自身のツールキットでそれを行う方法を紹介します。繰り返しますが、私はこれが商用製品であり、生計を立てていることを隠そうとはしていません. 他のオプションが利用可能であることを確認したいだけです。

// make a document, add a font, get its metrics
PdfGeneratedDocument doc = new PdfGeneratedDocument();
string fontResource = doc.Resources.Fonts.AddFromFontName("Times New Roman");
PdfFontMetrics mets = doc.Resources.Fonts.Get(fontResource).Metrics;

// make a page, place a line of text
PdfGeneratedPage page = doc.Pages.AddPage(PdfDefaultPages.Letter);
PdfTextLine line = new PdfTextLine(fontResource, 12.0, "Visit my web site.",
                        new PdfPoint(72, 400));
page.DrawingList.Add(line);

// get the bounds of the text we place, make an annotation
PdfBounds bounds = mets.GetTextBounds(12.0, "Visit my web site.");
bounds = new PdfBounds(72, 400, bounds.Width, bounds.Height);
LinkAnnotation annot = new LinkAnnotation(bounds, new PdfURIAction(new URI("my url")));
page.Annotations.Add(annot);

// save the content
doc.Save("finaldoc.pdf");

「トリッキー」な唯一のことは、ページ上のコンテンツとリンク注釈の間に分離があることですが、これは、Acrobat がリンクをモデル化する方法であるためです。既存のドキュメントを変更する場合は、既存のファイル/ストリームから PdfGeneratedDocument を作成し、注釈を追加してから保存します。

于 2013-10-21T14:17:23.253 に答える
1

現在、iTextSharp を使用していますが、ハイパーリンクを作成する機能が見つかりませんでした。

iText in Action, 2nd Edition Webified iTextSharp Examples MovieLinks2.csまたはLinkActions.cs をご覧ください

// create an external link
Chunk imdb = new Chunk("Internet Movie Database", FilmFonts.ITALIC);
imdb.SetAnchor(new Uri("http://www.imdb.com/"));
p = new Paragraph("Click on a country, and you'll get a list of movies, containing links to the ");
p.Add(imdb);
p.Add(".");
document.Add(p);

したがって、iTextSharp を使用してリンクを追加するのは本当に簡単です。

それでも手動で行いたい場合は、PDF 仕様を参照してください。セクション 12.5.6.5でリンク アノテーションについて説明し、セクション 12.6.4.7でそのリンク アノテーションで使用するURI アクションを示します。

于 2013-10-21T12:00:09.443 に答える