4

PDFと同じディレクトリ内の他のファイルにリンクしたい単一のPDFファイルを作成しています。

すなわち。

MyFolder
        |
        |-main.pdf
        |-myotherpdf.pdf
        |-myotherotherpdf.pdf

main.pdf に、pdf のデフォルト プログラムが他の pdf を開くリンクを設定したいと思います。

サーバー上でこれらのファイルを生成し、ダウンロードしてクライアントに提供しているため、絶対リンクはクライアント PC に存在しないため、使用できません。

まず、pdf ファイルは実際にこのような相対ファイル リンクをサポートしていますか。

さらに、pdf を生成するために abcpdf を使用し、html を提供して pdf に変換しています。

htmlで正しいURLを試して生成するために、私は次のことを試しました

<a href='test.pdf'>test pdf link to local file</a>
<a href='#test.pdf'>test pdf link to local file</a>
<a href='/test.pdf'>test pdf link to local file</a>
<a href='file:///test.pdf'>test pdf link to local file</a>
<a href='file://test.pdf'>test pdf link to local file</a>

それらのほとんどは、pdfドキュメントが生成された場所(一時ファイルパス)を私に指示するか、アクロバットでホバーすると「file:///test.pdf」と表示されますが、クリックすると警告ダイアログがポップアップして許可を求めます/deny、許可をクリックすると、Firefox で「file:///test.pdf」という URL が開きますが、これは何にも解決されません。

これを機能させる方法、またはこの種のリンクがpdfで可能かどうかについてのアイデアはありますか?

4

2 に答える 2

3

私はあなたの質問に答えることができるだけです: PDF ファイルは実際にこのような相対ファイル リンクをサポートしていますか?

はい、そうです。同じフォルダー内の他の 2 つの PDF ドキュメントへの 2 つのリンクを持つ main.pdf を使用して、小さなテストを作成しました。リンクを Acrobat で手動で作成し、起動アクションをリンク注釈に関連付けました。ここで内部構造を参照してください。

ここに画像の説明を入力

これは、メインと 2 つのセカンダリ PDF を含む zip です。それらはどこにでもコピーでき、相対リンクは有効なままであることに注意してください。 https://www.dropbox.com/s/021tvynkuvr63lv/main.zip

特にHTMLから変換しているため、利用可能なPDF機能がおそらく制限されているため、abcpdfでこれをどのように達成するかわかりません。

于 2013-07-23T08:19:48.760 に答える
1

@Frank Remとabcpdfの人たちの助けのおかげで、最終的にはうまくいきました

コードは次のとおりです

    foreach (var page in Enumerable.Range(0, doc.PageCount))
    {
        doc.PageNumber = page;

        var annotEnd = doc.GetInfoInt(doc.Page, "Annot Count");

        for (var i = 0; i <= annotEnd; ++i)
        {
            var annotId = doc.GetInfoInt(doc.Page, "Annot " + (i + 1));

            if (annotId > 0)
            {
                var linkText = doc.GetInfo(annotId, "/A*/URI*:Text");

                if (!string.IsNullOrWhiteSpace(linkText))
                {
                    var annotationUri = new Uri(linkText);

                    if (annotationUri.IsFile)
                    {
                        // Note abcpdf temp path can be changed in registry so if this changes
                        // will need to rewrite this to look at the registry
                        // http://www.websupergoo.com/helppdfnet/source/3-concepts/d-registrykeys.htm
                        var abcPdfTempPath = Path.GetTempPath() + @"AbcPdf\";

                        var relativePath = annotationUri.LocalPath.ToLower().Replace(abcPdfTempPath.ToLower(), string.Empty);

                        // Only consider files that are not directly in the temp path to be valid files
                        // This is because abcpdf will render the document as html to the temp path
                        // with a temporary file called something like {GUID}.html
                        // so it would be difficult to tell which files are the document
                        // and which are actual file links when trying to do the processing afterwards
                        // if this becomes and issue this could be swapped out and do a regex on {GUID}.html
                        // then the only restriction would be that referenced documents cannot be {GUID}.html
                        if (relativePath.Contains("\\"))
                        {
                            doc.SetInfo(annotId, "/A*/S:Name", "Launch");
                            doc.SetInfo(annotId, "/A*/URI:Del", "");
                            doc.SetInfo(annotId, "/A*/F:Text", relativePath);
                            doc.SetInfo(annotId, "/A*/NewWindow:Bool", "true");
                        }
                    }
                }
            }
        }
    }

これにより、PC 上で関連付けられているビューアで各リンクを開くことができます。

于 2013-09-12T05:20:03.483 に答える