使用 itextsharp 删除基于文本的水印
Removing Text based watermarks using itextsharp
据此post (Removing Watermark from PDF iTextSharp) , @mkl code works fine for ExGstate graphical watermarks but I have tested this code to remove watermark from some files which have Text based watermarks behind PDF contents (like this file : http://s000.tinyupload.com/index.php?file_id=05961025831018336372)
我尝试了在此站点中找到的多种解决方案,但没有成功。
任何人都可以通过更改上述@mkl 解决方案来帮助删除此水印类型吗?
谢谢
就像 OP 引用 (Removing Watermark from PDF iTextSharp) 的问题一样,您可以通过在我的 PdfContentStreamEditor
class 中提供的基础上从样本文件中删除水印回答那个问题。
不过,与其他答案中的解决方案相反,我们不想根据某些透明度值隐藏矢量图形,而是希望从以下写作 "Archive of SID":
首先我们必须 select 一个识别背景文本的标准。让我们利用一个事实,即这里的文字是迄今为止最大的。使用此标准使手头的任务本质上是 iTextSharp/C# this iText/Java 解决方案的附属物。
但是有一个问题:正如那个答案中提到的:
The gs().getFontSize()
used in the second sample may not be what you expect it to be as sometimes the coordinate system has been stretched by the current transformation matrix and the text matrix. The code can be extended to consider these effects.
这里确实发生了这种情况:使用 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);
}
}
}
您的示例文件结果为:
据此post (Removing Watermark from PDF iTextSharp) , @mkl code works fine for ExGstate graphical watermarks but I have tested this code to remove watermark from some files which have Text based watermarks behind PDF contents (like this file : http://s000.tinyupload.com/index.php?file_id=05961025831018336372) 我尝试了在此站点中找到的多种解决方案,但没有成功。 任何人都可以通过更改上述@mkl 解决方案来帮助删除此水印类型吗?
谢谢
就像 OP 引用 (Removing Watermark from PDF iTextSharp) 的问题一样,您可以通过在我的 PdfContentStreamEditor
class 中提供的基础上从样本文件中删除水印回答那个问题。
不过,与其他答案中的解决方案相反,我们不想根据某些透明度值隐藏矢量图形,而是希望从以下写作 "Archive of SID":
首先我们必须 select 一个识别背景文本的标准。让我们利用一个事实,即这里的文字是迄今为止最大的。使用此标准使手头的任务本质上是 iTextSharp/C# this iText/Java 解决方案的附属物。
但是有一个问题:正如那个答案中提到的:
The
gs().getFontSize()
used in the second sample may not be what you expect it to be as sometimes the coordinate system has been stretched by the current transformation matrix and the text matrix. The code can be extended to consider these effects.
这里确实发生了这种情况:使用 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);
}
}
}
您的示例文件结果为: