2016-05-17 4 views
0

Согласно этому сообщению (Removing Watermark from PDF iTextSharp), код @mkl отлично подходит для графических водяных знаков ExGstate, но я проверил этот код, чтобы удалить водяной знак из некоторых файлов, на которых есть водяные знаки, основанные на тексте, за содержимым PDF (например, этот файл : http://s000.tinyupload.com/index.php?file_id=05961025831018336372) Я пробовал несколько решений, найденных на этом сайте, но не добился успеха. Может ли кто-нибудь помочь удалить эти типы водяных знаков, изменив выше решение @mkl?Удаление текстовых водяных знаков с использованием itextsharp

благодаря

+0

Что вы вызываете "водяные знаки" на самом деле просто текст. Правда, он выглядит иначе, чем весь другой текст на странице, но он по-прежнему остается обычным текстом. Проверьте [this] (http://stackoverflow.com/q/20176614/231316), [это] (http://stackoverflow.com/q/12674195/231316) или, возможно, [это] (http: // stackoverflow .com/а/17718641/231316). –

+0

@ChrisHaas, но это сообщение еще не решило проблему. Текст, который помещается за содержимым, не является TextLayer, чтобы удалить его, проанализировав его как поток. – MKH

+0

еще не ответил.помогите ребятам :( – MKH

ответ

0

Так же, как и в случае вопроса ссылки OP (Removing Watermark from PDF iTextSharp), вы можете удалить водяной знак из файла образца путем создания на PdfContentStreamEditor класса, представленный в моем ответе на этот вопрос.

В отличии от решения в этом другом ответе, однако, мы не хотим скрывать векторную графику на основе некоторого значения прозрачности, но вместо того, чтобы надпись «Архив SID» от этого:

sid-1.pdf

Сначала мы должны выбрать критерий для распознавания фонового текста. Давайте использовать тот факт, что письмо на сегодняшний день является самым большим здесь. Использование этого критерия делает задачу под рукой главным образом iTextSharp/C# подвеской для решения this iText/Java.

Существует проблема, хотя: Как уже упоминалось в этом ответе:

gs().getFontSize() используется во втором образце не может быть то, что вы ожидаете, что это будет как иногда система координат была растянута по течению матрицы преобразования и текстовой матрицы. Код может быть расширен, чтобы рассмотреть эти эффекты.

Именно это происходит здесь: Размер шрифта 1 используется и небольшой текст затем растягивается с помощью текста матрицы:

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

Таким образом, мы должны взять текст матрицы в Счет. К сожалению, текстовая матрица является частным членом. Таким образом, нам также понадобится волшебство отражения.

Таким образом, возможный фон удаление для этого файла выглядит следующим образом:

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