2015-09-29 3 views
0

У меня есть проблема при экспорте в pdf файл один GridView в C# asp net с iTextSharp Library.Экспорт гиперссылки в pdf-файл из библиотеки iTextSharp в C#

В последнем столбце я ожидал гиперссылку, но в выходном 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

Edit # 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 с проверяемой Текст_ячейки равна нулю выход:

enter image description here

Но образ не совпадает с GridView .. .

+0

Если вы хотите добавить гиперссылку, вам нужно создать 'Anchor' или ссылку' PdfAnnotation'. Меня это удивило бы, если бы кто-нибудь был удивлен поведением, которое вы описываете. Очень нормально, что ссылка сломана, потому что (1) вы не предоставляете ссылку, (2) в вашем случае вы можете щелкнуть ссылку, потому что средство просмотра преобразует текст, который начинается с http: // в ссылку: (а) не каждый зритель сделает это, (б) вы только предоставляете часть URL-адреса, следовательно, ссылка не работает. –

+0

@BrunoLowagie привет, спасибо за ответ, я пробовал с изображением Anchor, но выход потерял выравнивание. У вас есть пример для PdfAnnotation? –

+0

(1.) 'Anchor' работает, поэтому, пожалуйста, покажите нам, что вы пробовали. Возможно, вы делаете это неправильно. (2.) Проверьте [эти примеры] (http://tinyurl.com/itextsharpIIA2C07). Пример LinkActions использует 'Chunk.SetAnchor()', примеры MoviePosters1 используют 'Annotation', в примере TimeTableAnnotations2 используется' PdfAnnotation'. На самом деле, как только вы начнете читать документацию (или я должен сказать * если * вы начнете читать документацию), вы можете найти довольно некоторые примеры ... –

ответ

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 принимает URL и SetAction создаст ссылку аннотацию, чтобы открыть этот URL.

Вариант 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); 

Там могут быть и другие варианты, но начать пытаться эти два, и дайте мне знать, если они работают для вас.

Update # 1: (соответствует с Edit # 2, вторая часть)

Что делать, если вы пытаетесь создать PdfPCell:

PdfPCell cell = new PdfPCell(image, true); 
table.AddCell(cell); 

Теперь image объект будет масштабируется таким образом, что он правильно подходит ячейке.

Update # 2: (соответствует с Edit # 2, первая часть)

Это не является исключением IText:

Invalid URI: URI, пуст.

Эта проблема, вероятно, вызвана значением cellText.ToString(). Если это не действительный URL (например, потому что он пуст), вы получаете исключение.

Доказательство КОНЦЕПЦИИ

Я написал доказательство концепции в надежде, что я могу убедить вас, что я говорю, правда, и в надежде на то, что другие читатели верят мне, когда я говорю, что 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, как и раньше, я могу использовать только один URL для этого 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#, вы получите тот же результат.

+0

Большое спасибо за предложения, см. ** Редактировать # 2 ** в моем первом вопросе –

+0

Я использую версию iTextSharp 5.5.7 - 17/09/2015 –

+0

Это странно. Я не заметил этого в версии Java. Я должен спросить людей, которые сделали порт C#, чтобы проверить это. –

Смежные вопросы