底线是我正在使用 iTextSharp 将 HTML 写入 PDF --带有图像。现在,我使用的是 iTextSharp 的最新版本,即 5.5.5.0。我可以访问Bruno's书,我正在使用所阐述的方法demo.iTextSupport.com用于转换。很遗憾,the book似乎没有任何参考XMLWorker助手,这就是我用来从 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 中。
额外的研究表明我可以通过 IElements 做一些技巧克里斯·哈斯精彩的帖子在这里.
所以,我像 Chris 展示的那样制作了自己的 IElementHandler(除了我做的事情很长,请耐心等待):
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,也许我可以用它做点什么,但我真的不是这里的专家,我觉得我正在掉进兔子洞没有爱丽丝来引导我。
额外的搜索表明有一种方法获取嵌入的图像,但我并不热衷于为我的图像生成二进制文本图像字符串并将其加载到 HTML 中,就像此解决方案所做的那样。我希望能够根据需要选择和更改图像。我想我可以创建一种方法来获取图像,创建这个二进制文本,并将其插入到我的 HTML 中,但我宁愿先看看是否有其他解决方案。
所以,你可以看看我尝试过什么。如果您能提供任何其他帮助,我将不胜感激。