我发现其中一个Microsoft报表控件(图表)不足以满足我的需求。由于这些控件不可扩展,我扩展了WPF控件的功能,并将控件保存为图形。不幸的是,ReportViewer的图像控件也不支持矢量图形。因此,我的目标是使用某些“占位符”(例如矩形项)从ReportViewer生成PDF,然后使用iTextSharp并在这些占位符的顶部添加矢量图形。由于报告长度基于输入数据流动,因此在获取之前我无法知道这些占位符的坐标。
我想不出在RDLC中包含PDF字段的方法,因为iText具有GetFieldPosition()方法,所以这很好。此外我知道有iText的PDFWriter.GetVerticalPosition()方法,但这只有在您将光标移动到PDFWriter中的该位置时才有用。事实是,我仍然试图了解iText和PDF。这是浩大。
所以我的两个问题相互引用:
提前致谢!
布兰登
答案 0 :(得分:2)
我的不完美但有效的解决方案是使用与背景匹配的文本项占位符来标记.RDLC报告中的位置。在生成PDF之后,通过继承iTextSharp的LocationTextExtractionStrategy(根据this entry by greenhat)来识别这些。在我当前的测试环境中,上面是逐字复制粘贴的,只在RenderText()覆盖中有所偏差,除非info.GetText()
是一个合适的占位符字符串,否则不会将TextChunk添加到列表中。
占位符提取片段:
PdfReader reader = new PdfReader(fileName);
LocationTextExtractionStrategyEx strat = new LocationTextExtractionStrategyEx();
for (int i = 1; i <= reader.NumberOfPages; i++)
PdfTextExtractor.GetTextFromPage(reader, i, strat);
本机矢量图像类型是WMF,可以插入占位符文本的绝对位置。要对列表中的第一个占位符执行此操作,请执行以下操作:
using (FileStream fs = new FileStream("output.pdf", FileMode.Create, FileAccess.Write, FileShare.None))
{
using (PdfStamper stamper = new PdfStamper(reader, fs))
{
using (Stream wmfStream = new FileStream(@"C:\Paint.wmf", FileMode.Open, FileAccess.Read, FileShare.Read))
{
Image replacementVectorImage = Image.GetInstance(wmfStream);
replacementVectorImage.SetAbsolutePosition(strat.TextLocationInfo[0].TopLeft[0], strat.TextLocationInfo[0].BottomRight[1]);
PdfContentByte cb = stamper.GetOverContent(1);
cb.AddImage(replacementVectorImage);
}
}
}
感谢mkl和VahidN的宝贵意见!
答案 1 :(得分:1)