无法导出HTML标记使用C#中使用iTextSharp的API在asp.net PDF?
我有一个 HTML
标记 HTML
表
和图片
在里面。我使用 iTextSharp的API
到 HTML标记转换为PDF
。但是,不幸的是, iTextSharp的
未能导出含有图片及的 HTML
标记;表为PDF。
I have an HTML
markup which has HTML
Table
and Images
in it. I am using iTextSharp API
to convert the HTML markup to PDF
. But, unfortunately the iTextSharp
fails to export the HTML
markup containing the Images & Table to PDF.
错误:网络路径找不到
结果必然是:
Result must be:
code:
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.text.html;
using System.Data.SqlClient;
using System.Text;
using iTextSharp.text.html.simpleparser;
public string strSelectUserListBuilder = @" <div style='width: 50%; border: 1 solid #000000; padding-bottom: 100; padding-left: 100;
padding-right: 100; text-align: justify; text-justify: inter-word;'>
<br />
<table>
<tr>
<td>
<div id='divLeft'>
<p>
<img src='/images/log_out.png' width='200' height='100' /></p>
<h2>
Packing slip</h2>
<h3>
Place this slip inside the box with your device.</h3>
<div id='divDeviceList' style='width: 600; text-align: left;' border='0' cellpadding='3'
cellspacing='1' rules='BOTH' frame='BOX'>
<table style='width: 600;'>
<tr>
<td>
<strong> ITEM</strong>
</td>
<td>
<strong> OFFER</strong>
</td>
</tr>
<tr>
<td>
iPhone 5 32GB (AT&T)
</td>
<td>
$205.00
</td>
</tr>
<tr>
<td align='right'>
<hr />
<strong><h3>Total Offer: </h3></strong>
</td>
<td>
<hr />
<strong> <h3> $215.00</h3></strong>
</td>
</tr>
</table>
</div>
<h3>
You have until 01/29/2014 to ship your device.</h3>
<p style='padding:10;'>
<i>If you send your device after the expiration date we cannot honor your initial offer.
We will not accept devices that have been reported lost or stolen.</i></p>
<br />
</div>
</td>
<td>
<div id='divRight'>
<div style='text-align:right;padding:15;'> <img src='/images/google-login.png' alt='barcode' /></div>
<table cellpadding='3' style='border: 1 solid orange;padding:20;'>
</tr>
<tr align='center'>
<td>
<img src='/images/google-login.png' />
</td>
</tr>
<tr>
<td>
<h3>
'Find my iPhone' must be turned off</h3>
</td>
</tr>
<tr>
<td>
This feature locks your device and will delay or reduce payment.
</td>
</tr>
<tr>
<td>
<strong>How to deactivate:</strong></td>
</tr>
<tr>
<td>
1. Tap the "settings" icon on your homescreen.</td>
</tr>
<tr>
<td>
2. Tap iCloud from the settings menu. </td>
</tr>
<tr>
<td>
3. If 'Find My iPhone' is on, tap the slider to turn it off.</td>
</tr>
</table>
</div>";
protected void HTMLToPDF()
{
String htmlText = strSelectUserListBuilder.ToString();
Document document = new Document();
PdfWriter.GetInstance(document, new FileStream(Request.PhysicalApplicationPath + "MySamplePDF.pdf", FileMode.Create));
document.Open();
iTextSharp.text.html.simpleparser.HTMLWorker hw =
new iTextSharp.text.html.simpleparser.HTMLWorker(document);
hw.Parse(new StringReader(htmlText));
document.Close();
}
protected void Page_Load(object sender, EventArgs e)
{
HTMLToPDF();
}
我知道这个错误是由于图片的路径。但是,不能够解决。
任何解决方案?
帮助鸭preciated!
Help Appreciated!
我能够通过useiung特殊提供商正确地呈现我的HTML
I was able to render my html correctly by useiung special providers
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 UNI code符号奇怪的问题(OK,在德国的机器,但俄罗斯不正确渲染)。我试图用iTextSharp的fontfactory注册differern字体,用不同的标记(CSS规则,字体面孔等等)玩。没有什么帮助了我。这是用wkhtmltopdf与包装结束 Pechkin (在互联网上提供不同的包装)。 wkhtmltopdf的作品好了开箱!
But was having strange problems with html unicode symbols on some hosting machines (ok in german machine but incorrect rendering on russian). I was trying to register differern fonts with iTextSharp fontfactory, to play with different markup (css rules, font-faces etc). Nothing helped me. This was ended with using wkhtmltopdf with wrapper Pechkin (different wrappers available on the internet). wkhtmltopdf works just great out of the box!:
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);
强烈推荐!