Esta página puede contener texto traducido automáticamente.

Convertir PDF a PDF/A

Este artículo explica cómo convertir documentos PDF a PDF/A con Docotic.Pdf. Esta biblioteca .NET incluye un conversor de PDF a PDF/A de alto rendimiento que funciona completamente sin conexión. También puede usar Docotic.Pdf para crear documentos PDF/A desde cero.

PDF a PDF/A

¿Por qué convertir PDF a PDF/A?

PDF/A es una versión especial de PDF diseñada para archivo. Convertir documentos PDF estándar a PDF/A ofrece varias ventajas:

  1. Conservación a largo plazo
    Los documentos PDF/A siguen siendo accesibles y utilizables durante muchos años, lo que los hace ideales para fines legales, gubernamentales y de archivo.

  2. Cumplimiento normativo
    Las industrias con requisitos estrictos de cumplimiento y legales suelen almacenar documentos en PDF/A.

  3. Apariencia coherente en distintos visores de PDF
    Los documentos PDF/A se muestran de forma coherente en diferentes sistemas y visores de PDF.

Lea el artículo ¿Qué es PDF/A? para obtener más información sobre el estándar PDF/A.

PDF a PDF/A en C#

Para convertir de PDF a PDF/A, necesita:

  1. Docotic.Pdf con el complemento de conformidad.
  2. Una clave de licencia. Puede obtener una licencia gratuita con tiempo limitado en la página de descarga.

El siguiente código C# convierte un archivo PDF a PDF/A-4:

using var pdf = new PdfDocument("input.pdf");
pdf.SaveAsPdfa("output.pdf", PdfaConformanceLevel.Pdfa4);

El método SaveAsPdfa lo proporciona el complemento en el espacio de nombres BitMiracle.Docotic.Pdf.Conformance. Admite todos los niveles de conformidad PDF/A: PDF/A-1a, PDF/A-1b, PDF/A-2a, PDF/A-2b, PDF/A-2u, PDF/A-3a, PDF/A-3b, PDF/A-3u, PDF/A-4, PDF/A-4e, PDF/A-4f. La salida puede escribirse en un archivo o en un flujo.

Si el documento de origen no puede convertirse al nivel de conformidad PDF/A solicitado, SaveAsPdfa lanza una ConformanceException. Consulte la sección Gestión de errores para obtener detalles.

Escenarios avanzados de conversión

Docotic.Pdf admite una amplia gama de flujos de trabajo PDF/A, incluidas la creación de documentos PDF/A desde cero, la conversión de HTML a PDF/A y la combinación de documentos en un único archivo PDF/A.

Crear documentos PDF/A

Docotic.Pdf ofrece distintas formas de crear documentos PDF en .NET. Puede usar el mismo método SaveAsPdfa para generar documentos PDF/A con Core API o Layout API.

Este código C# crea un documento PDF/A-3u usando Core API:

using var pdf = new PdfDocument();
pdf.Pages[0].Canvas.DrawString("Hello PDF/A");
pdf.SaveAsPdfa("output.pdf", PdfaConformanceLevel.Pdfa3U);

Con Layout API, usted crea un documento PDF normal y luego lo convierte a PDF/A. Este ejemplo de código muestra cómo generar un documento PDF/A-1b:

using var ms = new MemoryStream();
PdfDocumentBuilder.Create().Generate(ms, doc => doc.Pages(pages =>
{
    pages.Content().Text("Hello, world!");
}));

using var pdf = new PdfDocument(ms);
pdf.SaveAsPdfa("output.pdf", PdfaConformanceLevel.Pdfa1B);

HTML a PDF/A

El complemento HtmlToPdf convierte HTML a PDF. Para preparar el resultado para archivo, guarde el PDF generado como PDF/A:

var uri = new Uri("https://google.com");
var options = new HtmlConversionOptions
{
    PreserveStructureInformation = true,
};

using var converter = await HtmlConverter.CreateAsync();
using var pdf = await converter.CreatePdfAsync(uri, options);
pdf.SaveAsPdfa("output.pdf", PdfaConformanceLevel.Pdfa3A);

La opción PreserveStructureInformation = true ayuda a producir documentos accesibles. Esto es importante para los niveles de conformidad PDF/A-1a, PDF/A-2a o PDF/A-3a.

Combinar documentos PDF a PDF/A

Docotic.Pdf admite la combinación de documentos PDF. Sustituya la llamada PdfDocument.Save por SaveAsPdfa para guardar el documento combinado como PDF/A:

using var pdf = new PdfDocument("first.pdf");
pdf.Append("second.pdf");
pdf.SaveAsPdfa("merged.pdf", PdfaConformanceLevel.Pdfa1B);

Puede aplicar el mismo principio en otros escenarios de edición de PDF. Por ejemplo, eliminar páginas PDF, editar texto, aplanar campos de formulario y finalmente guardar como PDF/A.

Crear archivos ZUGFeRD / Factur-X en C#

Factur-X / ZUGFeRD es un estándar europeo de factura electrónica basado en PDF/A-3. Puede usar Docotic.Pdf para incrustar un archivo XML de factura y producir un documento Factur-X / ZUGFeRD válido:

using var pdf = new PdfDocument();

PdfFileSpecification xml = pdf.CreateFileAttachment("your_path_to/xrechnung.xml");
xml.Relationship = "Alternative";
pdf.SharedAttachments.Add(xml);

var fx = new XmpSchema("fx", "urn:factur-x:pdfa:CrossIndustryDocument:invoice:1p0#");
var props = fx.Properties;
props.Add(new XmpProperty("DocumentType", new XmpString("INVOICE")));
props.Add(new XmpProperty("DocumentFileName", new XmpString("xrechnung.xml")));
props.Add(new XmpProperty("Version", new XmpString("3.0")));
props.Add(new XmpProperty("ConformanceLevel", new XmpString("XRECHNUNG")));

pdf.Metadata.Schemas.Add(fx);

pdf.SaveAsPdfa("zugferd.pdf", PdfaConformanceLevel.Pdfa3A);

Crear documentos Order-X

Order-X es otro estándar de la UE que permite el procesamiento electrónico de pedidos de compra. Este fragmento de C# muestra cómo crear un documento Order-X usando el perfil COMFORT:

using var pdf = new PdfDocument();

using (var file = File.OpenRead("order-data-comfort.xml"))
{
    PdfFileSpecification xml = pdf.CreateFileAttachment(file, "order-x.xml");
    xml.Relationship = "Data";
    pdf.SharedAttachments.Add(xml);
}

var fx = new XmpSchema("fx", "urn:factur-x:pdfa:CrossIndustryDocument:1p0#");
var props = fx.Properties;
props.Add(new XmpProperty("DocumentType", new XmpString("ORDER")));
props.Add(new XmpProperty("DocumentFileName", new XmpString("order-x.xml")));
props.Add(new XmpProperty("Version", new XmpString("1.0")));
props.Add(new XmpProperty("ConformanceLevel", new XmpString("COMFORT")));

pdf.Metadata.Schemas.Add(fx);

pdf.SaveAsPdfa("order-x.pdf", PdfaConformanceLevel.Pdfa3B);

Convertir archivos PDF protegidos a PDF/A

Convertir archivos PDF cifrados no es diferente. Abra el documento con la contraseña correcta y llame a SaveAsPdfa:

using var pdf = new PdfDocument(fileName, new PdfStandardDecryptionHandler("password"));
pdf.SaveAsPdfa("result.pdf", PdfaConformanceLevel.Pdfa4E);

Procesamiento por lotes

Puede automatizar la conversión de varios archivos PDF a PDF/A. Enumere todos los archivos PDF de un directorio y convierta cada documento a PDF/A. Este ejemplo de código muestra cómo convertir archivos en paralelo:

public static async Task ConvertAsync(string directoryPath)
{
    string[] files = Directory.GetFiles(directoryPath, "*.pdf", SearchOption.AllDirectories);
    if (files.Length == 0)
        return;

    var semaphore = new SemaphoreSlim(Environment.ProcessorCount);
    var tasks = new List<Task>(files.Length);
    foreach (var f in files)
    {
        await semaphore.WaitAsync();

        var task = Task.Run(() =>
        {
            string outputFileName = $"{Path.GetFileName(f)}-{Guid.NewGuid()}.pdf";
            try
            {
                using var pdf = new PdfDocument(f);
                pdf.SaveAsPdfa(outputFileName, PdfaConformanceLevel.Pdfa1B);
            }
            finally
            {
                semaphore.Release();
            }
        });

        tasks.Add(task);
    }

    await Task.WhenAll(tasks);
}

