使用 itextsharp 删除基于文本的水印

2023-11-29

根据这篇文章(从 PDF iTextSharp 中删除水印),@mkl 代码适用于 ExGstate 图形水印,但我已经测试了此代码以从某些 PDF 内容后面具有基于文本的水印的文件中删除水印(例如此文件:http://s000.tinyupload.com/index.php?file_id=05961025831018336372) 我尝试了在该网站中找到的多种解决方案,但没有成功。 任何人都可以通过更改上述 @mkl 解决方案来帮助删除此水印类型吗?

thanks


就像OP引用的问题一样(从 PDF iTextSharp 中删除水印),您可以通过构建从示例文件中删除水印PdfContentStreamEditor我对这个问题的回答中提出了课程。

不过,与其他答案中的解决方案相反,我们不想根据某些透明度值隐藏矢量图形,而是从中写入“SID 存档”:

sid-1.pdf

首先,我们必须选择一个标准来识别背景文本。让我们利用这样一个事实:这里的文字是迄今为止最大的。使用这个标准使得手头的任务本质上是 iTextSharp/C# 的挂件这个 iText/Java解决方案。

但有一个问题:正如该答案中提到的:

The 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"};
}

The 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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 itextsharp 删除基于文本的水印 的相关文章

  • C 中的分段错误

    我需要用 0 填充二维数组 但编译后的程序会出现此错误 怎么了 int main int vert 1001 1001 int hor 1001 1001 int dudiag 1416 1416 int uddiag 1416 1416
  • 无法在更新面板中找到上传的文件

    aspx
  • 使用 gcc 编译 C 时,预处理的 .i 文件中的数字意味着什么?

    我想了解编译过程 我们可以使用以下命令查看预处理器中间文件 gcc E hello c o hello i or cpp hello c gt hello i 我大致知道预处理器的作用 但我很难理解某些行中的数字 例如 1 usr incl
  • 函数原型和数组参数

    我正在学习 C 语法 并且已经开始研究数组了 我想问你一个问题 但首先让我回顾一下 这样我就知道我已经弄清楚了 我知道您可以使用以下语法将变量定义为数组 name
  • 在 C 中声明和初始化数组

    C 有没有办法先声明然后初始化数组 到目前为止 我一直在初始化一个这样的数组 int myArray SIZE 1 2 3 4 但我需要做这样的事情 int myArray SIZE myArray 1 2 3 4 在 C99 中 您可以使
  • F# 内联如何工作?

    对于 F 我的理解是您可以使用 inline 关键字在调用站点执行类型专门化 那是 val inline a gt b gt c when a or b static member a b gt c 约束条件是 a or b必须有一个静态成
  • 为什么测试在 TeamCity 中运行比直接在 NUnit 中运行需要更长的时间?

    我进行了一些 C 性能测试 基本上运行两种不同的方法 并检查一种方法的运行速度是否比另一种方法快得多 当我在 NUnit 本地运行它们时 其中一个测试的运行速度是另一个测试的十倍 因此我有一个 NUnit 测试 它使用Stopwatch检查
  • 为什么Boost在“程序选项”中使用全局函数覆盖来实现自定义验证器

    这个例子 http www boost org doc libs 1 55 0 doc html program options howto html idp163429032显示一个名为validate在全局范围内定义重载函数boost
  • 适用于 Windows 的键值数据库?

    除了 MongoDB 和 Memcached 之外 Windows 上还运行哪些键值存储 我见过的大多数似乎只能在 Linux 上运行 Hypertable Redis Lightcloud 相关链接 是否有经过商业验证的云存储 Key g
  • 如何忽略搜索条件中的空属性

    我有一个不好的要求要做 无论如何 我必须在我的应用程序中实现它 我有一个Track class public class Track public string Name get set public string City get set
  • 复杂的 C 声明

    我刚刚在互联网上浏览了一些代码 发现了这个 float foo SIZE SIZE 我如何阅读这份声明 是否有一套特定的规则来阅读如此复杂的声明 我有一段时间没做这个了 从 开始foo然后向右走 float foo SIZE SIZE fo
  • 表单.位置不起作用

    我之前问过这个问题 以为我已经解决了 但它仍然不起作用 Form Show 稍微移动表单位置 https stackoverflow com questions 1214014 form show moves form position s
  • DLL 中的 XP 风格组合框

    我需要使用 C 和 WIN32 API 无 MFC 在 DLL 中创建 XP 风格的组合框 我设法在 DLL 中创建控件 不是以 XP 风格 我设法在带有清单的 exe 中创建 XP 样式组合框 但它在 DLL 中不起作用 为了让您的 DL
  • C语言中如何将整数转换为字符? [复制]

    这个问题在这里已经有答案了 C语言中如何将整数转换为字符 C 中的字符已经是数字 字符的 ASCII 代码 无需转换 如果要将数字转换为相应的字符 只需添加 0 即可 c i 0 0 是 ASCii 表中的一个字符
  • 派生类的聚合初始化

    以下代码无法使用 Visual Studio2017 或在线 GDB 进行编译 我期望它能够编译 因为迭代器只是一个具有类型的类 并且它是从公共继承的 这是不允许的还是在 VS2017 中不起作用 template
  • 在 C++ 中将大型数据向量写入/读取到二进制文件

    我有一个 C 程序 它通过将 ascii 文件中的网格人口数据读取到大型 8640x3432 元素双精度向量中来计算给定半径内的人口 将 ascii 数据读入向量大约需要 30 秒 循环每列和每行 而程序的其余部分只需要几秒钟 我被要求通过
  • MonoGame 中的 ContentLoadException

    我一直在尝试使用 Xamarin Studio 在 MonoGame 中加载纹理 我的代码设置如下 region Using Statements using System using Microsoft Xna Framework usi
  • 如何通过Task.ContinueWith创建传递?

    我想在原始任务结束时添加一个任务 但想保留原始结果和类型 附加任务仅用于记录目的 例如写入控制台等 例如 Task Run gt DateTime Now Hour gt 12 Hey throw new Exception Continu
  • 字符串常量之前应有非限定 ID

    我目前正在编写一个 C 应用程序 它与 math h 结合实现了振荡器 我拥有的代码应该可以很好地用于该应用程序 尝试编译目标文件 但是我遇到编译器错误 很可能与语法 等有关 我认为这与命名空间有关 错误 终端输出 User Name Ma
  • 如何使用字符串的值将字符串转换为 wstring?

    我是 C 新手 我有这个问题 我有一个名为 DATA DIR 的字符串 需要将其格式化为 wstring string str DATA DIR std wstring temp L s str Visual Studio 告诉我没有与参数

