Skip to content

Instantly share code, notes, and snippets.

@GroupDocsGists
GroupDocsGists / README.md
Created August 22, 2026 10:13
Six runnable Node.js snippets: tag and name specifications, a full sanitize, and a residual-PII scan with GroupDocs.Metadata

Office metadata PII cleanup - runnable Node.js mini-project for GroupDocs.Metadata

PII cleanup is a GroupDocs.Metadata capability for Node.js via Java that deletes identity-bearing properties from Office documents and lists whatever survives.

A small but complete set of snippets demonstrating document sanitization on Node.js (JavaScript). Download the files into one directory, install the package, point them at a DOCX, and run.

Project layout

  • README.md - this overview.
  • removeAuthorAndCompany.js - clears the four identity fields by tag.
@GroupDocsGists
GroupDocsGists / ClearComments.cs
Created August 22, 2026 08:26
Four targeted C# removal passes, the Sanitize call, and a verification scan for Word, Excel, and PowerPoint metadata
// Clear review comments, reviewer names, and comment counters
var inputPath = "resources/pii-sample.docx";
var outputPath = "output/no-comments.docx";
int affected;
using (var metadata = new Metadata(inputPath))
{
affected = metadata.RemoveProperties(p =>
p.Name != null && (
p.Name.Contains("Comment") ||
@GroupDocsGists
GroupDocsGists / ClearComments.java
Created August 22, 2026 08:25
Tag and name specifications, a full sanitize, and a leak check with GroupDocs.Metadata for Java
// Clear review comments, reviewer names, and comment counters
// NameContainsSpec is a Specification subclass; see NameContainsSpec.java
String inputPath = "src/main/resources/pii-sample.docx";
String outputPath = "output/no-comments.docx";
int affected;
try (Metadata metadata = new Metadata(inputPath)) {
affected = metadata.removeProperties(
new NameContainsSpec("Comment", "Reviewer", "Reviewed"));
metadata.save(outputPath);
@GroupDocsGists
GroupDocsGists / AddKeywords.java
Created August 12, 2026 17:10
Packet snapshot, Dublin Core and Photoshop scheme reads, copyright stamping, and keyword tagging using GroupDocs.Metadata for Java
// Add keywords to the dc:subject bag of an Adobe file's XMP packet
String inputPath = "src/main/resources/sample.psd";
String outputPath = "output/with-keywords.psd";
String[] keywords = {"landscape", "sunset", "commercial"};
try (Metadata metadata = new Metadata(inputPath)) {
IXmp root = (IXmp) metadata.getRootPackage();
if (root == null) return;
if (root.getXmpPackage() == null) {
root.setXmpPackage(new XmpPacketWrapper());
@GroupDocsGists
GroupDocsGists / AddKeywords.cs
Created August 12, 2026 17:10
Full-packet snapshot, Dublin Core and Photoshop scheme reads, copyright stamping, and keyword tagging using GroupDocs.Metadata for .NET
// Add keywords to the dc:subject bag of an Adobe file's XMP packet
var inputPath = "resources/sample.psd";
var outputPath = "output/with-keywords.psd";
var keywords = new[] { "landscape", "sunset", "commercial" };
using (var metadata = new Metadata(inputPath))
{
var root = metadata.GetRootPackage() as IXmp;
if (root == null) return;
@GroupDocsGists
GroupDocsGists / AddKeywords.py
Created August 11, 2026 16:05
Dublin Core, Photoshop scheme, keywords, and copyright stamping using GroupDocs.Metadata for Python via .NET
# Add keywords to the dc:subject bag of an Adobe file's XMP packet
input_path = "resources/sample.psd"
output_path = "output/with-keywords.psd"
keywords = ["landscape", "sunset", "commercial"]
with Metadata(input_path) as metadata:
root = metadata.get_root_package()
xmp = getattr(root, "xmp_package", None)
if xmp is None:
root.xmp_package = XmpPacketWrapper()
@GroupDocsGists
GroupDocsGists / ClearComments.py
Created August 11, 2026 16:05
Targeted removal passes, a full sanitize, and a leak check with GroupDocs.Metadata for Python via .NET
# Remove review comments, reviewer names, and comment metadata
input_path = "resources/pii-sample.docx"
output_path = "output/no-comments.docx"
with Metadata(input_path) as metadata:
affected = metadata.remove_properties(lambda p:
p.name is not None and (
"Comment" in p.name
or "Reviewer" in p.name
or "Reviewed" in p.name))
@GroupDocsGists
GroupDocsGists / CompareMetadataSets.py
Created August 11, 2026 16:05
Property diff, ownership and revision detectors, and JSON/CSV audit exports with GroupDocs.Metadata for Python via .NET
# Classify metadata differences between two revisions of one document
def read_props(path):
props = {}
with Metadata(path) as metadata:
for p in metadata.find_properties(lambda p: p.name is not None):
props[p.name] = (str(p.interpreted_value) if p.interpreted_value is not None
else (str(p.value) if p.value is not None else ""))
return props
v1 = read_props("resources/document-v1.docx")
@GroupDocsGists
GroupDocsGists / GroupDocsMetadataComparison.js
Created July 25, 2026 17:45
Extract, detect, and export metadata diffs across document revisions using GroupDocs.Metadata for Node.js
const result = {};
const metadata = new groupdocs.Metadata(documentPath);
try {
const properties = metadata.findProperties(new groupdocs.AnySpecification());
for (let i = 0; i < properties.getCount(); i++) {
const p = properties.get_Item(i);
const name = p.getName();
const value = valueToString(p);
result[name] = value;
}
@GroupDocsGists
GroupDocsGists / CompareMetadataSets.java
Created July 25, 2026 16:26
Detect ownership, revision, and property changes across document versions using GroupDocs.Metadata for Java
Map<String, String> v1 = ExtractAllMetadata.run(pathV1);
Map<String, String> v2 = ExtractAllMetadata.run(pathV2);
MetadataDiff diff = new MetadataDiff();
for (Map.Entry<String, String> e : v2.entrySet()) {
String k = e.getKey();
String v = e.getValue();
if (!v1.containsKey(k)) {
diff.added.put(k, v);
} else if (!v1.get(k).equals(v)) {