在c#中从iTextSharp库导出超链接到pdf文件

时间:2015-09-29 08:56:07

标签: c# asp.net itextsharp

我在使用iTextSharp Library的c#asp net中的pdf文件中导出一个GridView时遇到问题。

在最后一栏中,我预计会有超链接,但在输出pdf中我会截断链接并且不存在连接,并以“找不到页面”错误作出响应。

请检查附件图片和代码c#。

有人知道如何解决这个问题?

提前谢谢。

enter image description here

   <asp:TemplateField HeaderText="hlKvm" ItemStyle-HorizontalAlign="Center">
        <ItemTemplate>
            <asp:HyperLink ID="hlKvm" runat="server" NavigateUrl='<%# Eval("Kvm").ToString() %>'
                ImageUrl='<%#(String.IsNullOrEmpty(Eval("Kvm").ToString()) ? "/mac/Images/TRKO8.png" : "/Images/download.gif")%>'
                ToolTip='<%#(String.IsNullOrEmpty(Eval("Kvm").ToString()) ? "" : "")%>'
                Target="_blank" BorderStyle="None" ForeColor="Transparent">
            </asp:HyperLink>
        </ItemTemplate>
    </asp:TemplateField>



    cellText = (gvProducts.Rows[rowIndex].Cells[16].FindControl("hlKvm") as HyperLink).NavigateUrl;

编辑#1

这是Anchor方法的代码,请查看附图和下面的代码。

                        cellText = (gvProducts.Rows[rowIndex].Cells[16].FindControl("hlKvm") as HyperLink).NavigateUrl;
                        string imagePath = Server.MapPath((gvProducts.Rows[rowIndex].Cells[16].FindControl("hlKvm") as HyperLink).ImageUrl);
                        iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(imagePath);
                        Chunk cImage = new Chunk(image, 0, 0, false);
                        Anchor anchor = new Anchor(cImage);
                        anchor.Reference = cellText.ToString();
                        table.AddCell(anchor);

enter image description here

编辑#2

如果尝试选项1 ,则输出为:

enter image description here

如果尝试选项2 ,则输出为:

Invalid URI: The URI is empty. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.UriFormatException: Invalid URI: The URI is empty.

Source Error: 


Line 772:                            iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(imagePath);
Line 773:                            Chunk cImage = new Chunk(image, 0, 0, false);
Line 774:                            cImage.SetAction(new PdfAction(new Uri(cellText.ToString())));
Line 775:                            table.AddCell(new Phrase(cImage));
Line 776:

如果选中选项2 且选中 cellText 为空,则输出为:

enter image description here

但是图像没有与gridview对齐......

1 个答案:

答案 0 :(得分:0)

您目前拥有以下代码:

cellText = (gvProducts.Rows[rowIndex].Cells[16].FindControl("hlKvm") as HyperLink).NavigateUrl;
string imagePath = Server.MapPath((gvProducts.Rows[rowIndex].Cells[16].FindControl("hlKvm") as HyperLink).ImageUrl);
iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(imagePath);
Chunk cImage = new Chunk(image, 0, 0, false);
Anchor anchor = new Anchor(cImage);
anchor.Reference = cellText.ToString();
table.AddCell(anchor);

Anchor的上下文中使用PdfPCell在旧版本的iTextSharp中无效。我认为这是在不久前修复的。

但是,有一些替代方法可以实现相同的结果:

选项1:使用SetAction代替Anchor

cellText = (gvProducts.Rows[rowIndex].Cells[16].FindControl("hlKvm") as HyperLink).NavigateUrl;
string imagePath = Server.MapPath((gvProducts.Rows[rowIndex].Cells[16].FindControl("hlKvm") as HyperLink).ImageUrl);
iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(imagePath);
Chunk cImage = new Chunk(image, 0, 0, false);
cImage.SetAction(new PdfAction(new Uri(cellText.ToString())));
table.AddCell(new Phrase(cImage));

PdfAction采用网址,SetAction会创建链接注释以打开该网址。

选项2:使图片可点击:

cellText = (gvProducts.Rows[rowIndex].Cells[16].FindControl("hlKvm") as HyperLink).NavigateUrl;
string imagePath = Server.MapPath((gvProducts.Rows[rowIndex].Cells[16].FindControl("hlKvm") as HyperLink).ImageUrl);
iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(imagePath);
Annotation annotation = new Annotation(0, 0, 0, 0, cellText);
image.Annotation = annotation;
table.AddCell(image);

可能还有其他选择,但首先尝试这两个选项,让我知道它们是否适合您。

更新#1:(与您的编辑#2相对应,第二部分)

如果您尝试创建PdfPCell

,该怎么办?
PdfPCell cell = new PdfPCell(image, true);
table.AddCell(cell);

现在,image对象将被缩放,以便它正确地适合单元格。

更新#2:(与您的编辑#2相对应,第一部分)

这不是iText例外:

  

无效的URI:URI为空。

此问题可能是由cellText.ToString()的值引起的。如果这不是有效的网址(例如,因为它是空的),那么您将获得例外。

概念证明

我写了一个概念证明,希望我能说服你,我说的是真的,希望其他读者在我说iText工作正常时相信我(而不是在你声称时相信你相反的。)

这是我的例子:ImagesLinksTable

这是生成的PDF:images_links_table.pdf

在这个例子中,我使用了三种不同的技术。他们都工作:

技术1:使用Anchor

Image img = Image.getInstance(IMG);
Chunk c = new Chunk(img, 0, 0, true);
Anchor anchor = new Anchor(c);
anchor.setReference("http://lowagie.com/");
table.addCell(anchor);

我创建了一个Image,我将其打包成Chunk,并在Chunk中使用此Anchor。我将Anchor添加到表中。这没有任何问题。

技术2:使用setAction()

Chunk c2 = new Chunk(img, 0, 0, true);
c2.setAction(new PdfAction("http://itextpdf.com"));
table.addCell(new Phrase(c2));

在这种情况下,我们不使用Anchor,但我将链接定义为操作。为什么要创建新的Chunk对象?如果我使用与以前相同的Chunk,那么我只能为Chunk使用一个网址。

技术3:

Image img2 = Image.getInstance(IMG);
Annotation a = new Annotation(0, 0, 0, 0, "http://lowagie.com/bio");
img2.setAnnotation(a);
table.addCell(img2);

在这种情况下,我在图像级别定义链接,但在这里我还必须创建一个新图像。如果我重复使用之前使用的图像,那么所有图像都会指向同一个链接。

这就是我的PDF:

enter image description here

如您所见,图像非常适合细胞。您可以轻松调整代码以更改Image的大小和/或确保图像缩放(或不缩放)以匹配单元格的大小。

我的例子是用Java编写的,但是如果你使用iTextSharp端口,如果你将我的例子移植到C#,你将获得相同的结果。