随机推荐

  • 即使设置了操作的优先级和依赖关系,操作队列也不会按顺序执行

    我正在进行三个 api 调用 并希望 API1 应首先执行 完成后应执行 API2 然后执行 API3 我为此使用了操作队列 并添加了对操作的依赖性 我也尝试设置优先级 但没有按顺序调用 api 帮我看看如何正确制作 代码是这样的 let
  • 在组内计算值变化之后和之前的值,为每个唯一的转变生成新变量

    我正在努力计算组内唯一值的出现次数 id 我正在看TF When TF我想从那一点开始向前和向后计算变化 这个计数应该存储在一个新变量中PM 以便PM 同时保留正负每个独特的转变 in TF 根据我收集的信息 我需要使用rle 但我有点卡住
  • 在 C++ 变量声明中使用 struct 关键字

    我有一种感觉 这可能与 C 语法有关 但我是从 C 开始我的编程生活的 所以我不确定 基本上我见过这个 struct tm t memset t 0 sizeof struct tm 我对这种语法有点困惑 因为通常我希望上面的内容看起来像这
  • 无法通过套接字'/tmp/mysql.sock连接到本地MySQL服务器

    当我在测试套件期间尝试连接到本地 MySQL 服务器时 它 失败并出现错误 OperationalError 2002 Can t connect to local MySQL server through socket tmp mysql
  • 滚动 Swift 时 tableView 的值重复

    我有一个 tableView 来显示工作日的时间 在tableView中使用timingsArray来显示计时 timingObj 类型的timingsArray class timingObj var dayNo Int var open
  • 溢出:隐藏在 Safari 中不起作用[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我遇到了一个问题 我不明白 我制作 YouTube 图像的方法是将它们放入一个容
  • Javascript 为警报分配变量

    我想知道你能为警报分配一个变量吗 它的真正含义和作用是什么 例如 var a alert test 我尝试了一下 一旦页面加载 就会弹出警报 其中变量a遗迹 undefined 当我打电话的时候 难道我们不应该让它成为一个匿名函数 里面有警
  • 我可以在一行中将多个对象变暗为整数/变体/等吗?

    在VBA中 我可以Dim以这种简洁的方式将多个对象作为整数放在一行中 或者仅声明d是一个整数 Dim a b c d As Integer 您可以测试 Sub test Dim a b c d As Integer Debug Print
  • 如何通过 WebRequest 调用 MVC 操作并通过 Active Directory 验证请求?

    我知道这个标题很拗口 我已经把大部分事情都准备好了 我只需要确认我是否可以做我正在尝试的事情 我正在使用 ASP NET MVC 3 我有一个应用程序 它具有我像 Web 服务一样使用的控制器 控制器上有一个方法 它返回一个字符串 即 js
  • 如果应用程序进入后台模式,则会触发 Ondisconnect

    我有以下代码 func OnlineStatus userID String handle Auth auth addStateDidChangeListener auth user in if let user user User is
  • 如何使用正则表达式删除Python中的逗号、括号?

    这些是我的文本文件的内容 例如 abc doc data name abc name xyz 在python中打开文件后 如何删除所有括号 引号和逗号 最终输出应该是 data name abc name xyz Use ast liter
  • 在 python 2.7 中导入 nltk 的语法无效

    当我在 python 2 7 CLI 中执行以下代码时 import nltk 它显示以下错误 SyntaxError Invalid Syntax Traceback most recent call last File
  • Android Studio:Drawable 文件夹:如何放置多个 dpi 的图像?

    Hi 根据android文档drawable文件夹需要有多个子目录 用于存放不同dpi的图像 然而 在 Android Studio 中 在可绘制文件夹中创建任何子目录都会导致它根本无法检测到任何图像 另一方面 如果图像直接放置在可绘制文件
  • 多个春季批量作业

    我在 Spring Boot 中使用 Scheduled 注释来触发多个作业 以下是代码片段 EnableBatchProcessing EnableScheduling public class Config extends Defaul
  • Flutter闪屏不全屏android 12

    我正在创建一个带有闪屏的颤振应用程序 我已经用过flutter native splash然而 无论我在manifest xml styles xml和launch background xml中进行什么更改 我都无法让它填满整个屏幕 它以
  • splat over JavaScript 对象(用 new )?

    如何在不使用的情况下跨越对象ECMA6 特点 Attempt function can arg0 arg1 return arg0 arg1 function foo bar haz this bar bar this haz haz my
  • Ruby 1.9.3 用 eval 定义 var

    我正在用 Ruby 编写类似 REPL 的东西 我需要在运行时定义变量 我发现我应该使用 eval 但这里是 irb 会话的摘录来测试它 在 1 9 3 中 这在 1 8 中有效 gt eval a 3 gt 3 gt a gt NameE
  • PHP 比较数组

    无论如何 有没有使用内置函数来比较 php 中的数组 而不需要执行某种循环 a1 array 1 2 3 a2 array 1 2 3 if array are same a1 a2 code here 顺便说一句 数组值并不总是按相同的顺
  • 在 UIPasteboard 中存储 NSArray

    我有几个文本文件想要在 2 个应用程序之间传输 即同一应用程序的免费和付费版本 我正在使用 UIPasteboard 来执行此操作 文件的内容作为 NSArray 保存在内存中 因此我想将这些 NSArray 复制到粘贴板 精简版 并从粘贴
  • 使用 itextsharp 删除基于文本的水印

    根据这篇文章 从 PDF iTextSharp 中删除水印 mkl 代码适用于 ExGstate 图形水印 但我已经测试了此代码以从某些 PDF 内容后面具有基于文本的水印的文件中删除水印 例如此文件 http s000 tinyuploa