2017-01-11 102 views
-1

システム私は、特定の情報を持つスタンプPDFの作業中です。これは、ドキュメントの右上にライムグリーンのテキストボックスを作成することで行います。その後、緑色のスペースの上に特定の文字列を描画します。これは何千ものPDFで動作しますが、ボックスが描画されてもテキストは見えません。テキストを選択して別のものにコピーすることはできますが、PDFでは不可視です。PDFsharp DrawStringテキスト特定のPDFのために目に見えない

残念ながら、私はPDFを共有できませんが、PDF 1.4です。何が原因でしょうか?スタンプ用

コードは:

private static XGraphics drawString(XGraphics xgr, PdfPage page, string printString, int pageNumber = 0) 
    { 
     XFont font = new XFont("Verdana", 10, XFontStyle.BoldItalic); 

     var textSize = xgr.MeasureString(printString, font); 
     var width = textSize.Width; 
     var height = textSize.Height; 

     double xMin = 0; 
     double yMin = 0; 

     if (page.Rotate == 90) 
     { 
      xMin = page.Height - textSize.Width; 
      var state = xgr.Save(); 
      xgr.DrawRectangle(XBrushes.LimeGreen, xMin, yMin, width, height); 
      xgr.Restore(state); 
      xgr.DrawString(printString, font, XBrushes.Black, new XRect(0, 0, page.Height, page.Width), topRight()); 
     } 
     else 
     { 
      xMin = page.Width - textSize.Width; 
      var state = xgr.Save(); 
      xgr.DrawRectangle(XBrushes.LimeGreen, xMin, yMin, width, height); 
      xgr.Restore(state); 
      xgr.DrawString(printString, font, XBrushes.Black, new XRect(0, 0, page.Width, page.Height), topRight()); 
     } 

     return xgr; 
    } 

    private static XStringFormat topRight() 
    { 
     XStringFormat format = new XStringFormat(); 
     format.Alignment = XStringAlignment.Far; 
     format.LineAlignment = XLineAlignment.Near; 
     return format; 
    } 

私はXGRに破棄して下さい()を使用して、そのドローの各アクションの前にそれを再初期化しようとしています。私は、コードに見られるように、描画操作とxgrの状態を保存して復元しようとしました。私は幸運のない様々なフォントとフォントサイズを試みました。

PDFに関するどのメタデータが適切であるかを教えてください。私はそれを共有します。

答えて

0

以下は、ドキュメント内に何かを隠してドキュメントを編集して再度保存するために使用するコードです。それはあなたが

private PdfDocument FormatPdfDocument(PdfDocument document, List<string> packingTypes, string carrierName) 
{ 
    XFont PackingTypeFont = new XFont("Calibri", 10, XFontStyle.Bold); 
    var i = 0; 
    foreach (PdfPage page in document.Pages) 
    { 
     using (var gfx = XGraphics.FromPdfPage(page)) 
     { 
      var packingType = packingTypes.ElementAtOrDefault(i++) ?? "PackingType Not Found"; 
      if (carrierName == "xxxx") 
      { 
       var packingTypeBounds = new XRect(64, 62, 200, 12); 
       gfx.DrawRectangle(XBrushes.White, packingTypeBounds); 
       gfx.DrawString(packingType, PackingTypeFont, XBrushes.Black, packingTypeBounds, XStringFormats.TopLeft); 

       var logoBounds = new XRect(0, 0, 130, 50); 
       gfx.DrawRectangle(XBrushes.White, logoBounds); 
      } 
      else if (carrierName == "yyyy") 
      { 
       var packingTypeBounds = new XRect(200, 0, 200, 12); 
       gfx.DrawString(packingType, PackingTypeFont, XBrushes.Black, packingTypeBounds, XStringFormats.TopLeft); 
      } 
      else if (carrierName == "zzzz") 
      { 
       var packingTypeBounds = new XRect(410, 20, 200, 12); 
       var state = gfx.Save(); 
       gfx.RotateAtTransform(90, new XPoint { X = 410, Y = 20 }); 
       gfx.DrawString(packingType, PackingTypeFont, XBrushes.Black, packingTypeBounds, XStringFormats.TopLeft); 
       gfx.Restore(state); 
      } 
     } 
    }  
    return document; 
} 

これは、あなたの質問に答えるためにすべての問題

+1

これは、私を助けていません。私の緑色の矩形は問題のPDF上に細かく描画されますが、文字列は描画されません。私のコードは何千ものPDFを処理していたので、このコードは必要ありません。私が何かを見逃していない限り? – JosephGage

0

いくつかの原因が考えずに日付まで私のため正常に動作できますなら、私に教えてください「これを引き起こす何を?」:あなたは

を使用しています最新バージョンのPDFsharp 1.50 beta 3b? IIRC一部のプロパティがリセットされないため、予期しない動作につながるバグが1.32にあります。
長方形が表示されるので、これが原因である可能性があります。

矩形が表示されるので、これはおそらく適用されません。
既存のページを修正するには、「追加」と「前に付ける」の2通りの方法があります。あなたのコードスニペットはあなたのやり方を示していません。 "prepend"を使用すると、ライムの四角形が白い塗りつぶしの矩形の下に隠れることがあります。アクティブな透明度グリッドを使用してAdobe ReaderでPDFを見て、四角形を配置するグリッドが表示されていることを確認します。

長方形が表示されているため、これはおそらく適用されません。
テキストが間違った位置に移動することがあります。変更しているPDFページのMediaBoxとCropBoxの設定を確認してください。通常、ページは(0,0)から始まりますが、確信が持てません。
PDFファイルにテキストを配置し、テキストの位置をMediaBoxとCropBoxと比較します。

