无法使用C#在asp.net中使用iTextSharp API将HTML标记导出为PDF?
我有一个无法使用C#在asp.net中使用iTextSharp API将HTML标记导出为PDF?,c#,asp.net,itextsharp,html-to-pdf,pdf-conversion,C#,Asp.net,Itextsharp,Html To Pdf,Pdf Conversion,我有一个HTML标记,其中包含HTML表和图像。我正在使用itextsharpapi将HTML标记转换为PDF。但是,不幸的是,iTextSharp无法将包含图像和表格的HTML标记导出为PDF 错误:未找到网络路径。 结果必须为: 代码: 使用iTextSharp.text; 使用iTextSharp.text.pdf; 使用iTextSharp.text.html; 使用System.Data.SqlClient; 使用系统文本; 使用iTextSharp.text.html.simple
HTML
标记,其中包含HTML
表
和图像
。我正在使用itextsharpapi
将HTML标记转换为PDF
。但是,不幸的是,iTextSharp
无法将包含图像和表格的HTML
标记导出为PDF
错误:未找到网络路径。
结果必须为:
代码:
使用iTextSharp.text;
使用iTextSharp.text.pdf;
使用iTextSharp.text.html;
使用System.Data.SqlClient;
使用系统文本;
使用iTextSharp.text.html.simpleparser;
公共字符串strSelectUserListBuilder=@”
装箱单
将此纸条放在设备的盒子内。
项目
优惠
iPhone5 32GB(AT&T)
$205.00
总报价:
215.00美元
您必须在2014年1月29日之前发货您的设备。
如果您在到期日后发送设备,我们将无法接受您的初始报价。
我们不接受已报告丢失或被盗的设备
“查找我的iPhone”必须关闭
此功能锁定您的设备,并将延迟或减少付款。
如何停用:
1.轻触主屏幕上的“设置”图标。
2.从设置菜单中点击iCloud。
3.如果“查找我的iPhone”已打开,请点击滑块将其关闭。
";
受保护的无效HTMLToPDF()
{
字符串htmlText=strSelectUserListBuilder.ToString();
文档=新文档();
GetInstance(文档,新文件流(Request.PhysicalApplicationPath+“MySamplePDF.pdf”,FileMode.Create));
document.Open();
iTextSharp.text.html.simpleparser.HTMLWorker hw=
新的iTextSharp.text.html.simpleparser.HTMLWorker(文档);
解析(新的StringReader(htmlText));
document.Close();
}
受保护的无效页面加载(对象发送方、事件参数e)
{
HTMLToPDF();
}
我知道此错误是由于图像路径造成的。但是,无法解决。
有解决办法吗
谢谢你的帮助 看看:
您需要在每个img元素的src属性中提供完整的物理路径(例如,
),或者可以告诉iTextSharp所有图像的物理基本文件夹。我能够通过使用特殊的提供程序正确呈现html
var baseUrl = string.Format("{0}://{1}", Request.Url.Scheme, Request.Url.Authority);
var html = ...;
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
Response.ContentEncoding = Encoding.UTF8;
Response.AddHeader("content-disposition", string.Format("attachment; filename={0}.pdf", fileName));
Response.ContentType = "application/pdf";
using (var ms = new MemoryStream())
{
using (var doc = new Document())
{
using (var writer = PdfWriter.GetInstance(doc, ms))
{
doc.Open();
var rootProvider = new CustomRootProvider(baseUrl, Request.PhysicalApplicationPath); //Server.MapPath(Request.ApplicationPath)
FontFactory.RegisterDirectories();
var htmlContext = new HtmlPipelineContext(null);
htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory());
htmlContext.SetImageProvider(rootProvider);
htmlContext.SetLinkProvider(rootProvider);
htmlContext.CharSet(Encoding.UTF8);
var cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(true);
var pipeline = new CssResolverPipeline(cssResolver,
new HtmlPipeline(htmlContext, new PdfWriterPipeline(doc, writer)));
var worker = new XMLWorker(pipeline, true);
var p = new XMLParser(worker);
using(var htmlStream = new MemoryStream(Encoding.UTF8.GetBytes(html)))
{
p.Parse(htmlStream, Encoding.UTF8);
}
writer.CloseStream = false;
}
doc.Close();
}
ms.Position = 0;
Response.BinaryWrite(ms.ToArray());
}
Response.Flush();
Response.End();
...
public class CustomRootProvider : AbstractImageProvider, ILinkProvider
{
private string _baseUrl;
private string _basePath;
public CustomRootProvider(string baseUrl, string basePath)
{
_baseUrl = baseUrl;
}
public override Image Retrieve(string src)
{
var siteUrl = string.IsNullOrEmpty(_baseUrl) ? HttpContext.Current.Request.Url.AbsoluteUri.Replace(HttpContext.Current.Request.Url.PathAndQuery, string.Empty) : _baseUrl;
siteUrl = VirtualPathUtility.RemoveTrailingSlash(siteUrl);
if (Uri.IsWellFormedUriString(src, UriKind.Relative))
{
src = new Uri(new Uri(siteUrl), src).ToString();
}
try
{
return Image.GetInstance(src);
}
catch (Exception)
{
return Image.GetInstance(new Uri(new Uri(siteUrl), "/Content/Images/noimage.png").ToString());
}
}
public override string GetImageRootPath()
{
return string.IsNullOrEmpty(_basePath) ? HttpContext.Current.Request.PhysicalApplicationPath : _basePath;
//HttpContext.Current.Server.MapPath(HttpContext.Current.Request.ApplicationPath);
}
public string GetLinkRoot()
{
return string.IsNullOrEmpty(_baseUrl)
? HttpContext.Current.Request.Url.AbsoluteUri.Replace(HttpContext.Current.Request.Url.PathAndQuery, string.Empty)
: _baseUrl;
}
}
但在一些主机上,html unicode符号出现了奇怪的问题(在德语机器上可以,但在俄语机器上呈现不正确)。我试图在iTextSharp fontfactory中注册不同的字体,以使用不同的标记(css规则、字体面等)。什么都帮不了我。最后使用wkhtmltopdf和包装器(互联网上提供不同的包装器)。wkhtmltopdf开箱即用,效果非常好!:
var config = new GlobalConfig().SetMargins(0, 0, 0, 0).SetPaperSize(PaperKind.A4);
var pdfWriter = new SynchronizedPechkin(config);
var bytes = pdfWriter.Convert(new Uri(dataUrl));
Response.BinaryWrite(bytes);
强烈推荐 对你有用吗?pdf不是按照我展示的设计创建的。。。!它扭曲了…:(是的,但您是否尝试输入图像的完整物理路径(如我在回答中所建议的)?是的!图像渲染,但它会扭曲布局…:(
var config = new GlobalConfig().SetMargins(0, 0, 0, 0).SetPaperSize(PaperKind.A4);
var pdfWriter = new SynchronizedPechkin(config);
var bytes = pdfWriter.Convert(new Uri(dataUrl));
Response.BinaryWrite(bytes);