Skip to content

Extraer metadatos del documento

Cada formato Office incluye un pequeño conjunto de “core properties” — autor, fecha de última modificación, título, asunto, palabras clave — más un conjunto extendido específico por formato. Office Oxide expone ambos.

Formato e info básica

El handle Document expone el nombre del formato y los conteos (hojas, diapositivas, secciones):

Python

from office_oxide import Document

with Document.open("report.docx") as doc:
    print(doc.format)            # "docx"
    print(doc.detect_format())   # confirma con magic bytes

Rust

use office_oxide::{Document, DocumentFormat};

let doc = Document::open("report.docx")?;
assert_eq!(doc.format(), DocumentFormat::Docx);

JavaScript

using doc = Document.open('report.docx');
console.log(doc.format);        // "docx"

Go

doc, err := officeoxide.Open("report.docx")
if err != nil { log.Fatal(err) }
defer doc.Close()

fmtName, _ := doc.Format()   // "docx"
fmt.Println(fmtName)

C#

using OfficeOxide;

using var doc = Document.Open("report.docx");
Console.WriteLine(doc.Format);   // "docx"

Core properties

En los formatos OOXML, las core properties viven en docProps/core.xml. Entra al accessor específico del formato:

Python

from office_oxide import Document

with Document.open("report.docx") as doc:
    docx = doc.as_docx()
    props = docx.core_properties()
    print(props.title)            # str | None
    print(props.author)           # str | None
    print(props.created)          # datetime | None
    print(props.modified)         # datetime | None
    print(props.subject)          # str | None
    print(props.keywords)         # str | None

Rust

use office_oxide::Document;

let doc = Document::open("report.docx")?;
if let Some(docx) = doc.as_docx() {
    let props = docx.core_properties();
    println!("{:?}", props.title);
    println!("{:?}", props.author);
}

El mismo accessor core_properties() existe en as_xlsx() y as_pptx().

Go

Go expone las core properties vía el JSON IR unificado:

doc, _ := officeoxide.Open("report.docx")
defer doc.Close()

irJSON, _ := doc.ToIRJSON()
var ir struct {
    Metadata struct {
        Title    string `json:"title"`
        Author   string `json:"author"`
        Created  string `json:"created"`
        Modified string `json:"modified"`
        Subject  string `json:"subject"`
        Keywords string `json:"keywords"`
    } `json:"metadata"`
}
json.Unmarshal([]byte(irJSON), &ir)
fmt.Println(ir.Metadata.Title, ir.Metadata.Author)

C#

using OfficeOxide;
using System.Text.Json;

using var doc = Document.Open("report.docx");
using var ir = JsonDocument.Parse(doc.ToIrJson());

var meta = ir.RootElement.GetProperty("metadata");
Console.WriteLine(meta.GetProperty("title").GetString());
Console.WriteLine(meta.GetProperty("author").GetString());
Console.WriteLine(meta.GetProperty("created").GetString());

Propiedades extendidas (app)

docProps/app.xml guarda metadatos extendidos: páginas, palabras, párrafos, diapositivas, nombre y versión de la aplicación, hyperlinks, etc.

Python

with Document.open("report.docx") as doc:
    app = doc.as_docx().app_properties()
    print(app.application)   # "Microsoft Office Word"
    print(app.app_version)
    print(app.pages)
    print(app.words)
    print(app.paragraphs)

Para PPTX, app_properties() expone slides, notes, presentation_format, etc. Para XLSX, expone la lista de nombres de hoja.

Propiedades personalizadas

core_properties() y app_properties() cubren los conjuntos estándar. Para claves personalizadas definidas por la aplicación (configuradas vía “Propiedades del documento → Propiedades avanzadas” en Word), usa:

with Document.open("report.docx") as doc:
    custom = doc.as_docx().custom_properties()
    for name, value in custom.items():
        print(name, value)

Formatos heredados

DOC, XLS y PPT almacenan metadatos en los streams OLE2 \005SummaryInformation y \005DocumentSummaryInformation. Office Oxide los parsea a la misma forma de core_properties():

with Document.open("legacy.doc") as doc:
    props = doc.as_doc().core_properties()
    print(props.author, props.created)

Por qué importa

  • Indexación para búsqueda — título, autor y palabras clave impulsan el descubrimiento de documentos.
  • Compliance — última modificación, creador e historial de revisiones alimentan audit trails.
  • Deduplicación — autor + título + fecha de creación es una huella digital barata pero efectiva.
  • Eliminación de PII — lee core properties antes de publicar y luego usa EditableDocument para limpiarlas.

Véase también