如何更改在 Adobe Acrobat 中创建的密文注释的密文文本
How to change redaction text of a redact annotation created in Adobe Acrobat
更新:2021-01-15 - 添加赏金
我正在尝试更改密文注释以更改应用密文时刻录到 PDF 中的基础文本。在 Acrobat 中,您可以设置一组“修订代码”,用于识别您将某些内容标记为修订的原因。我的目标是用系统定义的值覆盖用户选择的内容。在应用密文之前,代码将 运行。
在我的尝试中,我发现将光标悬停在密文框上时 Acrobat 产品中可用的“预览”是 Acrobat 独有的,大多数其他查看器不会显示预览。预览似乎与应用的实际编辑分开维护。我不需要更改预览中显示的文本,只需更改应用密文后显示的内容即可。
我增加了 150 声望的赏金,因为我不认为我能够自己找到解决方案。我最初的问题指定了 iText7,因为这是让我在自己的尝试中最接近的图书馆。虽然我更喜欢使用 iText7,但我也会考虑使用其他我可以合理访问的库的解决方案(如果需要的话,我确实有少量预算可以用来购买另一个库)。
我在下面保留了我最初的问题和我个人尝试过的后续问题。感谢提供的任何帮助。
如果您需要样本进行测试,this DropBox 文件夹中有一个名为 01 - Original.pdf
的文件,您可以将其用作源文档。期望的结果是能够将应用密文时出现的文本从“原始覆盖文本”更改为任何其他值,例如“新文本”。
原题:
我正在尝试使用 iText7
更改 PDF 中每个密文注释中包含的文本。 PdfRedactAnnotation
对象有一个名为 SetOverlayText()
的方法,看起来它应该做我想做的事。所以,我写了一个方法,打开一个 PDF,循环遍历页面,然后循环遍历每个页面上的注释,并检查注释是否是 PdfRedactAnnotation
。如果是,它调用 SetOverlayText()
.
在调试和查看注释属性时,我可以看到 OverlayText
确实发生了变化。但是,当我打开文件并通过将光标悬停在密文标记上来检查覆盖文本时,原始覆盖文本仍然存在。
此外,如果我应用密文,原始的叠加文本将被刻录到页面中。
但是,当我右键单击注释时(在应用密文之前),覆盖文本会立即更新为新文本:
此时,当我应用密文时,新文本被刻录到 PDF 中。
有什么方法可以以编程方式触发密文注释更新,而不必打开并右键单击每个注释?我在下面包含了我的代码。感谢您提供的任何建议。
PdfDocument pdfDoc = new PdfDocument(new PdfReader(@"C:\temp\Test - Original.pdf"), new PdfWriter(@"C:\temp\Test - Output.pdf"));
Document doc = new Document(pdfDoc);
int pageCount = pdfDoc.GetNumberOfPages();
for (int i = 1; i <= pageCount; i++)
{
var annotations = pdfDoc.GetPage(i).GetAnnotations();
foreach(var annotation in annotations)
{
if (annotation is PdfRedactAnnotation)
{
PdfRedactAnnotation redact = (PdfRedactAnnotation)annotation;
redact.SetOverlayText(new PdfString("New Text"));
}
}
}
doc.Close();
更新:截至 2021 年 1 月 7 日的调查结果
正如@mkl 的回答所指出的,PDF 密文注释规范阐明了底层密文注释 DOM 条目。 OverlayText 只是等式的一部分。如果您使用 OverlayText,则必须定义一个 DA 元素(DA 是一个为 OverlayText 提供格式化信息的字符串)。最后,如果定义了 RO,它将取代几乎所有其他独立显示条目。
我的测试文档是使用 Acrobat DC Pro 制作的,通过在 Acrobat 中手动添加编辑。这样做会生成包含所有上述条目集的 Redact 注释。我的测试文档的副本可以在 this DropBox 文件夹中找到。
(旁注:在我原来的问题中,我提到将鼠标悬停在密文的红色矩形上以预览应用的密文的外观......在多个浏览器和其他 PDF 查看器中测试后像 Foxit Reader,它看起来像 'preview' 将鼠标悬停在红色轮廓上应用编辑时的外观的功能仅在 Acrobat 产品中受支持。所有其他测试的查看器只会显示红色边框,将光标悬停在其上时没有任何反应。上面显示的黑色矩形只有在应用密文后才能在其他程序中查看。
其他测试表明,悬停预览与编辑细节本身是分开维护的,Acrobat 试图使悬停细节与底层注释保持同步。测试时最好忽略悬停预览,应用密文后参考结果。)
@mkl 的建议是删除 RO 条目以尝试让 OverlayText 优先,这是一个好主意,但遗憾的是没有奏效。与我的原始结果没有显着差异。
在 iText7 的 PdfRedactAnnotation 中查找后,我发现以下方法都会导致对 Redact 对象的 RO 条目的引用:
PdfRedactAnnotation redact = (PdfRedactAnnotation)annotation;
redact.GetRolloverAppearanceObject();
redact.GetRedactionRolloverAppearance();
redact.GetPdfObject().Get(PdfName.RO);
redact.GetAppearanceDictionary().Get(PdfName.R);
(我通过检查相等比较器确认它们实际上是完全相同的引用。作为引用类型,当使用 ==
测试时它们都返回 true
)。
在进一步测试中,我得出结论,RO 属性 必须在内部存储相同的 OverlayText 的副本。如果您有两个具有不同原始值的密文,您可以将 RO 元素从一个密文“复制”到另一个密文:
PdfObject ro = firstRedact.GetPdfObject().Get(PdfName.RO);
secondRedact.GetPdfObject().Put(PdfName.RO, ro);
如果您这样做并应用密文,第一个密文中的“叠加文本”将替换第二个密文中的“叠加文本”。其他 RO 元素值也被复制(例如 BBox,它定义了黑色矩形的尺寸)...但至少可以调整这些元素。
问题仍然存在,RO 的 iText7 PdfObject 有 7 个子元素,其中 none 个或它们的后代元素似乎暴露了我要更改的文本。
我的最终测试是我是否可以将 RO 元素从一个 PDF 复制到另一个 PDF(这样我就可以使用带有注释的第二个源 PDF,其中已经配置了所需的 RO“覆盖文本”),但它看起来像是间接的对象不喜欢被 .Put() 放入其他文档中。
所以现在,我只能尝试找到一种方法 access/alter 将文本存储在 RO 中,或者从另一个文档中克隆预配置的 RO。
规范怎么说?
密文注释的OverlayText条目指定为
Key
Type
Value
OverlayText
text string
(Optional) A text string specifying the overlay text that should be drawn over the redacted region after the affected content has been removed. This entry is ignored if the RO entry is present.
(ISO 32000-2, Table 195 — Additional entries specific to a redaction annotation)
也许在您的源 PDF 中,密文批注具有 RO 优先权。
此外,table 对 DA 条目说:
Key
Type
Value
DA
byte string
(Required if OverlayText is present, ignored otherwise) The appearance string that shall be used in formatting the overlay text when it is drawn after the affected content has been removed (see 12.7.4.3, "Variable text"). This entry is ignored if the RO entry is present.
如果您使用 OverlayText,因此,您还必须确保设置了 DA 默认外观字符串。你有吗?
同table中的RO条目指定为
Key
Type
Value
RO
stream
(Optional) A form XObject specifying the overlay appearance for this redaction annotation. After this redaction is applied and the affected content has been removed, the overlay appearance should be drawn such that its origin lines up with the lower-left corner of the annotation rectangle. This form XObject is not necessarily related to other annotation appearances, and may or may not be present in the AP dictionary. This entry takes precedence over the IC, OverlayText, DA, and Q entries.
那现在怎么办?
根据上面发布的详细信息,一个显而易见的选择是为更改的密文注释创建密文覆盖 XObject (RO)。您可以通过更换
if (annotation is PdfRedactAnnotation)
{
PdfRedactAnnotation redact = (PdfRedactAnnotation)annotation;
redact.SetOverlayText(new PdfString("New Text"));
}
来自
if (annotation is PdfRedactAnnotation)
{
PdfRedactAnnotation redact = (PdfRedactAnnotation)annotation;
redact.SetOverlayText(new PdfString("New Text"));
Rectangle rectangle = redact.GetRectangle().ToRectangle();
PdfStream stream = redact.GetRedactRolloverAppearance();
if (stream != null)
{
rectangle = stream.GetAsArray(PdfName.BBox).ToRectangle();
}
PdfFormXObject redactionOverlay = new PdfFormXObject(rectangle);
redactionOverlay.GetPdfObject().Put(PdfName.Matrix, new PdfArray(new double[] { 1, 0, 0, 1, -rectangle.GetX(), -rectangle.GetY() }));
using (Canvas canvas = new Canvas(redactionOverlay, pdfDocument))
{
PdfCanvas pdfCanvas = canvas.GetPdfCanvas();
pdfCanvas.SetFillColorGray(0);
pdfCanvas.Rectangle(rectangle);
pdfCanvas.Fill();
pdfCanvas.SetFillColorGray(1);
canvas.Add(new Paragraph("New Text"));
}
stream = redactionOverlay.GetPdfObject();
redact.SetRolloverAppearance(stream);
redact.SetDownAppearance(stream);
redact.SetRedactRolloverAppearance(stream);
}
在 Acrobat 中编辑后的结果:
通过调整使用的填充颜色和段落样式,您可以使外观更接近于 Adobe Acrobat 生成的外观(或者您也可以生成完全由您自己设计的外观。
注意, 我只有相当旧的 Adobe Acrobat 版本,v9.5,所以当前版本可能不接受上面生成的编辑外观或至少以不同的方式应用它。
我能够更改密文注释覆盖文本,并且在密文后,该文本在密文块上正确显示。我使用了作为 SyncFusion File Formats 的一部分包含的 SyncFusion Essential PDF 库。 (我不隶属于 SyncFusion,尽管我通过我的雇主获得了他们的文件格式库的付费许可。)我使用 Adobe Acrobat Pro DC 进行了测试。
当我第一次尝试替换密文覆盖文本时,我 运行 遇到了与 OP 对 iText 7 所做的类似的 SyncFusion 问题:在 运行 我的代码之后,覆盖将显示为已更改, 但编辑会带回以前替换的覆盖文本。由于无法同时更改显示的文本覆盖和编辑过程可访问的覆盖文本,我通过编写进行所需更改的代码解决了这个问题,将 PDF 的注释导出到 JSON 文件,删除PDF 的注释,然后将 JSON 文件导入回 PDF。这会生成新的注释,这些注释对于文本覆盖和编辑过程具有相同的文本值(我相信,编辑过程覆盖文本是由于创建 PDF 注释而生成的)。这是使用 SyncFusion Essential PDF 的代码:
using System.Drawing;
using Syncfusion.Pdf.Graphics;
using Syncfusion.Pdf.Interactive;
using Syncfusion.Pdf.Parsing;
using Syncfusion.Pdf;
PdfLoadedDocument loadedDocument = new PdfLoadedDocument(@"C:\Users\Joe\Desktop\Redact\MarkedOriginal.pdf");
PdfLoadedPage page = loadedDocument.Pages[0] as PdfLoadedPage;
foreach (PdfLoadedRedactionAnnotation redactionAnnotation in loadedDocument.Pages[0].Annotations)
{
PdfStandardFont font = new PdfStandardFont(PdfFontFamily.Helvetica, 10);
redactionAnnotation.Font = font;
redactionAnnotation.TextColor = Color.White;
redactionAnnotation.BorderColor = Color.Black; //See note in SO answer about this
redactionAnnotation.OverlayText = "New Text";
}
//Export, delete, and then import annotations to create a redaction annotation with the same preview and final redaction
loadedDocument.ExportAnnotations(@"C:\Users\Joe\Desktop\Redact\Output.json", AnnotationDataFormat.Json);
for (int i = 1; i <= loadedDocument.Pages[0].Annotations.Count; i++)
{
loadedDocument.Pages[0].Annotations.RemoveAt(i);
}
loadedDocument.ImportAnnotations(@"C:\Users\Joe\Desktop\Redact\Output.json", AnnotationDataFormat.Json);
loadedDocument.Save();
loadedDocument.Close(true);
如果OP需要将密文标记框的边框设为黑色以外的颜色,则需要多写一些代码。我发现当我使用 redactionAnnotation.BorderColor = Color.Black;
时,编辑标记框看起来符合预期。但是,当我使用 Color.Red
或其他颜色时,边框保留了黑色,新颜色也与 OP 提供的文件中的第一个密文接壤,而只有黑色与第二个密文接壤。通过进一步研究,我怀疑这可以通过 SyncFusion、iText 7 或可能通过在将文件导入回 PDF 之前编辑 JSON 文件的注释 defaultappearance
行来修复。这是我 运行 我的代码时生成的 defaultappearance
行:
"defaultappearance": "1 1 1 RG 0 g 0 Tc 0 Tw 100 Tz 0 TL 0 Ts 0 Tr /Helv 10 Tf"
值得指出的是,SyncFusion 有免费和付费的软件许可层。 SyncFusion Community License is, per SyncFusion, free for "companies and individuals with less than million USD in annual gross revenue and 5 or fewer developers." The SyncFusion File Formats Developer License 将涵盖其他所有人。
更新:2021-01-15 - 添加赏金
我正在尝试更改密文注释以更改应用密文时刻录到 PDF 中的基础文本。在 Acrobat 中,您可以设置一组“修订代码”,用于识别您将某些内容标记为修订的原因。我的目标是用系统定义的值覆盖用户选择的内容。在应用密文之前,代码将 运行。
在我的尝试中,我发现将光标悬停在密文框上时 Acrobat 产品中可用的“预览”是 Acrobat 独有的,大多数其他查看器不会显示预览。预览似乎与应用的实际编辑分开维护。我不需要更改预览中显示的文本,只需更改应用密文后显示的内容即可。
我增加了 150 声望的赏金,因为我不认为我能够自己找到解决方案。我最初的问题指定了 iText7,因为这是让我在自己的尝试中最接近的图书馆。虽然我更喜欢使用 iText7,但我也会考虑使用其他我可以合理访问的库的解决方案(如果需要的话,我确实有少量预算可以用来购买另一个库)。
我在下面保留了我最初的问题和我个人尝试过的后续问题。感谢提供的任何帮助。
如果您需要样本进行测试,this DropBox 文件夹中有一个名为 01 - Original.pdf
的文件,您可以将其用作源文档。期望的结果是能够将应用密文时出现的文本从“原始覆盖文本”更改为任何其他值,例如“新文本”。
原题:
我正在尝试使用 iText7
更改 PDF 中每个密文注释中包含的文本。 PdfRedactAnnotation
对象有一个名为 SetOverlayText()
的方法,看起来它应该做我想做的事。所以,我写了一个方法,打开一个 PDF,循环遍历页面,然后循环遍历每个页面上的注释,并检查注释是否是 PdfRedactAnnotation
。如果是,它调用 SetOverlayText()
.
在调试和查看注释属性时,我可以看到 OverlayText
确实发生了变化。但是,当我打开文件并通过将光标悬停在密文标记上来检查覆盖文本时,原始覆盖文本仍然存在。
此外,如果我应用密文,原始的叠加文本将被刻录到页面中。
但是,当我右键单击注释时(在应用密文之前),覆盖文本会立即更新为新文本:
此时,当我应用密文时,新文本被刻录到 PDF 中。
有什么方法可以以编程方式触发密文注释更新,而不必打开并右键单击每个注释?我在下面包含了我的代码。感谢您提供的任何建议。
PdfDocument pdfDoc = new PdfDocument(new PdfReader(@"C:\temp\Test - Original.pdf"), new PdfWriter(@"C:\temp\Test - Output.pdf"));
Document doc = new Document(pdfDoc);
int pageCount = pdfDoc.GetNumberOfPages();
for (int i = 1; i <= pageCount; i++)
{
var annotations = pdfDoc.GetPage(i).GetAnnotations();
foreach(var annotation in annotations)
{
if (annotation is PdfRedactAnnotation)
{
PdfRedactAnnotation redact = (PdfRedactAnnotation)annotation;
redact.SetOverlayText(new PdfString("New Text"));
}
}
}
doc.Close();
更新:截至 2021 年 1 月 7 日的调查结果
正如@mkl 的回答所指出的,PDF 密文注释规范阐明了底层密文注释 DOM 条目。 OverlayText 只是等式的一部分。如果您使用 OverlayText,则必须定义一个 DA 元素(DA 是一个为 OverlayText 提供格式化信息的字符串)。最后,如果定义了 RO,它将取代几乎所有其他独立显示条目。
我的测试文档是使用 Acrobat DC Pro 制作的,通过在 Acrobat 中手动添加编辑。这样做会生成包含所有上述条目集的 Redact 注释。我的测试文档的副本可以在 this DropBox 文件夹中找到。
(旁注:在我原来的问题中,我提到将鼠标悬停在密文的红色矩形上以预览应用的密文的外观......在多个浏览器和其他 PDF 查看器中测试后像 Foxit Reader,它看起来像 'preview' 将鼠标悬停在红色轮廓上应用编辑时的外观的功能仅在 Acrobat 产品中受支持。所有其他测试的查看器只会显示红色边框,将光标悬停在其上时没有任何反应。上面显示的黑色矩形只有在应用密文后才能在其他程序中查看。
其他测试表明,悬停预览与编辑细节本身是分开维护的,Acrobat 试图使悬停细节与底层注释保持同步。测试时最好忽略悬停预览,应用密文后参考结果。)
@mkl 的建议是删除 RO 条目以尝试让 OverlayText 优先,这是一个好主意,但遗憾的是没有奏效。与我的原始结果没有显着差异。
在 iText7 的 PdfRedactAnnotation 中查找后,我发现以下方法都会导致对 Redact 对象的 RO 条目的引用:
PdfRedactAnnotation redact = (PdfRedactAnnotation)annotation;
redact.GetRolloverAppearanceObject();
redact.GetRedactionRolloverAppearance();
redact.GetPdfObject().Get(PdfName.RO);
redact.GetAppearanceDictionary().Get(PdfName.R);
(我通过检查相等比较器确认它们实际上是完全相同的引用。作为引用类型,当使用 ==
测试时它们都返回 true
)。
在进一步测试中,我得出结论,RO 属性 必须在内部存储相同的 OverlayText 的副本。如果您有两个具有不同原始值的密文,您可以将 RO 元素从一个密文“复制”到另一个密文:
PdfObject ro = firstRedact.GetPdfObject().Get(PdfName.RO);
secondRedact.GetPdfObject().Put(PdfName.RO, ro);
如果您这样做并应用密文,第一个密文中的“叠加文本”将替换第二个密文中的“叠加文本”。其他 RO 元素值也被复制(例如 BBox,它定义了黑色矩形的尺寸)...但至少可以调整这些元素。
问题仍然存在,RO 的 iText7 PdfObject 有 7 个子元素,其中 none 个或它们的后代元素似乎暴露了我要更改的文本。
我的最终测试是我是否可以将 RO 元素从一个 PDF 复制到另一个 PDF(这样我就可以使用带有注释的第二个源 PDF,其中已经配置了所需的 RO“覆盖文本”),但它看起来像是间接的对象不喜欢被 .Put() 放入其他文档中。
所以现在,我只能尝试找到一种方法 access/alter 将文本存储在 RO 中,或者从另一个文档中克隆预配置的 RO。
规范怎么说?
密文注释的OverlayText条目指定为
Key Type Value OverlayText text string (Optional) A text string specifying the overlay text that should be drawn over the redacted region after the affected content has been removed. This entry is ignored if the RO entry is present. (ISO 32000-2, Table 195 — Additional entries specific to a redaction annotation)
也许在您的源 PDF 中,密文批注具有 RO 优先权。
此外,table 对 DA 条目说:
Key Type Value DA byte string (Required if OverlayText is present, ignored otherwise) The appearance string that shall be used in formatting the overlay text when it is drawn after the affected content has been removed (see 12.7.4.3, "Variable text"). This entry is ignored if the RO entry is present.
如果您使用 OverlayText,因此,您还必须确保设置了 DA 默认外观字符串。你有吗?
同table中的RO条目指定为
Key Type Value RO stream (Optional) A form XObject specifying the overlay appearance for this redaction annotation. After this redaction is applied and the affected content has been removed, the overlay appearance should be drawn such that its origin lines up with the lower-left corner of the annotation rectangle. This form XObject is not necessarily related to other annotation appearances, and may or may not be present in the AP dictionary. This entry takes precedence over the IC, OverlayText, DA, and Q entries.
那现在怎么办?
根据上面发布的详细信息,一个显而易见的选择是为更改的密文注释创建密文覆盖 XObject (RO)。您可以通过更换
if (annotation is PdfRedactAnnotation)
{
PdfRedactAnnotation redact = (PdfRedactAnnotation)annotation;
redact.SetOverlayText(new PdfString("New Text"));
}
来自
if (annotation is PdfRedactAnnotation)
{
PdfRedactAnnotation redact = (PdfRedactAnnotation)annotation;
redact.SetOverlayText(new PdfString("New Text"));
Rectangle rectangle = redact.GetRectangle().ToRectangle();
PdfStream stream = redact.GetRedactRolloverAppearance();
if (stream != null)
{
rectangle = stream.GetAsArray(PdfName.BBox).ToRectangle();
}
PdfFormXObject redactionOverlay = new PdfFormXObject(rectangle);
redactionOverlay.GetPdfObject().Put(PdfName.Matrix, new PdfArray(new double[] { 1, 0, 0, 1, -rectangle.GetX(), -rectangle.GetY() }));
using (Canvas canvas = new Canvas(redactionOverlay, pdfDocument))
{
PdfCanvas pdfCanvas = canvas.GetPdfCanvas();
pdfCanvas.SetFillColorGray(0);
pdfCanvas.Rectangle(rectangle);
pdfCanvas.Fill();
pdfCanvas.SetFillColorGray(1);
canvas.Add(new Paragraph("New Text"));
}
stream = redactionOverlay.GetPdfObject();
redact.SetRolloverAppearance(stream);
redact.SetDownAppearance(stream);
redact.SetRedactRolloverAppearance(stream);
}
在 Acrobat 中编辑后的结果:
通过调整使用的填充颜色和段落样式,您可以使外观更接近于 Adobe Acrobat 生成的外观(或者您也可以生成完全由您自己设计的外观。
注意, 我只有相当旧的 Adobe Acrobat 版本,v9.5,所以当前版本可能不接受上面生成的编辑外观或至少以不同的方式应用它。
我能够更改密文注释覆盖文本,并且在密文后,该文本在密文块上正确显示。我使用了作为 SyncFusion File Formats 的一部分包含的 SyncFusion Essential PDF 库。 (我不隶属于 SyncFusion,尽管我通过我的雇主获得了他们的文件格式库的付费许可。)我使用 Adobe Acrobat Pro DC 进行了测试。
当我第一次尝试替换密文覆盖文本时,我 运行 遇到了与 OP 对 iText 7 所做的类似的 SyncFusion 问题:在 运行 我的代码之后,覆盖将显示为已更改, 但编辑会带回以前替换的覆盖文本。由于无法同时更改显示的文本覆盖和编辑过程可访问的覆盖文本,我通过编写进行所需更改的代码解决了这个问题,将 PDF 的注释导出到 JSON 文件,删除PDF 的注释,然后将 JSON 文件导入回 PDF。这会生成新的注释,这些注释对于文本覆盖和编辑过程具有相同的文本值(我相信,编辑过程覆盖文本是由于创建 PDF 注释而生成的)。这是使用 SyncFusion Essential PDF 的代码:
using System.Drawing;
using Syncfusion.Pdf.Graphics;
using Syncfusion.Pdf.Interactive;
using Syncfusion.Pdf.Parsing;
using Syncfusion.Pdf;
PdfLoadedDocument loadedDocument = new PdfLoadedDocument(@"C:\Users\Joe\Desktop\Redact\MarkedOriginal.pdf");
PdfLoadedPage page = loadedDocument.Pages[0] as PdfLoadedPage;
foreach (PdfLoadedRedactionAnnotation redactionAnnotation in loadedDocument.Pages[0].Annotations)
{
PdfStandardFont font = new PdfStandardFont(PdfFontFamily.Helvetica, 10);
redactionAnnotation.Font = font;
redactionAnnotation.TextColor = Color.White;
redactionAnnotation.BorderColor = Color.Black; //See note in SO answer about this
redactionAnnotation.OverlayText = "New Text";
}
//Export, delete, and then import annotations to create a redaction annotation with the same preview and final redaction
loadedDocument.ExportAnnotations(@"C:\Users\Joe\Desktop\Redact\Output.json", AnnotationDataFormat.Json);
for (int i = 1; i <= loadedDocument.Pages[0].Annotations.Count; i++)
{
loadedDocument.Pages[0].Annotations.RemoveAt(i);
}
loadedDocument.ImportAnnotations(@"C:\Users\Joe\Desktop\Redact\Output.json", AnnotationDataFormat.Json);
loadedDocument.Save();
loadedDocument.Close(true);
如果OP需要将密文标记框的边框设为黑色以外的颜色,则需要多写一些代码。我发现当我使用 redactionAnnotation.BorderColor = Color.Black;
时,编辑标记框看起来符合预期。但是,当我使用 Color.Red
或其他颜色时,边框保留了黑色,新颜色也与 OP 提供的文件中的第一个密文接壤,而只有黑色与第二个密文接壤。通过进一步研究,我怀疑这可以通过 SyncFusion、iText 7 或可能通过在将文件导入回 PDF 之前编辑 JSON 文件的注释 defaultappearance
行来修复。这是我 运行 我的代码时生成的 defaultappearance
行:
"defaultappearance": "1 1 1 RG 0 g 0 Tc 0 Tw 100 Tz 0 TL 0 Ts 0 Tr /Helv 10 Tf"
值得指出的是,SyncFusion 有免费和付费的软件许可层。 SyncFusion Community License is, per SyncFusion, free for "companies and individuals with less than million USD in annual gross revenue and 5 or fewer developers." The SyncFusion File Formats Developer License 将涵盖其他所有人。