【发布时间】:2015-05-30 14:55:12
【问题描述】:
底线是我正在使用 iTextSharp 将 HTML 写入 PDF -- 带有图像。现在,我使用的是 iTextSharp 的最新版本,即 5.5.5.0。我可以访问Bruno's 书,并且我正在使用demo.iTextSupport.com 说明的方法进行转换。不幸的是,the book 似乎没有对 XMLWorkerHelper 的任何引用,这是我用来从 HTML 创建 PDF 的工具。
这是我终于开始使用的方法,它成功地从格式良好的 HTML 字符串生成了 PDF:
private string createPDFFromHtml(string htmlString, string outputFileName)
{
string result = string.Empty;
try
{
if (!string.IsNullOrEmpty(htmlString) && !string.IsNullOrEmpty(outputFileName) && !File.Exists(outputFileName))
{
using (FileStream fos = new FileStream(outputFileName, FileMode.Create))
{
using (MemoryStream inputMemoryStream = new MemoryStream(Encoding.ASCII.GetBytes(htmlString)))
{
using (TextReader textReader = new StreamReader(inputMemoryStream, Encoding.ASCII))
{
using (Document pdfDoc = new Document())
{
using (PdfWriter pdfWriter = PdfWriter.GetInstance(pdfDoc, fos))
{
XMLWorkerHelper helper = XMLWorkerHelper.GetInstance();
pdfDoc.Open();
helper.ParseXHtml(pdfWriter, pdfDoc, textReader);
result = "Successfully Created new HTML--> PDF Document!";
pdfWriter.CloseStream = false;
}
}
}
}
}
}
}
catch (Exception ex)
{
result = "Exception: " + ex.Message;
}
return result;
}
这行得通,我想做的是创建一个带有信头图像的字母,而该图像只是我在硬盘驱动器某处放置的一些 JPG。
这是我尝试过的,但是虽然它成功地将图像准确地放置在我想要的位置以及我想要的位置,但 PDF 的其余部分却严重截断了输出。
private string createPDFFromHtmlWithImage(string htmlString, string outputFileName, string headerImagePath)
{
string result = string.Empty;
try
{
if (!string.IsNullOrEmpty(htmlString) && !string.IsNullOrEmpty(outputFileName) && !File.Exists(outputFileName))
{
using (FileStream fos = new FileStream(outputFileName, FileMode.Create))
{
using (MemoryStream inputMemoryStream = new MemoryStream(Encoding.ASCII.GetBytes(htmlString)))
{
using (TextReader textReader = new StreamReader(inputMemoryStream, Encoding.ASCII))
{
using (Document pdfDoc = new Document())
{
using (PdfWriter pdfWriter = PdfWriter.GetInstance(pdfDoc, fos))
{
pdfDoc.Open();
Image img = Image.GetInstance(headerImagePath);
if (img != null)
{
img.ScaleToFit(540f, 300f);
pdfDoc.Add(img);
}
XMLWorkerHelper helper = XMLWorkerHelper.GetInstance();
helper.ParseXHtml(pdfWriter, pdfDoc, textReader);
result = "Successfully Created new HTML--> PDF Document!";
pdfWriter.CloseStream = false;
}
}
}
}
}
}
}
catch (Exception ex)
{
result = "Exception: " + ex.Message;
}
return result;
}
结果是 PDF 有我想要的图像,然后基本上是我的 HTML 的第一个(但即使是那个 DIV 也没有完全显示),然后没有别的了。
所以,我想我可能不仅需要将 textReader 放入 pdfDoc 中,还可能需要做一些“添加”。
而且……这就是我迷路的地方。
我想我仍然需要使用 XMLWorkerHelper,但我需要使用 IElementHandler 做一些事情,而不是仅仅将整个东西塞进 pdfWriter。
Additional research 表明我可以通过Chris Haas wonderful post here 使用 IElements 做一些技巧。
所以,我制作了自己的 IElementHandler,就像 Chris 展示的一样(除了我做的事情很长,请多多包涵):
public class HtmlElementHandler : IElementHandler
{
public List<IElement> elementList = new List<IElement>();
public void Add(IWritable e)
{
if (e != null && e is WritableElement)
{
WritableElement we = e as WritableElement;
if (we != null)
{
IList<IElement> weList = we.Elements();
if (weList.Any())
{
elementList.AddRange(weList);
}
}
}
}
}
现在使用这个代码:
private string createPDFFromHtmlWithImageElemental(string htmlString, string outputFileName, string headerImagePath)
{
string result = string.Empty;
try
{
if (!string.IsNullOrEmpty(htmlString) && !string.IsNullOrEmpty(outputFileName) && !File.Exists(outputFileName))
{
using (FileStream fos = new FileStream(outputFileName, FileMode.Create))
{
using (MemoryStream inputMemoryStream = new MemoryStream(Encoding.ASCII.GetBytes(htmlString)))
{
using (TextReader textReader = new StreamReader(inputMemoryStream, Encoding.ASCII))
{
using (Document pdfDoc = new Document())
{
using (PdfWriter pdfWriter = PdfWriter.GetInstance(pdfDoc, fos))
{
pdfDoc.Open();
Image img = Image.GetInstance(headerImagePath);
if (img != null)
{
img.ScaleToFit(540f, 300f);
pdfDoc.Add(img);
}
HtmlElementHandler htmlElementHandler = new HtmlElementHandler();
XMLWorkerHelper helper = XMLWorkerHelper.GetInstance();
helper.ParseXHtml(htmlElementHandler, inputMemoryStream, Encoding.ASCII);
foreach (IElement ielement in htmlElementHandler.elementList)
{
pdfDoc.Add(ielement);
}
result = "Successfully Created new HTML--> PDF Document!";
pdfWriter.CloseStream = false;
}
}
}
}
}
}
}
catch (Exception ex)
{
result = "Exception: " + ex.Message;
}
return result;
}
我得到了与以前一样将整个内容放入 pdfDoc 中的完全相同的结果。
我可以看到我的元素实际上是一个带有内容的 iTextShartp.text.pdf.PdfDiv,也许我可以用它做点什么,但我真的不是这里的专家,我觉得我要失败了没有爱丽丝指导我的兔子洞。
其他搜索表明有一种方法可以get an image embedded,但我并不热衷于为我的图像生成二进制文本图像字符串并将其加载到 HTML 中,就像这个解决方案一样。我希望能够根据需要选择和更改图像。我想我可以创建一种方法来获取图像,创建此二进制文本并将其插入到我的 HTML 中,但我宁愿先看看是否有其他解决方案。
所以,你可以看到我的尝试。如果您能提供任何其他帮助,我将不胜感激。
【问题讨论】:
标签: c# html pdf itextsharp