Cuando implemente un flujo de conversión para archivos PDF arbitrarios, conviene validar todos los archivos resultantes para comprobar la conformidad con PDF/A. Puede encontrar una aplicación lista para usar para conversión y validación por lotes en la sección Evaluar la calidad de la conversión.

Gestión de errores

La conversión puede fallar en algunas situaciones. Por ejemplo, cuando:

  • Un archivo de entrada no es un PDF
  • Se proporciona una contraseña inválida para un PDF cifrado
  • No se pueden incrustar bytes de fuente para PDF/A

Docotic.Pdf lanza excepciones en estos casos. Este código de ejemplo muestra cómo manejar excepciones:

try
{
    using var pdf = new PdfDocument("input.pdf");
    pdf.SaveAsPdfa("output.pdf", PdfaConformanceLevel.Pdfa1B);
}
catch (PdfException ex)
{
    Console.WriteLine($"Problem with an input document: {ex.Message}");
}
catch (ConformanceException ex)
{
    Console.WriteLine($"Unable to convert to PDF/A: {ex.Message}");
}

Convertir de PDF/A a PDF

Convertir de PDF/A a PDF se usa a veces para facilitar la edición de documentos. El proceso es mucho más simple que la conversión de PDF a PDF/A. Solo necesita eliminar una parte de los metadatos XMP. Código de ejemplo:

using var pdf = new PdfDocument("pdfa-compliant.pdf");

var schemas = pdf.Metadata.Schemas;
for (int i = 0; i < schemas.Count; ++i)
{
    if (schemas[i].Namespace == "http://www.aiim.org/pdfa/ns/id/")
    {
        schemas.RemoveAt(i);
        --i;
    }
}

pdf.Save("regular.pdf");

¿Por qué elegir Docotic.Pdf para la conversión de PDF a PDF/A?

Docotic.Pdf es una biblioteca .NET pura en C# de alto rendimiento, sin dependencias externas. Puede usarla para producir documentos PDF/A en Windows, Linux, macOS, Android, iOS o en un entorno en la nube. Además, Docotic.Pdf ofrece las siguientes ventajas:

Conversión local sin conexión

La conversión ocurre completamente en su propio equipo. No se transmite ningún dato a servidores externos ni a proveedores de terceros. La conversión sin conexión ayuda a proteger documentos sensibles porque ningún dato sale de su entorno.

Calidad

Docotic.Pdf está diseñado para conservar la mayor cantidad posible de la información original durante la conversión, sin sacrificar la calidad.

Cumplimiento ISO

Docotic.Pdf produce archivos PDF/A conformes con las normas ISO:

  • ISO 19005-1:2005 (PDF/A-1)
  • ISO 19005-2:2011 (PDF/A-2)
  • ISO 19005-3:2012 (PDF/A-3)
  • ISO 19005-4:2020 (PDF/A-4)

Cada compilación de Docotic.Pdf pasa por miles de pruebas automatizadas. Las pruebas de PDF a PDF/A usan una gran colección de archivos PDF de distintas fuentes y los convierten a varios niveles de conformidad PDF/A. Después, los archivos resultantes se verifican para comprobar la conformidad con PDF/A.

Un grupo de pruebas comprueba que veraPDF no informe de problemas para los archivos convertidos. Un segundo grupo de pruebas compara cada archivo resultante con su versión PDF/A esperada, cuya ausencia de problemas de conformidad ha sido verificada tanto por veraPDF como por Adobe Acrobat Preflight.

Evaluar la calidad de la conversión

Proporcionamos el proyecto de código abierto PdfToPdfa. Es una aplicación de consola .NET que convierte archivos PDF a PDF/A. Después de la conversión, la aplicación valida cada documento resultante. El proyecto usa Docotic.Pdf para la conversión y veraPDF para la validación.

Puede usar esta aplicación en modo de línea de comandos para automatizar sus flujos de trabajo PDF/A. O usarla en modo de interfaz de usuario para evaluar rápidamente la calidad y el rendimiento de la conversión.

Convertir archivos PDF a PDF/A y validar la conformidad PDF/A

La aplicación procesa cualquier archivo PDF o directorio. Para su comodidad, el repositorio del proyecto también incluye archivos de prueba del corpus de veraPDF y de la Isartor Test Suite.

