C# 在c中使用itextsharp将图像转换为Pdf#
我想使用itextsharp将包含图像和gridview的页面转换为pdf格式。下面是我的代码C# 在c中使用itextsharp将图像转换为Pdf#,c#,pdf,itextsharp,C#,Pdf,Itextsharp,我想使用itextsharp将包含图像和gridview的页面转换为pdf格式。下面是我的代码 string attachment = "attachment; filename=Report.pdf"; Response.ClearContent(); Response.AddHeader("content-disposition", attachment); Response.ContentType = "application/pdf";
string attachment = "attachment; filename=Report.pdf";
Response.ClearContent();
Response.AddHeader("content-disposition", attachment);
Response.ContentType = "application/pdf";
StringWriter stw = new StringWriter();
HtmlTextWriter htextw = new HtmlTextWriter(stw);
divText.RenderControl(htextw); //image is place inside
GridView1.RenderControl(htextw);
Document document = new Document();
PdfWriter.GetInstance(document, Response.OutputStream);
document.Open();
StringReader str = new StringReader(stw.ToString());
HTMLWorker htmlworker = new HTMLWorker(document);
htmlworker.Parse(str);
document.Close();
Response.Write(document);
Response.End();
我成功地将gridview转换为pdf,但无法转换图像。图像放置在div调用divText中。有人可以帮我吗?我建议尝试以下代码并根据您的要求进行修改
public static void ConvertImageToPdf(string srcFilename, string dstFilename)
{
iTextSharp.text.Rectangle pageSize = null;
using (var srcImage = new Bitmap(srcFilename))
{
pageSize = new iTextSharp.text.Rectangle(0, 0, srcImage.Width, srcImage.Height);
}
using (var ms = new MemoryStream())
{
var document = new iTextSharp.text.Document(pageSize, 0, 0, 0, 0);
iTextSharp.text.pdf.PdfWriter.GetInstance(document, ms).SetFullCompression();
document.Open();
var image = iTextSharp.text.Image.GetInstance(srcFilename);
document.Add(image);
document.Close();
File.WriteAllBytes(dstFilename, ms.ToArray());
}
}
也指
以上代码的解释
更改图像URL路径,如“C:\images\Filename.jpg”您的代码示例看起来不错,但缺少
IImageProvider的实现。默认情况下,HTMLWorker
只能处理带有绝对URL的图像。因此,这里有一个简单的实现让您开始:
// handle <img> tags in any System.Web.UI.Control (GridView) with:
// 1. base64 Data URI scheme - https://en.wikipedia.org/wiki/Data_URI_scheme
// 2. relative URLs on local server
// 3. absolute URLs on a remote/local server (DEFAULT)
public class ImageHander : IImageProvider
{
public string BaseUri { get; set; }
public static Regex Base64 = new Regex(
@"^data:image/(?<mediaType>[^;]+);base64,(?<data>.*)",
RegexOptions.Compiled
);
// alias: using iTextImage = iTextSharp.text.Image;
public iTextImage GetImage(string src,
IDictionary<string, string> attrs,
ChainedProperties chain,
IDocListener doc)
{
Match match;
// [1]
if ((match = Base64.Match(src)).Length > 0)
{
return iTextImage.GetInstance(
Convert.FromBase64String(match.Groups["data"].Value)
);
}
// [2]
if (!src.StartsWith("http", StringComparison.OrdinalIgnoreCase))
{
src = HttpContext.Current.Server.MapPath(
new Uri(new Uri(BaseUri), src).AbsolutePath
);
}
return iTextImage.GetInstance(src);
}
}
//句柄属性,
ChainedProperties链,
IDocListener(文件)
{
匹配;
// [1]
如果((match=Base64.match(src)).Length>0)
{
返回iTextImage.GetInstance(
转换.FromBase64String(匹配.Groups[“数据”].Value)
);
}
// [2]
if(!src.StartsWith(“http”,StringComparison.OrdinalIgnoreCase))
{
src=HttpContext.Current.Server.MapPath(
新Uri(新Uri(BaseUri),src.AbsolutePath
);
}
返回iTextImage.GetInstance(src);
}
}
然后在代码隐藏中使用如下实现(按钮事件处理程序):
受保护的void ProcessHtml(对象发送方,CommandEventArgs e)
{
Response.ContentType=“application/pdf”;
AppendHeader(“内容处置”、“附件;文件名=table.pdf”);
使用(文档=新文档())
{
GetInstance(文档、响应、输出流);
document.Open();
var html=新的StringBuilder();
使用(var stringWriter=newstringwriter(html))
{
使用(var htmlWriter=new HtmlTextWriter(stringWriter))
{
//将“ConvertControlToPdf”替换为**您的**GridView控件Id!
ConvertControlToPdf.RenderControl(htmlWriter);
}
}
var providers=newdictionary();
//HTMLWorker**不**理解相对URL,因此
//将HTML源代码中现有的设置为绝对,并处理
//base64数据URI方案
var ih=newimagehander(){BaseUri=Request.Url.ToString()};
//字典键“img\u provider”是**硬编码**,在
//iTextSharp 5.0.0-5.0.5,因此您可能需要使用下一行
//供应商。添加(“img_供应商”,ih);
providers.Add(HTMLWorker.IMG_PROVIDER,ih);
//^^^^^^^^^^^^^^^^^^^^^^^^^^-在5.0.6中添加的常量
使用(var sr=newStringReader(html.ToString()))
{
foreach(HTMLWorker.parsetList中的IEElement元素(
sr,空,提供程序)
{
PdfPTable table=作为PdfPTable的元素;
文件。添加(元素);
}
}
}
Response.End();
}
不确定您运行的是哪个版本的iTextSharp,因此请注意上面关于HTMLWorker.IMG\u提供者的内联注释。
const
。图像是如何引用的?Base64 URL?相对URL?绝对URL?不相关,但删除行Response.Write(文档)
在文档
对象上直接调用ToString()
,该对象不覆盖默认值,因此您实际上将文本iTextSharp.text.Document
写入每个文件的末尾,并最终生成损坏的PDF。回到问题,我们需要看到stw.ToString()
的缩写版本,因为HTMLWorker
只适用于HTML,而不适用于GridView,这才是最重要的。
protected void ProcessHtml(object sender, CommandEventArgs e)
{
Response.ContentType = "application/pdf";
Response.AppendHeader("Content-Disposition", "attachment; filename=table.pdf");
using (Document document = new Document())
{
PdfWriter.GetInstance(document, Response.OutputStream);
document.Open();
var html = new StringBuilder();
using (var stringWriter = new StringWriter(html))
{
using (var htmlWriter = new HtmlTextWriter(stringWriter))
{
// replace 'ConvertControlToPdf' with **YOUR** GridView control Id!
ConvertControlToPdf.RenderControl(htmlWriter);
}
}
var providers = new Dictionary<string, Object>();
// HTMLWorker does **NOT** understand relative URLs, so
// make existing ones in HTML source absolute, and handle
// base64 Data URI schemes
var ih = new ImageHander() { BaseUri = Request.Url.ToString() };
// dictionary key 'img_provider' is **HARD-CODED**, in
// iTextSharp 5.0.0 - 5.0.5, so you may need to use next line
// providers.Add("img_provider", ih);
providers.Add(HTMLWorker.IMG_PROVIDER, ih);
// ^^^^^^^^^^^^^^^^^^^^^^^ - constant added in 5.0.6
using (var sr = new StringReader(html.ToString()))
{
foreach (IElement element in HTMLWorker.ParseToList(
sr, null, providers))
{
PdfPTable table = element as PdfPTable;
document.Add(element);
}
}
}
Response.End();
}