我不完美但可行的解决方案是使用与背景匹配的文本项占位符来标记 .RDLC 报告中的位置。生成 PDF 后,这些是通过继承 iTextSharp 的 LocationTextExtractionStrategy 来识别的(根据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 的宝贵意见!