【发布时间】:2016-01-25 18:44:35
【问题描述】:
我正在尝试从 HTML 字符串和外部 css 文件生成 PDF 文件并将 PDF 保存到磁盘。从这个例子可以看出,我使用的是非常简单的 html。我知道 css 文件通过查看智能感知被读入 ccsResolver。
这是我正在使用的代码:
internal string Create(PdfDocumentDefinition documentDefinition)
{
MemoryStream output = new MemoryStream();
MemoryStream input = new MemoryStream(Encoding.UTF8.GetBytes("<html><head></head><body>Hello, World!</body></html>"));
string pathName = @WebConfigurationManager.AppSettings["StagingPath"] + documentDefinition.DocumentName + ".pdf";
Document document = new Document(PageSize.A4, 30, 30, 30, 30);
PdfWriter writer = PdfWriter.GetInstance(document, output);
using (output)
{
using (document)
{
document.Open();
CssResolverPipeline pipeline = SetCssResolver(documentDefinition.CssFiles, document, writer);
XMLWorker worker = new XMLWorker(pipeline, true);
XMLParser parser = new XMLParser(worker);
parser.Parse(input);
output.Position = 0;
}
Byte[] data = output.ToArray();
File.WriteAllBytes(pathName, data);
}
return pathName;
}
private CssResolverPipeline SetCssResolver(List<String> cssFiles, Document document, PdfWriter writer)
{
var htmlContext = new HtmlPipelineContext(null);
htmlContext.SetTagFactory(iTextSharp.tool.xml.html.Tags.GetHtmlTagProcessorFactory());
ICSSResolver cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(false);
if (cssFiles != null)
{
foreach (String cssFile in cssFiles)
{
//cssResolver.AddCssFile(cssFile, true);
}
}
return new CssResolverPipeline(cssResolver, new HtmlPipeline(htmlContext, new PdfWriterPipeline(document, writer)));
}
这是在 NotePad++ 中查看的输出:
2 0 obj
<</Length 117/Filter/FlateDecode>>stream
xœ+ä*ä2гP€á¢t.c 256U0·0R(JåJã
ĪÊÜÒXÏÔHÁÌBÏÌBÁÐPÏ¢Ø@!¨¤Å)¤ÌÂÐH!$(¬khbè»*€„Ò¸4<RsròuÂó‹rR5C²€Š@J\C€ú¼i!*
endstream
endobj
4 0 obj
<</Type/Page/MediaBox[0 0 595 842]/Resources<</Font<</F1 1 0 R>>>>/Contents 2 0 R/Parent 3 0 R>>
endobj
1 0 obj
<</Type/Font/Subtype/Type1/BaseFont/Helvetica/Encoding/WinAnsiEncoding>>
endobj
3 0 obj
<</Type/Pages/Count 1/Kids[4 0 R]>>
endobj
5 0 obj
<</Type/Catalog/Pages 3 0 R>>
endobj
6 0 obj
<</Producer(iTextSharp’ 5.5.7 ©2000-2015 iText Group NV \(AGPL-version\))/CreationDate(D:20151026102026-05'00')/ModDate(D:20151026102026-05'00')>>
endobj
xref
0 7
0000000000 65535 f
0000000311 00000 n
0000000015 00000 n
0000000399 00000 n
0000000199 00000 n
0000000450 00000 n
0000000495 00000 n
trailer
<</Size 7/Root 5 0 R/Info 6 0 R/ID [<055082e8139638e35ce08dedae069690><055082e8139638e35ce08dedae069690>]>>
%iText-5.5.7
startxref
657
%%EOF
我已经为此工作了大约 4 个小时。谁能看到为什么它没有生成有效的 PDF?
【问题讨论】:
-
您想使用
FileStream而不是MemoryStream谷歌也可以非常有用地帮助您找到示例这里是一个帮助您入门的链接.. mikesdotnetting.com/article/80/… -
这对我不起作用。我需要将 HTML 作为字符串发送到方法中。无法从文件中读取。 PDFWriter 类是否不适用于 MemoryStream?
-
而且,顺便说一句,我在过去 4 个小时的大部分时间里都在搜索 Google。
-
如果你摆脱
output.Position = 0;会发生什么 -
删除输出。位置根本没有任何区别。
标签: c# pdf-generation itextsharp