0

Microsoft レポート コントロール (グラフ) の 1 つが、私のニーズには不十分であることがわかりました。これらのコントロールは拡張できないため、WPF コントロールの機能を拡張し、コントロールをグラフィックとして保存しています。残念ながら、ReportViewer の画像コントロールもベクター グラフィックをサポートしていません。したがって、私の目標は、特定の「プレースホルダー」(長方形のアイテムなど) を使用して ReportViewer から PDF を生成し、iTextSharp を使用して、これらのプレースホルダーの上にベクター グラフィックを追加することです。レポートの長さは入力データに基づいて流れるため、これらのプレースホルダーの座標を取得する前に知ることはできません。

iText には GetFieldPosition() メソッドがあるため、RDLC に PDF フィールドを含める方法は考えられません。さらに、iText の PDFWriter.GetVerticalPosition() メソッドがあることは知っていますが、これは実際にはカーソルを PDFWriter のその場所に移動した場合にのみ役立ちます。真実は、私はまだ iText と PDF について理解を深めようとしているところです。広大です。

だから、お互いに言及している私の2つの質問:

  1. 後で体系的に識別でき、その位置を照会できる RDLC デザイナーで使用するプレースホルダーの種類は何ですか?
  2. このポジションを獲得するにはどうすればよいですか?

前もって感謝します!

-ブランドン

4

2 に答える 2

2

私の不完全ではあるが有効な解決策は、背景と一致するテキスト アイテム プレースホルダーを使用して、.RDLC レポート内の位置をマークすることです。PDF を生成した後、これらは iTextSharp の LocationTextExtractionStrategy を継承することによって識別されます (greenhatによるこのエントリに従って)。info.GetText()私の現在のテスト環境では、上記はそのままコピーして貼り付けたものであり、適切なプレースホルダー文字列でない限り、TextChunk をリストに追加しない RenderText() オーバーライドでのみ逸脱します。

プレースホルダー抽出のスニペット:

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 に感謝します!

于 2013-01-11T22:32:25.627 に答える
1
  • デフォルトの画像をプレースホルダーとして追加します。
  • xaml ファイルを画像としてエクスポートします。
  • これらのデフォルトの画像を新しい画像に置き換えることができるようになりました。詳細はこちら: https://stackoverflow.com/a/8751517/298573
于 2013-01-09T06:12:12.733 に答える