开发者社区> 杰克.陈> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

【译】在Asp.Net中操作PDF – iTextSharp - 使用链接和书签

简介: 原文 【译】在Asp.Net中操作PDF – iTextSharp - 使用链接和书签      用户和PDF文档的交互可以通过锚(链接)和书签进行,接着我前面iTextSharp的系列文章,本篇文章主要讲通过iTextSharp创建的PDF中链接和书签的基础知识,你或许想复习一下之前的文章,如果你还没有阅读过之前的文章,那么:      在ASP.
+关注继续查看

原文 【译】在Asp.Net中操作PDF – iTextSharp - 使用链接和书签

     用户和PDF文档的交互可以通过锚(链接)和书签进行,接着我前面iTextSharp的系列文章,本篇文章主要讲通过iTextSharp创建的PDF中链接和书签的基础知识,你或许想复习一下之前的文章,如果你还没有阅读过之前的文章,那么:

     在ASP.NET中创建PDF-iTextSharp起步

     在Asp.Net中操作PDF - iTextSharp - 使用字体

     在Asp.Net中操作PDF – iTextSharp -利用块,短语,段落添加文本

     在Asp.Net中操作PDF – iTextSharp-列表

 

链接

      iTextSharp的Anchor对象和HTML中的锚非常相似,它们都允许创建链接到外部文档或是内部文档的链接。但和HTML中的链接不同的是,iTextSharp的链接默认没有任何样式,有鉴于此,我建议对于链接来说,都应该加下划线并且使用蓝色字体来告诉用户这段文字有着链接的功能:

string path = Server.MapPath("PDFs");
 
Document doc = new Document();
try
 
{
 
    PdfWriter.GetInstance(doc, new FileStream(path + "/Anchors.pdf", FileMode.Create));
 
    doc.Open();
 
    Font link = FontFactory.GetFont("Arial", 12, Font.UNDERLINE, new Color(0, 0, 255));
 
    Anchor anchor = new Anchor("www.mikesdotnetting.com", link);
 
    anchor.Reference = "http://www.mikesdotnetting.com";
 
    doc.Add(anchor);
 
}
 
catch (DocumentException dex)
 
{
 
    Response.Write(dex.Message);
 
}
 
catch (IOException ioex)
 
{
 
    Response.Write(ioex.Message);
 
}
 
finally
 
{
 
    doc.Close();
 
}

 

    上面代码创建了一个外部链接,当点击链接后会打开浏览器并导向指定链接.

     1

    

     内部链接在HTML中是通过为<a>标签添加NAME属性来实现的,iTextSharp也是用的这种方法:

Anchor click = new Anchor("Click to go to Target");
 
click.Reference = "#target";
 
Paragraph p1 = new Paragraph();
 
p1.Add(click);
 
doc.Add(p1);
 
 
 
Paragraph p2 = new Paragraph();
 
p2.Add(new Chunk("\n\n\n\n\n\n\n\n"));
 
doc.Add(p2);
 
 
 
Anchor target = new Anchor("This is the Target");
 
target.Name = "target";
 
Paragraph p3 = new Paragraph();
 
p3.Add(target);
 
doc.Add(p3);

 

    第一个段落包含一个就像HTML中<a>一样的指向”#target”的锚记,第二个段落包含了多个换行符,第三个段落包含了一个锚记,并设置成和第一个段落引用名一样的Name.结果是当你点击”Click to go to target”时,PDF现在无论读到哪了,都会导向这个锚记,现在”This is target”会出现在PDF顶端.

    2

   

     锚记的一个代替方案是使用Chunk类的SetLocalGoto()和 SetLocalDestination()方法:

 

Paragraph p4 = new Paragraph();
 
p4.Add(new Chunk("Click "));
 
p4.Add(new Chunk("here", link).SetLocalGoto("GOTO"));
 
p4.Add(new Chunk(" to find local goto"));
 
p4.Add(new Chunk("\n\n\n\n\n\n\n\n\n"));
 
 
 
Paragraph p5 = new Paragraph();
 
p5.Add(new Chunk("Local Goto Destination").SetLocalDestination("GOTO"));
 
 
 
doc.Add(p4);
 
doc.Add(p5);

 

    第一个段落使用的字体传达的意思告诉用户这个是一个超链接,Chunk.SetLocalGoto()接受一个String类型的参数,这个String是锚记的名称。接下来又加入了几个换行符。接下来使用了SetLocalDestination()方法设置当前位置的名称,他和之前定义的SetLocalGoto()方法中的指定的位置名称相对应。当生成PDF时,”Here”有下划线并且是蓝色的,点击后会将PDF导向到”Local Goto Destination”处于最顶端。

 

 

书签

    很多时候你打开一个PDF时,你的PDF浏览程序都会显示一个数状的文档结构,每一个树枝或者叶节点都会链接到一章或者一节,iTextSharp通过Chapter和Section对象提供了生成树状导航的功能.

    书签最大的对象是Chapter,每一个Chapter对象都会另起一页,而Section对象必须加在Chapter对象或其他Section对象之中:

