我在使用iTextSharp Library的c#asp net中的pdf文件中导出一个GridView时遇到问题。
在最后一栏中,我预计会有超链接,但在输出pdf中我会截断链接并且不存在连接,并以“找不到页面”错误作出响应。
请检查附件图片和代码c#。
有人知道如何解决这个问题?
提前谢谢。
<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);
编辑#2
如果尝试选项1 ,则输出为:
如果尝试选项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 为空,则输出为:
但是图像没有与gridview对齐......
答案 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:
如您所见,图像非常适合细胞。您可以轻松调整代码以更改Image
的大小和/或确保图像缩放(或不缩放)以匹配单元格的大小。
我的例子是用Java编写的,但是如果你使用iTextSharp端口,如果你将我的例子移植到C#,你将获得相同的结果。