底线是我使用iTextSharp将HTML写成一个PDF --带有图像的。现在,我正在使用iTextSharp的最新版本,即5.5.5.0。我可以访问布鲁诺氏图书,我正在使用demo.iTextSupport.com给出的方法进行转换。不幸的是,XMLWorkerHelper,似乎没有对这本书的任何引用,而这正是我从这本书创建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做一些技巧。
所以,我制作了我自己的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中,但是我宁愿先看看是否还有其他的解决方案。
所以,你可以看到我尝试过的。我很感谢你能提供的任何其他帮助。
发布于 2015-03-26 15:06:52
书中没有提到XML,因为这本书是在2009年编写的,关于XML的开发是在2011年开始的。您的问题很长,但是它缺少一个重要的元素:类似为沙箱实例提供的HTML示例(您没有提到)。例如:当使用thoreau.html解析ParseHtmlImagesLinksOops示例时,我们丢失了所有的图像:oops.pdf;当我们使用ParseHtmlImagesLinks时,我们使用了一个ImageProvider,它确保我们获得了正确的图像路径,结果看起来很好:thoreau.pdf (顺便说一句,链接也是这样)。
然而,当我看到实际的需求时,我看到您想要创建一个带有字母头图像的字母。在这种情况下,我会使用页面事件将公司固定添加到每个页面。这本书解释了如何做到这一点。
https://stackoverflow.com/questions/29281040
复制相似问题