2016-05-17 33 views
0

この投稿(Removing Watermark from PDF iTextSharp)によると、@mklコードはExGstateグラフィカル透かしには問題ありませんが、このコードのようにPDFコンテンツの後ろにテキストベースの透かしが入っているファイル:http://s000.tinyupload.com/index.php?file_id=05961025831018336372) 私はこのサイトで見つかった複数のソリューションを試しましたが、成功しません。 上記の@mklソリューションを変更することで誰でもこの透かしタイプを削除できますか?質問OP参照(Removing Watermark from PDF iTextSharp)の場合には、あなたがその質問に私の答えに提示PdfContentStreamEditorクラスにより構築することにより、あなたのサンプルファイルから透かしを削除することができます同じようにitextsharpを使用してテキストベースの透かしを削除する

おかげ

+0

は本当にただのテキストです。確かに、それはページ上の他のすべてのテキストとは違って見えますが、それはまだ普通のテキストです。チェックアウト[this](http://stackoverflow.com/q/20176614/231316)、[this](http://stackoverflow.com/q/12674195/231316)または可能性があります[this](http:// stackoverflow .com/a/17718641/231316)。 –

+0

@ChrisHaasしかし、この投稿は問題を既に解決していません。内容の後ろに配置されたテキストは、それをストリームとして解析することによって削除するTextLayerではありません。 – MKH

+0

はまだ回答していません。みんな助けてください:( – MKH

答えて

0

。そのほかの回答で解決策とは対照的に

、しかし、我々はいくつかの透明度の値に基づいて、ベクトルグラフィックスを非表示にする必要はありませんが、代わりに、このからの書き込み「SIDのアーカイブ」:

sid-1.pdf

まず、背景テキストを認識するための基準を選択する必要があります。その文章がここで一番大きなものであるという事実を使ってみましょう。この基準を使用すると、本質的にthis iText/JavaソリューションのiTextSharp/C#ペンダントが手元にあります。

は、しかし、問題があります:

第二のサンプルで使用gs().getFontSize()は、あなたはそれが時々座標系は、電流によって延伸されたことを期待するものではないかもしれない。その答えで述べたように変換マトリクスとテキストマトリクスを含む。コードを拡張して、これらの影響を考慮することができます。したがって、我々はにテキスト行列を取る必要がある

/NxF0 1 Tf 
49.516754 49.477234 -49.477234 49.516754 176.690933 217.316086 Tm 

:1のフォントサイズが使用され、その小さなテキストは、テキストマトリックスによって引き伸ばされ:その通り、これはここで起こっている

アカウント。残念ながら、テキストマトリックスはプライベートメンバーです。したがって、反射魔法も必要となります。

したがって、そのファイルのための可能な背景除去は次のようになります。

class BigTextRemover : PdfContentStreamEditor 
{ 
    protected override void Write(PdfContentStreamProcessor processor, PdfLiteral operatorLit, List<PdfObject> operands) 
    { 
     if (TEXT_SHOWING_OPERATORS.Contains(operatorLit.ToString())) 
     { 
      Vector fontSizeVector = new Vector(0, Gs().FontSize, 0); 
      Matrix textMatrix = (Matrix) textMatrixField.GetValue(this); 
      Matrix curentTransformationMatrix = Gs().GetCtm(); 
      Vector transformedVector = fontSizeVector.Cross(textMatrix).Cross(curentTransformationMatrix); 
      float transformedFontSize = transformedVector.Length; 
      if (transformedFontSize > 40) 
       return; 
     } 
     base.Write(processor, operatorLit, operands); 
    } 
    System.Reflection.FieldInfo textMatrixField = typeof(PdfContentStreamProcessor).GetField("textMatrix", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); 
    List<string> TEXT_SHOWING_OPERATORS = new List<string>{"Tj", "'", "\"", "TJ"}; 
} 

40は心の中でそのテキストマトリックスで選択されています。であなたのサンプルファイルの結果にこの

[Test] 
public void testRemoveBigText() 
{ 
    string source = @"sid-1.pdf"; 
    string dest = @"sid-1-noBigText.pdf"; 

    using (PdfReader pdfReader = new PdfReader(source)) 
    using (PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(dest, FileMode.Create, FileAccess.Write))) 
    { 
     PdfContentStreamEditor editor = new BigTextRemover(); 

     for (int i = 1; i <= pdfReader.NumberOfPages; i++) 
     { 
      editor.EditPage(pdfStamper, i); 
     } 
    } 
} 

のようにそれを適用する

:あなたは "透かし" を呼んでいる何

sid-1-noBigText.pdf

+0

ありがとう@mkl、働いた! – MKH

関連する問題