Когда объект PageEvent добавлен для создания верхнего и нижнего колонтитула, кажется, он пытается записать в поток после его закрытия. Я не уверен, где разместить событие страницы. Если я удаляю событие страницы, он генерирует PDF-файл.PageEvent бросает вызов Не удается получить доступ к закрытому потоку
p.Parse(html);
, где «Не удается получить доступ к закрытому потоку» не удается. Удаление writer.PageEvent
приведет к тому, что Parse будет работать, но тогда он не будет генерировать верхний/нижний колонтитул.
Я использовал страницу this как ссылку для кода верхнего колонтитула.
Код:
try {
using(var stream = new MemoryStream()) {
using(var document = new Document(PageSize.LETTER, 20 f, 20 f, 5 f, 5 f)) {
using(var writer = PdfWriter.GetInstance(document, stream)) {
HtmlPipelineContext htmlContext = new HtmlPipelineContext(null);
writer.PageEvent = new HeaderFooter(Header, Footer); // if I remove this it generates fine but then I don't get a header/footer.
var tagProcessors = (DefaultTagProcessorFactory) Tags.GetHtmlTagProcessorFactory();
tagProcessors.RemoveProcessor(HTML.Tag.IMG); // remove the default processor
tagProcessors.AddProcessor(HTML.Tag.IMG, new CustomImageTagProcessor()); // use our new processor
htmlContext.SetTagFactory(tagProcessors);
ICSSResolver CssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(true);
CssResolver.AddCss(Css, true);
IPipeline pipeline =
new CssResolverPipeline(CssResolver,
new HtmlPipeline(htmlContext,
new PdfWriterPipeline(document, writer)));
XMLWorker worker = new XMLWorker(pipeline, true);
XMLParser p = new XMLParser(worker);
document.Open();
using(var html = new StringReader(HtmlData)) {
p.Parse(html); // <-- ERROR thrown here
}
// close document tried docoment.Close(); same issue
}
}
// get bytes from stream
pdf = stream.ToArray();
}
}
Вот событие страницы:
public class HeaderFooter: PdfPageEventHelper {
protected ElementList header;
protected ElementList footer;
private string _footerText;
private string _headerText;
public HeaderFooter(string headerText, string footerText) {
header = XMLWorkerHelper.ParseToElementList(headerText, null);
footer = XMLWorkerHelper.ParseToElementList(footerText, "table { font-size: 8px; font-style: italic; }");
_footerText = footerText;
_headerText = headerText;
}
public override void OnEndPage(PdfWriter writer, Document document) {
try {
footer = XMLWorkerHelper.ParseToElementList(_footerText.Replace("@PageNumber", writer.PageNumber.ToString()), "table { font-size: 8px; font-style: italic; }");
ColumnText ct = new ColumnText(writer.DirectContent);
ct.SetSimpleColumn(new Rectangle(36, 832, 559, 810));
foreach(IElement e in header) {
ct.AddElement(e);
}
ct.Go();
ct.SetSimpleColumn(new Rectangle(36, 10, 559, 32));
foreach(IElement e in footer) {
ct.AddElement(e);
}
ct.Go();
} catch (DocumentException de) {
throw new Exception();
}
}
}
Использование 5.5.5.0 (это то, что у меня есть локально). Я получаю исключение en на одной из закрывающих скобок 'using'. Однако, если я раскомментирую метод 'document.Close()' после блока 'StringReader', он работает так, как ожидалось. –
Ваш '{...} catch (DocumentException de) { throw new Exception(); } 'скрывает любую информацию, которую может содержать« DocumentException ». Запишите 'DocumentException' и ** не ** бросайте' new Exception() '. Кроме того, как @kuujinbo предлагает и перемещает 'PdfWriter' из' use'. «PdfWriter» автоматически закрывается, закрывая или удаляя «документ». Не каждый экземпляр одноразового использования должен быть помещен в инструкцию 'using' ... – mkl
PDF генерирует штраф, если у меня есть использование или нет, пока я не добавлю PageEvent. Ошибка, созданная с помощью pageevent и не использующая, - это 'iTextSharp.tool.xml.pipeline.css.CssResolverPipeline крики, он не может найти собственный контекст.}} ITextSharp.tool.xml.pipeline.css.CssResolverPipeline кричит, он не может найти собственный контекст « – lucuma