2

PDFドキュメントに注釈を追加するためにitextSharpを使用しています。

既に画像が保存されている PDF ドキュメントがあります。これはスタンプです。

だから私はスタンプでこのpdfにいくつかのストロークを描き、WPFでそれらを描くときはすべて問題ありませんが、変換のためにiTextSharpを使用して電子メールでpdfを送信すると、描いた線がスタンプの下になります。

どうすればこの問題を解決できますか?

ありがとうございました

4

2 に答える 2

1

回答として投稿した説明(ところで、そのデータを含むように質問を編集するのがより適切でした)は、問題を説明しています。

PDF ページに表示されるオブジェクトには、主に 2 つのタイプがあります。

  1. PDF ページのコンテンツ。
  2. ページに関連付けられた注釈。

注釈が表示される場合、注釈は常にページ コンテンツの上に表示されます。

あなたの場合、画像をPDFページのコンテンツに追加します(OverContentまたはUnderContentを使用すると、他のPDFページのコンテンツとの関係で追加が表示される場所のみが変更されます)。一方、スタンプは、ほとんどの場合、注釈によって実現されます。したがって、スタンプの注釈は常に追加したものの上にあります。

追加内容をスタンプの上に表示したい場合は、何らかの注釈として追加内容を追加するか、追加する前にスタンプ注釈をページ コンテンツにフラット化する必要があります。

これらのバリアントのどちらが優れているかは、要件によって異なります。スタンプがスタンプ アノテーションのままであることを強制する要件はありますか? 追加内容をコンテンツの一部として残すことを強制する要件はありますか? 要件を詳しく説明してください。コンテンツと注釈は、表示または印刷時にいくつかの異なる特性を持っているため、すべての要件を記載してください。

さらに、サンプル文書を提供してください。

于 2013-02-11T21:19:37.623 に答える
0

元のpdfにはスタンプが保存されていると言ったように、アクロバットリーダーでpdfを開くと、スタンプを移動できます。

だからここにいくつかのストロークを書くための私のコード:

        using (var outputStream = new FileStream(outputPath, FileMode.Create, FileAccess.Write, FileShare.Read))
        using (var intputStream = new FileStream(pathPdf, FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            PdfReader reader = new PdfReader(intputStream);
            using (var pdfStamper = new PdfStamper(reader, outputStream))
            {
                foreach (var page in pages)
                {                                                
                    if (page != null && page.ExportedImages.HasItems())
                    {                                                                                                                                            
                        PdfContentByte pdfContent = pdfStamper.GetOverContent(page.PageIndex);
                        Rectangle pageSize = reader.GetPageSizeWithRotation(page.PageIndex);                            
                        PdfLayer pdfLayer = new PdfLayer(string.Format(ANNOTATIONNAMEWITHPAGENAME, page.PageIndex), pdfContent.PdfWriter);

                        foreach (ExporterEditPageInfoImage exportedInfo in page.ExportedImages)
                        {
                            Image image = PngImage.GetImage(exportedInfo.Path);                                                                
                            image.Layer = pdfLayer;

                            if (quality == PublishQuality.Normal || quality == PublishQuality.Medium || quality == PublishQuality.High)
                            {
                                float width = (float)Math.Ceiling((image.Width / image.DpiX) * 72);
                                float height = (float)Math.Ceiling((image.Height / image.DpiY) * 72);
                                image.ScaleAbsolute(width, height);

                                float x = (float)(exportedInfo.HorizontalTile * (page.TileSize * (72 / 96d)));
                                float y = (float)Math.Max(0, (pageSize.Height - ((exportedInfo.VerticalTile + 1) * (page.TileSize * (72 / 96d)))));
                                image.SetAbsolutePosition(x, y);                                    
                            }
                            else
                                throw new NotSupportedException();

                            pdfContent.AddImage(image);                                
                            GC.Collect();
                            GC.WaitForPendingFinalizers();
                        }
                    }
                }

                pdfStamper.Close();
            }
        }

それで、私のストロークはpdfにうまく保存されます.問題はスタンプが常にすべての上にあり、私は正常だと思うので、これを回避できますか?

于 2013-02-11T19:32:29.710 に答える