¿Qué ocurre durante una conversión a PDF/A?

Las especificaciones PDF/A definen una larga lista de requisitos para un documento conforme. El conversor valida y aplica todos ellos para producir archivos PDF/A válidos. A alto nivel, comprueba cada objeto PDF y corrige los problemas de conformidad PDF/A detectados.

No todos los PDF pueden convertirse a PDF/A sin alterar su contenido. Algunas características de PDF están prohibidas por el nivel de conformidad PDF/A seleccionado, por lo que el conversor debe eliminarlas o transformarlas. Como resultado, la conversión puede ser un proceso con pérdida de información.

Por ejemplo, PDF/A-1 no permite contenido opcional (capas), archivos incrustados (adjuntos) ni transparencia. Si un documento PDF original usa estas características, el conversor aplana las capas y elimina los adjuntos y la transparencia. Si conservar ese contenido es importante, elija un nivel de conformidad PDF/A que lo admita:

  • Todos los niveles de conformidad PDF/A-2, PDF/A-3 y PDF/A-4 admiten transparencia y contenido opcional.
  • PDF/A-3, PDF/A-4 y PDF/A-4f admiten archivos incrustados arbitrarios. PDF/A-2 y PDF/A-4 solo admiten archivos PDF/A incrustados.

Repasemos cómo Docotic.Pdf corrige los problemas más comunes.

Fuentes y texto

El conversor intenta incrustar todas las fuentes usadas en el documento. Para las fuentes que aún no están incrustadas, primero intenta cargar los datos de fuente adecuados desde la colección de fuentes del sistema o desde una fuente de fuentes personalizada. Si no se encuentra ninguna fuente coincidente, se usa una fuente sustitutiva.

Puede personalizar este proceso proporcionando cargadores de fuentes personalizados. La interfaz IFontLoader se usa para cargar los datos de la fuente. La implementación DirectoryFontLoader, por ejemplo, carga bytes de fuente desde uno o varios directorios especificados.

También puede proporcionar una implementación de la interfaz IFallbackFontProvider para suministrar fuentes sustitutivas cuando IFontLoader no pueda cargar la fuente solicitada.

El siguiente ejemplo muestra cómo personalizar la carga de fuentes:

public static void ConfigurePdfToPdfa(
    string fileName,
    PdfaConformanceLevel level,
    Stream output,
    IFontLoader? fontLoader,
    IFallbackFontProvider? fallbackFontProvider)
{
    var config = PdfConfigurationOptions.Create();
    if (fontLoader != null)
        config.FontLoader = fontLoader;

    if (fallbackFontProvider != null)
        config.FallbackFontProvider = fallbackFontProvider;

    using var pdf = new PdfDocument(fileName, config);
    pdf.SaveAsPdfa(output, level);
}

Docotic.Pdf también corrige anchos de glifo incoherentes, y flujos CMap y ToUnicode. Los caracteres no definidos se eliminan durante el proceso de conversión.

Metadatos

El conversor corrige o elimina esquemas o propiedades de metadatos no válidos, agrega el esquema pdfaid y sincroniza los metadatos XMP con el diccionario de información del documento.

El complemento Conformance también proporciona el método de extensión ReadPdfaConformance para PdfDocument. Use este método para leer el nivel de conformidad PDF/A declarado en los metadatos XMP:

using var pdf = new PdfDocument("input.pdf");
PdfaConformanceLevel? level = pdf.ReadPdfaConformance();

Colores

El conversor proporciona perfiles ICC de intención de salida para colores de dispositivo porque los colores dependientes del dispositivo no están permitidos en documentos PDF/A. También corrige intenciones de salida y espacios de color no conformes.

La transparencia se elimina al producir documentos PDF/A-1. Esto afecta a los modos de fusión, las máscaras suaves y los grupos de transparencia. También se corrigen propiedades de imagen no válidas.

Archivos incrustados

El tratamiento de los archivos incrustados depende del nivel de conformidad PDF/A. En PDF/A-1, se eliminan todos los archivos incrustados.

En PDF/A-2 y PDF/A-4, los archivos PDF incrustados se convierten a PDF/A. Los adjuntos que no son PDF se eliminan. En los archivos PDF/A incrustados, los tipos MIME y las relaciones de archivo también se corrigen en PDF/A-4.