これはPDFシャープの不明なバグです。共有できる問題を複製できるPDFが見つからない場合は、バグを修正するのが非常に難しいでしょう。しかし、おそらく上記のオプションの1つが成功につながります。

+0

私は変更なしで1.50ベータ版を使ってみました。 MediaBoxとCropBoxは正しいです。他の提案をありがとうございます。私が共有することができる同じ問題を持つPDFを見つけるなら、私はします。 – JosephGage

0

私はそれを機能させる方法を見つけることができました。私は文書の2回のスタンピングプロセスを実行し、期待通りに機能しました。幸運なことに、実際に正常に動作する通常のドキュメントには、2回スタンプすることは影響しません。

+0

ハッキングのような音。どのように "秘密"はPDFですか?内部レビューのためにPDFsharpの開発者に送ることは可能でしょうか?私はあなたが回避策を見つけたことを理解しています。1000のうち1つのファイルだけが必要であっても、すべてのファイルは2つのスタンプを取得します。最悪の場合、この回避策はまだレビュー後に最良の選択肢になりますが、ここでPDFsharpにバグがあるかどうかを知りたいと思います。 –

+0

それは絶対にハックです!しかし、私は今それと一緒に行かなければならないでしょう。残念ながら私は本当にそれを共有することはできません。私はここでPDFsharpを手伝うことができないことをお詫びします。 – JosephGage

0

PdfSharp 1.5 GDIを使用して、この問題も解決しています。いくつかのpdfは大丈夫でしょう。他の人は1ページか2ページがOKでしたし、他のページはOKだったページがありませんでした。テキストは選択できますが、テキストは表示されませんでした。 renderModeを変更すると、問題が修正されます。

PdfGraphicsState.csには、_realizedRenderingMode!= renderModeかどうかを確認する条件があります。それはコードブロックに入ることはありません、またrenderModeを変更する方法があるようにあなたは、イタリック、ボールド、取り消し線にフォントを変更したり、下線がない限り、それは見てないのでしかし、_realizedRenderingModeとrenderModeは、デフォルトでは0である:

int _realizedRenderingMode; // Reference: TABLE 5.2 Text state operators/Page 398 

    public void RealizeFont(XFont font, XBrush brush, int renderingMode) 
    { 
     const string format = Config.SignificantFigures3; 

     // So far rendering mode 0 (fill text) and 2 (fill, then stroke text) only. 
     RealizeBrush(brush, _renderer._colorMode, renderingMode, font.Size); // _renderer.page.document.Options.ColorMode); 

     // Realize rendering mode. 
     if (_realizedRenderingMode != renderingMode) 
     { 
      _renderer.AppendFormatInt("{0} Tr\n", renderingMode); 
      _realizedRenderingMode = renderingMode; 
     } 

問題を修正するには条件を削除すれば十分ですが、renderingModeはXGraphicsPdfRenderer.csのBT(Begin Text)の1回だけ必要と思われます。だから、

internal void BeginTextMode() 
    { 
     if (_streamMode != StreamMode.Text) 
     { 
      _streamMode = StreamMode.Text; 
      _content.Append("BT\n"); 
      // Text matrix is empty after BT 
      _gfxState.RealizedTextPosition = new XPoint(); 
      _gfxState.ItalicSimulationOn = false; 
     } 
    } 

、私はXGraphicsPdfRendererOptionsを含めるようにXGraphicsを変更し、それは場所に関係なく変更することができるように、さまざまな方法に変数を渡してしまった:

private XGraphicsPdfRendererOptions _renderOptions { get; set; } 
    public XGraphicsPdfRendererOptions RenderOptions 
    { 
     get 
     { 
      if (_renderOptions == null) 
      { 
       _renderOptions = new XGraphicsPdfRendererOptions(); 
      } 

      return _renderOptions; 
     } 
     set 
     { 
      _renderOptions = value; 
     } 
    } 

renderModeがもともと基づいていることに注意してくださいフォントは、斜体、太字、取り消し線、または私は本当にXGraphicsPdfRenderer.csで、それらはrenderModeに関連する方法を確認しない、下線であるかどうかについて:

  //bool bold = (font.Style & XFontStyle.Bold) != 0; 
     //bool italic = (font.Style & XFontStyle.Italic) != 0; 
     bool italicSimulation = (font.GlyphTypeface.StyleSimulations & XStyleSimulations.ItalicSimulation) != 0; 
     bool boldSimulation = (font.GlyphTypeface.StyleSimulations & XStyleSimulations.BoldSimulation) != 0; 
     bool strikeout = (font.Style & XFontStyle.Strikeout) != 0; 
     bool underline = (font.Style & XFontStyle.Underline) != 0; 

     Realize(font, brush, boldSimulation ? 2 : 0); 

クラスと列挙型:

public class XGraphicsPdfRendererOptions 
{ 
    public XGraphicsPdfRenderMode RenderMode { get; set; } 
    public bool IncludeRenderModeForPage { get; set; } 
    public bool IncludeRenderModeForObject { get; set; } 
} 

public enum XGraphicsPdfRenderMode 
{ 
    Text_Render_Mode_Fill = 0, 
    Text_Render_Mode_Stroke = 1, 
    Text_Render_Mode_Fill_Stroke = 2, 
    Text_Render_Mode_Invisible = 3 
} 

使用法:

gfx.RenderOptions = new XGraphicsPdfRendererOptions() { RenderMode = XGraphicsPdfRenderMode.Text_Render_Mode_Fill, IncludeRenderModeForPage = true }; 

https://github.com/zaryk/PDFsharp

関連する問題