Chapter chapter1 = new Chapter(new Paragraph("This is Chapter 1"),1);
 
Section section1 = chapter1.AddSection(20f, "Section 1.1", 2);
 
Section section2 = chapter1.AddSection(20f, "Section 1.2", 2);
 
Section subsection1 = section2.AddSection(20f, "Subsection 1.2.1", 3);
 
Section subsection2 = section2.AddSection(20f, "Subsection 1.2.2", 3);
 
Section subsubsection = subsection2.AddSection(20f, "Sub Subsection 1.2.2.1", 4);
 
Chapter chapter2 = new Chapter(new Paragraph("This is Chapter 2"), 1);
 
Section section3 = chapter2.AddSection("Section 2.1", 2);
 
Section subsection3 = section3.AddSection("Subsection 2.1.1", 3);
 
Section section4 = chapter2.AddSection("Section 2.2", 2);
 
chapter1.BookmarkTitle = "Changed Title";
 
chapter1.BookmarkOpen = true;
 
chapter2.BookmarkOpen = false;
 
doc.Add(chapter1);
 
doc.Add(chapter2);

 

    3

 

    上面的图片清楚解释了之前的代码。代码开始,创建了一个Chapter对象并传入了一个Paragraph对象作为参数,第二个参数表示当前章是第几章。这里设置为1,然后把一个Section对象加入到当前章,为Section的构造函数传入的三个参数分别为,Float类型的参数代表左边的缩进,第二个String参数代表在书签和页面上显示的节点名称,最后一个参数是当前节点的缩进层次.这个例子中,Section 1.1是树的第二层,SubSection1被加入了Section1.1所以SubSection1是树的第三层。弄懂了上面的解释后,剩下的代码看起来就直接多了。

     最后的代码(chapter1.BookmarkTitle = "Changed Title";)可以通过设置BookmarkTitle属性将树状导航的名字改了,上面代码将Chapter1的BookmarkOpen设置为True将Chapter2的BookmarkOpen设置为False.最后将所有Chapter加入到Document中.

 

    Chapter和Section对内存的消耗是惊人的,所以对于它们的使用也要十分谨慎,如果你需要创建手册一类的PDF文档时,最好将其安排在你的Web服务器空闲时做。

 

 

-----

原文链接:iTextSharp - Links and Bookmarks

translated by CareySon

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
跟我一起学习ASP.NET 4.5 MVC4.0(一)
原文 : http://www.cnblogs.com/xdotnet/archive/2012/03/05/aspnet_mvc40_preview.html   由于上面一个项目使用的是ASP.NET4.0 MVC3.0,在招人的时候发现很多人有听说过MVC,但是却是没用过,对MVC也只是一知半解,最近想给团队成员做一个系统的解说,让大家都可以学习一 下ASP.NET MVC3.0。
1076 0
跟我一起学习ASP.NET 4.5 MVC4.0(二)
原文http://www.cnblogs.com/xdotnet/archive/2012/03/06/aspnet_mvc40_keywords.html 上一篇文章中(跟我一起学习ASP.NET 4.5 MVC4.0(一)) 我们基础的了解了一下ASP.NET MVC4.0的一些比较简单的改变,主要是想对于MVC3.0来说的。
961 0
跟我一起学习ASP.NET 4.5 MVC4.0(三)
原文 http://www.cnblogs.com/xdotnet/archive/2012/03/07/aspnet_mvc40_validate.html 今天我们继续ASP.NET 4.5 MVC 4.0,前两天熟悉了MVC4.0在VS11和win8下的更新,以及MVC中的基础语法和几个关键字的使用。
920 0
跟我一起学习ASP.NET 4.5 MVC4.0(四)
原文http://www.cnblogs.com/xdotnet/archive/2012/03/27/aspnet_mvc4_authorize.html 前几个文章中介绍了一些关于MVC4.0的东东,今天我们来看一下登陆验证,也可以说是 权限验证,即AuthorizeAttribute。
851 0
跟我一起学习ASP.NET 4.5 MVC4.0(五)
原文http://www.cnblogs.com/xdotnet/archive/2012/03/29/aspnet_mvc4_html_control_checkboxlist.html 前面几篇文章介绍了一下ASP.NET MVC中的一些基础,今天我们一起来学习一下在ASP.NET MVC中控件的封装。
884 0
跟我一起学习ASP.NET 4.5 MVC4.0(六)
原文http://www.cnblogs.com/xdotnet/archive/2012/07/21/aspnet40_webpage20.html 这一系列文章跨度有点大,由于最近忙于其他事情,没有更新,今天重新安装了下Win8系 统,VS2012和SQLServer 2012,顺便抽空继续一篇。
968 0
+关注
杰克.陈
一个安静的程序猿~
10424
文章
2
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载