En PDF/A-3, los adjuntos no se eliminan, pero se corrigen las relaciones de archivo y los tipos MIME.

Funciones interactivas

El conversor genera flujos de apariencia ausentes o no válidos. También corrige propiedades de anotación no válidas, aplana las anotaciones de tipos no permitidos y elimina acciones de tipos no permitidos.

Los formularios XFA se eliminan en PDF/A-2, PDF/A-3 y PDF/A-4. Solo PDF/A-1 permite formularios XFA, pero aun así no se recomiendan para archivo a largo plazo.

El contenido opcional se aplana cuando se apunta a PDF/A-1. Para otros niveles de conformidad, el conversor corrige diccionarios de configuración de contenido opcional con matrices de orden incompletas, nombres ausentes o nombres duplicados.

Firmas digitales

Las firmas digitales no permiten modificaciones del contenido firmado por diseño. Si la parte firmada del PDF contiene problemas de conformidad PDF/A, el conversor los corrige e invalida la firma.

Otras áreas

Para accesibilidad, el conversor agrega información básica de la estructura del documento si falta. También corrige etiquetas de estructura no válidas o no estándar. Esto se aplica a documentos PDF/A-1a, PDF/A-2a y PDF/A-3a.

Los archivos PDF/A no deben estar cifrados, por lo que el conversor no permite cifrar los archivos de salida.

Los datos comprimidos con LZW no están permitidos en PDF/A. El conversor vuelve a comprimir los flujos LZW usando compresión Flate. También corrige objetos de matriz, diccionario, número, nombre y cadena que no cumplan con la norma.

Los encabezados de archivo o secciones de referencias cruzadas no válidos también se corrigen automáticamente.

Conclusión

Docotic.Pdf con el complemento Conformance proporciona un conversor de PDF a PDF/A de alta calidad. Puede convertir documentos PDF existentes a cualquier nivel de conformidad PDF/A o crear documentos PDF/A desde cero. La biblioteca funciona completamente en local, por lo que sus datos nunca salen de sus servidores.

Puede explorar ejemplos ejecutables en C# y VB.NET para crear y procesar documentos PDF/A en la sección PDF/A del repositorio de ejemplos.

También existe la aplicación de código abierto PdfToPdfa para la conversión de PDF a PDF/A. Puede usarla para automatizar flujos de trabajo PDF/A o simplemente convertir archivos PDF a PDF/A.

Preguntas frecuentes

¿Cómo elegir el conversor adecuado de PDF a PDF/A?

Un buen conversor de PDF a PDF/A debería:

  1. Producir archivos conformes con PDF/A.
  2. Conservar la información y la apariencia visual de los documentos de origen.
  3. Ejecutarse localmente sin enviar archivos a servidores de terceros.
  4. Funcionar rápido.
  5. (si se requiere automatización) Admitir ejecución sin interfaz de usuario.

La biblioteca Docotic.Pdf cumple todos los criterios y es una buena opción para convertir de PDF a PDF/A.

¿Cómo validar que el documento PDF/A es conforme?

Use software de validación. Un buen validador PDF/A debería:

  1. Seguir en profundidad las normas ISO para PDF/A.
  2. Ejecutarse localmente sin enviar archivos a servidores de terceros.
  3. Funcionar rápido.
  4. (si se requiere automatización) Admitir ejecución sin interfaz de usuario.

veraPDF es una herramienta de validación estándar de la industria que cumple todos estos requisitos.

¿Cómo automatizar el flujo de trabajo de conversión de PDF a PDF/A?

Convierta archivos PDF usando el complemento Docotic.Pdf Conformance. Valide los resultados con el validador veraPDF. Siga el progreso de la conversión y la validación.

La aplicación de código abierto PdfToPdfa implementa este flujo de trabajo. Úsela como punto de partida para su propia implementación.

¿Qué versión de PDF/A debo usar?

Lea la sección Cómo elegir una versión PDF/A.

¿Puedo incrustar un archivo XML en un PDF para ZUGFeRD?

Sí, definitivamente. Consulte los ejemplos de la sección Producir archivos ZUGFeRD / Factur-X.

¿Cómo proteger un documento PDF/A?

Técnicamente es imposible. Los archivos PDF/A no deben cifrarse.