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

Editar PDF en C#

Utilice Docotic.Pdf para modificar sus documentos PDF. Es la biblioteca de edición de PDF para C# y VB.NET que combina funciones potentes con una API intuitiva.

Biblioteca Docotic.Pdf 9.5.17615-dev Pruebas de regresión 14,813 pasaron Descargas totales de NuGet 4,924,084
Icono del editor de PDF

Docotic.Pdf ofrece una gran cantidad de herramientas para editar documentos PDF. Estas son algunas de las características clave de la biblioteca para la edición de PDF:

  • Combine varios archivos PDF en uno o divida un solo PDF en varios archivos.
  • Reduzca el tamaño de los archivos PDF.
  • Reorganice, elimine, rote o extraiga páginas.
  • Lea, cambie o elimine metadatos de PDF.
  • Firme PDF con firmas digitales.
  • Cifre documentos o elimine contraseñas de un PDF.
  • Agregue, edite o elimine anotaciones y archivos adjuntos.
  • Complete AcroForms, agregue o elimine controles de formulario.
  • Aplane campos de formulario y anotaciones para que formen parte del contenido del PDF.
  • Agregue, elimine o reemplace texto dentro del PDF.
  • Inserte, reemplace y cambie el tamaño de las imágenes.
  • Agregue marcas de agua y fondos.
  • Convierta documentos escaneados en texto editable y que se pueda buscar.

En las siguientes secciones, describiré las funciones de edición de PDF con más detalle. Las secciones también contienen fragmentos de código y enlaces a recursos relevantes.

Fusionar y dividir archivos PDF

Esta sección trata sobre dos características con objetivos opuestos.

Dividir y fusionar PDF en C# y VB.NET

Combinar PDF

Al consolidar archivos PDF, se crea un único documento PDF. El PDF fusionado suele contener información relacionada de varios archivos PDF existentes.

Aquí hay un fragmento de código que muestra cómo combinar archivos PDF usando Docotic.Pdf.

using var pdf = new PdfDocument("first.pdf");
pdf.Append("second.pdf");
pdf.Save("merged.pdf");

El código es muy simple porque muestra el caso más básico. Tenemos un artículo que describe casos de fusión más complejos. Por ejemplo, muestra cómo combinar documentos cifrados.

Dividir PDF

Dividir significa extraer páginas seleccionadas del PDF original para crear uno o más archivos PDF nuevos. Este proceso es útil cuando desea compartir solo una parte de un documento.

El siguiente fragmento de código muestra cómo crear un nuevo documento a partir de cada página de un PDF.

using var pdf = new PdfDocument("compound.pdf");
for (int i = 0; i < pdf.PageCount; ++i)
{
    using PdfDocument copy = pdf.CopyPages(i, 1);

    // Ayuda a reducir el tamaño del archivo cuando las páginas copiadas
    // hacen referencia a recursos no utilizados, como fuentes, imágenes y patrones.
    copy.RemoveUnusedResources();
    copy.Save(i + ".pdf");
}

Lea sobre otros enfoques para implementar un divisor de PDF en el artículo dedicado.

Compresión PDF

Existen dos enfoques principales a la hora de comprimir un PDF. El primero consiste en aplicar únicamente operaciones que no modifiquen el contenido del archivo, sino únicamente su formato. El segundo enfoque también incluye cambios que pueden provocar la pérdida de detalles o la calidad del documento para lograr una mejor compresión.

Compresión de PDF sin pérdida

De forma predeterminada, la biblioteca guarda los objetos PDF de forma que ocupen menos bytes. Para ello, excluye los objetos no utilizados, escribe los objetos sin formato y utiliza un formato más corto siempre que es posible.

Para mejorar aún más la compresión, Docotic.Pdf también produce secuencias de objetos en los archivos PDF de salida. Esta es otra forma de escribir objetos con la representación más compacta. Las secuencias de objetos se comprimen con el algoritmo Flate.

Puede afectar la forma en que la biblioteca guarda objetos usando opciones de guardado.

Algunos documentos contienen fuentes, imágenes, perfiles de color y otros objetos duplicados. Suele ser el caso de documentos y archivos que se actualizan de forma incremental y que se crean mediante la fusión de varios documentos. La eliminación de duplicados de estos objetos mediante el método PdfDocument.ReplaceDuplicateObjects puede reducir drásticamente el tamaño de salida.

Las páginas de un documento pueden hacer referencia a recursos no utilizados. Por ejemplo, imágenes que antes estaban visibles en la página pero que ya no lo están. Utilice el método PdfDocument.RemoveUnusedResources para eliminar dichos recursos.

Todas estas operaciones en PDF reducen el tamaño del archivo sin perder calidad.

Transformaciones con pérdida

En el caso de los archivos con imágenes, una de las formas más eficaces de reducir el tamaño de un PDF es cambiar el esquema de compresión de las imágenes. Por ejemplo, si se utiliza una compresión con pérdida como JPEG en las imágenes, se reducirá el tamaño. Como efecto secundario, pueden verse artefactos de compresión y pérdida de detalles en las imágenes.

Si las imágenes del PDF son más grandes de lo necesario, puede cambiar su tamaño. Esto puede proporcionar una compresión aún mejor. Otra opción es convertir las imágenes a blanco y negro (bitonal).

Puede aplanar campos de formulario y anotaciones para ahorrar espacio. Esto tiene sentido cuando ya no necesita anotaciones y campos de formulario editables en sus documentos.

Las fuentes pueden ocupar mucho espacio en los documentos. El método PdfDocument.RemoveUnusedFontGlyphs puede eliminar los glifos no utilizados de las fuentes para optimizar el tamaño de salida. La creación de subconjuntos de fuentes es otro nombre para este proceso. Incluso puede eliminar por completo bytes de fuentes del documento (fuente no incrustada). Esto puede tener sentido cuando el documento contiene bytes de una fuente popular como Arial.

Otras transformaciones eliminan directamente información de los documentos. Puede eliminar metadatos, información de estructura y datos privados de la aplicación. Estos datos no son visibles, pero elimínelos solo si no son importantes para los usuarios de sus documentos.

Para conocer más detalles y ver algunos ejemplos de código, lea el artículo sobre cómo reducir el tamaño de archivo PDF.

Reordenar páginas en PDF

Existen suficientes razones para cambiar el orden de las páginas de un PDF. Por ejemplo, es posible que necesite agrupar información relacionada o mejorar la legibilidad del documento asegurándose de que el documento fluye de manera lógica.

Reorganizar páginas en PDF

Además de la capacidad de fusionar y dividir páginas, Docotic.Pdf ofrece un amplio conjunto de otros métodos para reorganizar páginas en PDF. Usaré fragmentos de código C# y la API de Docotic.Pdf para mostrar cómo organizar páginas PDF.

Puede encontrar proyectos de prueba completos para los ejemplos de esta sección en el grupo de códigos de muestra Páginas y navegación. Utilizo ten-pages.pdf en los fragmentos. Este es un documento de prueba trivial con un título Page N en cada página.

Mover páginas PDF

El siguiente fragmento muestra cómo mover rangos continuos de páginas. El código mueve la primera mitad de las páginas al final del documento.

using var pdf = new PdfDocument("ten-pages.pdf");

pdf.MovePages(0, 5, pdf.PageCount);

pdf.Save("continuous-move.pdf");

Es posible mover conjuntos arbitrarios de páginas. El código siguiente mueve las páginas impares al final del documento.

using var pdf = new PdfDocument("ten-pages.pdf");

int[] indexes = [0, 2, 4, 6, 8];
pdf.MovePages(indexes, pdf.PageCount);

pdf.Save("arbitrary-move.pdf");

Para mover solo una página, utilice el método PdfDocument.MovePage.

Intercambiar páginas PDF

Para intercambiar dos páginas, utilice el código como en el siguiente fragmento.

using var pdf = new PdfDocument("ten-pages.pdf");

pdf.SwapPages(9, 0);
pdf.SwapPages(8, 1);

pdf.Save("swapped.pdf");

El método PdfDocument.SwapPages acepta los índices de las dos páginas que deben ocupar la posición de la otra. Cuando el número de páginas no es igual a dos, utilice uno de los métodos mover páginas.

Agregar e insertar páginas

Cualquier documento PdfDocument contiene al menos una página. Cuando se crea un documento nuevo, la biblioteca agrega una página de manera implícita.

Aquí se explica cómo insertar una página en blanco en un PDF mediante la API de Docotic.Pdf. Puede insertar páginas en posiciones con índices de 0 a PageCount inclusive.

using var pdf = new PdfDocument();

var newPage = pdf.InsertPage(0);
newPage.Canvas.DrawString("This is the new first page");

pdf.Save("two-pages.pdf");

Para agregar una página en blanco a un PDF, utilice el método PdfDocument.AddPage. El método agrega una nueva página al final del documento. Hace lo mismo que una llamada pdf.InsertPage(pdf.PageCount).

Para agregar o insertar páginas de otro documento, utilice una combinación de llamadas como se describe en la sección Anteponer PDF. Puede utilizar la combinación de llamadas para agregar una portada a un PDF.

Páginas PDF duplicadas

Con la API de la biblioteca, puede realizar la operación de duplicación como dos operaciones consecutivas. La primera es la operación de copiar páginas. Vea el ejemplo de código en la sección Dividir PDF.

La segunda es la operación de pegar páginas. Para esta operación, utilice el método PdfDocument.Append. Luego, mueva las páginas adjuntas a la posición requerida.

Extraer páginas

El siguiente fragmento muestra cómo extraer páginas de un PDF. Extrae las primeras tres páginas del documento de origen.

using var pdf = new PdfDocument("ten-pages.pdf");

using (var extracted = pdf.ExtractPages(0, 3))
{
    extracted.RemoveUnusedResources();
    extracted.Save("three-pages.pdf");
}

pdf.Save("seven-pages.pdf");

El método ExtractPages elimina páginas del documento. Debido a esto, solo quedan siete páginas en el documento de origen. La biblioteca no permite extraer páginas de un documento que contiene solo una página.

Recomendamos eliminar los recursos no utilizados del documento con las páginas extraídas.

Eliminar página de PDF

Vea el fragmento que muestra cómo eliminar una página en un documento PDF. En realidad, elimina dos páginas mediante diferentes sobrecargas del método RemovePage. La primera sobrecarga acepta un índice de página como parámetro. La segunda sobrecarga acepta un objeto de página.

using var pdf = new PdfDocument("ten-pages.pdf");
pdf.RemovePage(0);
pdf.RemovePage(pdf.Pages[0]);
pdf.Save("without-first-two-pages.pdf");

Para eliminar más de una página a la vez, utilice el método PdfDocument.RemovePages. Las sobrecargas de este método funcionan con matrices de índices de página u objetos de página.

Firmas digitales

Docotic.Pdf implementa muchas operaciones para firmas digitales en PDF y puede ayudarle a mantener la fiabilidad y validez legal de sus documentos PDF. A continuación, se muestran algunos ejemplos de lo que puede hacer la biblioteca:

Firme PDF con certificado. Agregar firmas digitales a un PDF es la forma de confirmar la identidad del firmante y garantizar que nadie haya alterado el documento después de firmarlo.

Certificar firma. Para agregar restricciones adicionales a un PDF, puede firmarlo con una firma de certificación. Puede bloquear completamente el PDF después de firmarlo o permitir algunos tipos de cambios.

Verificar firma en PDF. Comprueba la validez de una firma digital para confirmar que la parte firmada del documento no haya cambiado.

Permitir múltiples firmas. Los contratos, acuerdos y formularios suelen requerir que varias partes firmen un único documento. Agregar varias firmas a un PDF requiere que el documento se guarde de forma incremental.

Incorporar marca de tiempo de firma. Es posible especificar una URL de autoridad de sellado de tiempo y, opcionalmente, sus credenciales en las opciones de firma. La biblioteca incorporará la marca de tiempo recibida en la firma.

Incorporar certificado. La biblioteca incorpora automáticamente certificados de firma en las firmas digitales.

La página Firmas digitales contiene códigos de muestra y más información sobre cada operación.

Proteger PDF

Hay tres funciones que puede utilizar para garantizar la seguridad de los archivos PDF. Docotic.Pdf puede trabajar con ellas en ambas direcciones: la biblioteca puede proteger los archivos PDF y desbloquear un archivo PDF protegido.

Seguridad de PDF

Protección con contraseña

Esta función le permite establecer una contraseña para restringir el acceso al PDF. Según el tipo de contraseña, el PDF requerirá la contraseña correcta para abrir o modificar el documento.

Existen dos tipos de contraseñas en los archivos PDF:

  • Contraseña de apertura (contraseña de usuario). Este tipo de contraseña es necesaria para abrir y ver el PDF. Sin la contraseña correcta, un visor de PDF compatible no abrirá el documento.
  • Contraseña de permisos (contraseña de propietario). Esta contraseña es necesaria para eliminar los permisos de un PDF. Abrir un PDF con la contraseña de propietario permite todas las acciones, incluso si los permisos restringen ciertas acciones, como imprimir, copiar o editar el PDF.

Puede establecer ambas contraseñas para el mismo documento PDF. Lea sobre descifrado de archivos PDF para saber cómo eliminar contraseñas de documentos PDF.

Encriptación

El cifrado de PDF y las contraseñas de PDF funcionan en conjunto para garantizar que la información confidencial contenida en el PDF solo esté disponible para usuarios legítimos. Solo los usuarios con la clave de descifrado o la contraseña correctas pueden ver el contenido.

Docotic.Pdf puede cifrar archivos PDF utilizando algoritmos de cifrado RC4 de 40 bits, RC4 de 128 bits, AES de 128 bits y AES de 256 bits.

Permisos y restricciones

Puede establecer varios permisos en un PDF, como restringir la impresión, la copia de texto, la edición del documento y más. Los permisos solo afectan la experiencia cuando alguien abre el PDF con la contraseña de usuario. Las restricciones no se aplican a quienes abren el PDF con la contraseña de propietario.

Para eliminar los permisos de un PDF, primero deberá eliminar la contraseña de seguridad del PDF. Lea sobre cómo hacer esto con C# y la API Docotic.Pdf.

Para saber cómo garantizar la integridad del PDF además de la seguridad del PDF, lea la sección sobre firmas digitales.

Metadatos en PDF

Los metadatos de PDF son información incrustada en un archivo PDF que proporciona detalles sobre el documento. Existen dos fuentes principales de metadatos: las propiedades del documento PDF y los metadatos XMP.

Las propiedades del documento también se conocen comúnmente como diccionario de información del documento, información del archivo, campos de metadatos, atributos del documento y atributos del archivo.

Los metadatos XMP (Extensible Metadata Platform) son básicamente un archivo XML incrustado en un PDF. XMP utiliza un modelo de datos flexible que puede almacenar cualquier conjunto de propiedades de metadatos. Estos metadatos utilizan espacios de nombres para agrupar propiedades relacionadas. Algunos espacios de nombres comunes incluyen XMP Core/XMP Basic y Dublin Core.

Docotic.Pdf es totalmente compatible con metadatos XMP y propiedades de documentos. Tenga en cuenta que el estándar PDF 2.0 marcó la mayoría de las propiedades del diccionario de información de documentos como obsoletas. Las únicas excepciones son la fecha de creación y la fecha de modificación.

Puede encontrar proyectos de prueba completos para ejemplos de esta sección en el grupo Metadatos de códigos de muestra.

Propiedades del documento

Vea cómo editar las propiedades del documento con Docotic.Pdf.

using var pdf = new PdfDocument("file.pdf");
pdf.Info.Author = "An example code";
pdf.Info.Subject = "Showing how to access and change document metadata";
pdf.Info.Title = "Custom title goes here";
pdf.Info.Keywords = "pdf Docotic.Pdf";

pdf.Save("updated-file.pdf");

Puede cambiar el valor de cada propiedad, pero tenga en cuenta que, de forma predeterminada, la biblioteca actualiza automáticamente algunas propiedades antes de guardar el PDF. Puede cambiar esto en opciones de guardado.

Para eliminar todos los metadatos especificados en las propiedades del documento, utilice el método PdfInfo.Clear. El método puede eliminar únicamente las propiedades personalizadas, si así lo desea.

Metadatos XMP

Este fragmento muestra cómo cambiar las propiedades de los metadatos XMP en un documento PDF.

using var pdf = new PdfDocument("file.pdf");

pdf.Metadata.DublinCore.Creators = new XmpArray(XmpArrayType.Ordered);
pdf.Metadata.DublinCore.Creators.Values.Add(new XmpString("me"));
pdf.Metadata.DublinCore.Creators.Values.Add(new XmpString("Docotic.Pdf"));
pdf.Metadata.DublinCore.Format = new XmpString("application/pdf");

pdf.Metadata.Pdf.Producer = new XmpString("me too!");

pdf.Save("updated-file.pdf");

El código cambia las propiedades en los esquemas Dublin Core y Adobe PDF. Tenga en cuenta que la propiedad Producer se sobrescribe debido a las opciones de guardado predeterminadas.

Puede extraer metadatos XMP sin procesar utilizando uno de los métodos XmpMetatada.Save. El método generará un XML con todas las propiedades.

Para eliminar todos los metadatos XMP de un documento, utilice el método XmpMetadata.Unembed.

Sincronizar metadatos

Es conveniente asegurarse de que tanto los metadatos XMP como las propiedades de información del documento tengan los mismos valores para las propiedades correspondientes. Esto es especialmente cierto si edita ambas fuentes de metadatos en el mismo archivo.

Utilice el método PdfDocument.SyncMetadata para sincronizar los valores de los metadatos XMP y la información del documento. Cuando una propiedad cambia en ambas fuentes, el método sobrescribirá una fuente con el valor de la otra fuente. Lea la documentación del método para obtener más detalles.

Marcadores PDF

Un documento PDF puede contener accesos directos o enlaces especiales que ayudan a los lectores a navegar rápidamente a secciones o páginas específicas. El esquema PDF es otro nombre para los marcadores.

Esquema en formato PDF

Las aplicaciones de visualización suelen mostrar los marcadores como la tabla de contenidos de un libro, pero de forma interactiva. Cuando el lector hace clic en un marcador, la aplicación de visualización salta a la parte designada del documento. Es posible lograr un comportamiento similar usando anotaciones de enlaces.

A continuación se muestra un fragmento de código C# que muestra cómo agregar marcadores a un PDF:

using var pdf = new PdfDocument("ten-pages.pdf");

var root = pdf.OutlineRoot;
root.AddChild("Fifth page", 4);
root.AddChild("Seventh page", pdf.Pages[6]);

pdf.PageMode = PdfPageMode.UseOutlines;
pdf.Save("simple-bookmarks.pdf");

El esquema de PDF puede tener marcadores principales y marcadores secundarios, lo que facilita la estructuración de documentos grandes. A continuación, se muestra cómo crear marcadores secundarios en PDF:

using var pdf = new PdfDocument("ten-pages.pdf");

var root = pdf.OutlineRoot;
var evenPages = root.AddChild("Even pages");

evenPages.AddChild("Second page", 1);
evenPages.AddChild("Fourth page", 3);

pdf.PageMode = PdfPageMode.UseOutlines;
pdf.Save("even-pages-bookmarks.pdf");

Puedes aplicar fuentes y colores a los elementos de marcadores. Consulta el ejemplo completo para crear un esquema con estilos.

Para eliminar un marcador de un PDF, utilice los métodos RemoveChild o RemoveChildAt. Puede eliminar todos los marcadores llamando al método RemoveAllChildren en el nodo raíz.

Archivos adjuntos

Los archivos adjuntos en formato PDF son archivos externos incrustados en un documento PDF. A estos archivos también se los suele llamar archivos incrustados o adjuntos. Puedes adjuntar cualquier archivo: imagen, archivo de audio o video, otro PDF, documento de Word, hojas de cálculo de Excel o cualquier otra cosa.

Si desea adjuntar archivos PDF y crear un archivo PDF combinado, consulte el artículo sobre combinar documentos PDF.

Aquí está el código C# que muestra cómo agregar un archivo adjunto a un PDF con la ayuda de la API Docotic.Pdf.

using var pdf = new PdfDocument();

var excelFile = pdf.CreateFileAttachment("this-year-figures.xlsx");
pdf.SharedAttachments.Add(excelFile);

pdf.Save("shared-attachment.pdf");

El código anterior agregó el archivo como adjunto compartido. Los lectores pueden encontrar el archivo adjunto en el panel Adjuntos de su visor.

También es posible agregar archivos adjuntos a las páginas PDF. Dichos archivos adjuntos son visibles dentro del contenido de la página como cualquier otras anotaciones.

using var pdf = new PdfDocument();

var page = pdf.Pages[0];
page.Canvas.DrawString(20, 100, "Here is this year's figures document:");

var bounds = PdfRectangle.FromLTRB(155, 100, 165, 110);
var excelFile = pdf.CreateFileAttachment("this-year-figures.xlsx");
pdf.Pages[0].AddFileAnnotation(bounds, excelFile);

pdf.Save("page-attachment.pdf");

Consulte el grupo Archivos adjuntos de códigos de muestra para encontrar proyectos de prueba completos para los ejemplos de esta sección.

Para eliminar archivos adjuntos de un PDF, deberá enumerar tanto los archivos adjuntos compartidos como las anotaciones de página y eliminar los elementos que no necesite. Vea el ejemplo del código de enumeración a continuación. Para eliminar todas las anotaciones compartidas, puede usar una llamada pdf.SharedAttachments.Clear().

También necesitarás enumerar colecciones para extraer archivos incrustados del PDF. Aquí tienes un código de ejemplo:

using var pdf = new PdfDocument("file-with-attachments.pdf");

int i = 0;
foreach (var attachment in pdf.SharedAttachments)
{
    if (attachment?.Contents == null)
        continue;

    var fileName = attachment.Specification ?? $"attachment{i++}";
    attachment.Contents.Save(fileName);
}

foreach (var widget in pdf.GetWidgets())
{
    var attachment = (widget as PdfFileAttachmentAnnotation)?.File;
    if (attachment?.Contents == null)
        continue;

    var fileName = attachment.Specification ?? $"attachment{i++}";
    attachment.Contents.Save(fileName);
}

Etiquetas de página

Las etiquetas de página PDF son nombres o números personalizados que se asignan a las páginas de un documento PDF. A diferencia de los números de página estándar, las etiquetas de página pueden incluir una combinación de letras, números e incluso números romanos. Otros nombres para las etiquetas de página son identificadores de página y nombres de página.

A continuación se explica cómo agregar etiquetas de página a un PDF usando Docotic.Pdf:

using var pdf = new PdfDocument("ten-pages.pdf");

pdf.PageLabels.AddRange(0, 3, PdfPageNumberingStyle.LowercaseRoman);
pdf.PageLabels.AddRange(4, PdfPageNumberingStyle.DecimalArabic, string.Empty, 5);
pdf.PageLabels.AddRange(7, PdfPageNumberingStyle.DecimalArabic, "Appendix page ", 1);

pdf.Save("page-labels.pdf");

Las primeras cuatro páginas tendrán las etiquetas i, ii, iii y iv. Las tres siguientes serán 5, 6 y 7. En las páginas restantes, las etiquetas serán Appendix page 1, Appendix page 2 y Appendix page 3.

OCR PDF

Algunos documentos PDF contienen páginas escaneadas y requieren reconocimiento óptico de caracteres (OCR) antes de poder extraer texto de ellos. Otro caso de uso del OCR es extraer texto de un PDF que utiliza una asignación personalizada de glifos a Unicode.

OCR escanea un PDF para extraer texto

Tenemos una publicación de blog que muestra cómo OCR escaneado documentos. La publicación contiene un ejemplo de PDF que no permite realizar búsquedas y muestra cómo usar Tesseract OCR, código C# y Docotic.Pdf para reconocer texto en archivos PDF que solo contienen imágenes. También puede agregar una capa de texto OCR a los archivos PDF escaneados con la ayuda de Docotic.Pdf.

Editar páginas

En esta sección se habla sobre los cambios en las páginas PDF existentes, como:

  • cómo rotar páginas PDF
  • cómo cambiar el tamaño de la página
  • cómo usar gráficos vectoriales en el lienzo de la página
  • cómo agregar contenido HTML

Lea sobre la API de diseño de la biblioteca para saber cómo crear documentos PDF a partir de bloques de construcción como encabezado y pie de página, tablas, imágenes, párrafos de texto y similares.

Consulta las demás secciones para obtener información sobre:

Girar páginas

Vea el fragmento de código C# para saber cómo rotar solo una página en PDF:

using var pdf = new PdfDocument("existing.pdf");

pdf.Pages[0].Rotation = PdfRotation.Rotate180;

pdf.Save("rotated.pdf");

El código rota la primera página 180 grados. También puedes rotar páginas PDF 0, 90 y 270 grados.

Cambiar el tamaño de la página

Docotic.Pdf ofrece más de una forma de cambiar el tamaño de página de un PDF. En el caso más simple, puede utilizar las propiedades Width y Height de un objeto PdfPage para especificar el tamaño deseado. En el caso de un documento existente, no cambiará el tamaño del contenido de las páginas del documento ni eliminará ningún contenido. Simplemente ocultará todo el contenido de la página que esté fuera del rectángulo del tamaño especificado.

Un enfoque similar es el de recortar páginas. Puedes cambiar el CropBox de una página usando el código C# de la siguiente manera:

using var pdf = new PdfDocument("existing.pdf");

var page = pdf.Pages[0];
var cropBoxBefore = page.CropBox;
page.CropBox = new PdfBox(0, cropBoxBefore.Height - 256, 256, cropBoxBefore.Height);

pdf.Save("cropped.pdf");

Cambiar el cuadro de recorte es el camino a seguir si desea guardar una parte de la página como imagen.

Si el objetivo es mantener todo el contenido visible en una página de diferente tamaño, utilice el enfoque de escalado. En el siguiente fragmento de código, creo un XObject a partir de una página. El XObject es como una imagen vectorial. Puede dibujar el mismo objeto en varias páginas, escalarlo y rotarlo según sea necesario.

Una vez que el XObject está listo, borro el contenido de la página anterior, cambio el tamaño de la página y luego dibujo el objeto en la página redimensionada.

using var pdf = new PdfDocument("existing.pdf");

var page = pdf.Pages[0];
var pageXObject = pdf.CreateXObject(page);

page.Canvas.Clear();
page.Width /= 2;
page.Height /= 2;

page.Canvas.DrawXObject(pageXObject, 0, 0, page.Width, page.Height, 0);

pdf.Save("resized.pdf");

Gráficos vectoriales

La biblioteca Docotic.Pdf puede agregar gráficos vectoriales como líneas, curvas y formas a documentos PDF. Puede construir rutas de gráficos a partir de objetos gráficos. Luego, puede rellenar o trazar las rutas utilizando colores de diferentes espacios de color.

Encuentre códigos de ejemplo para funciones relacionadas con gráficos en el grupo Gráficos de códigos de muestra.

También es posible extraer gráficos de un PDF. Para ello, hay que empezar llamando al método GetObjects y luego extraer la información de los objetos del tipo PdfPageObjectType.Path. No hay que olvidar que los XObjects también pueden contener rutas anidadas.

using var pdf = new PdfDocument("existing.pdf");

var options = new PdfObjectExtractionOptions();
var objects = pdf.Pages[0].GetObjects(options);
foreach (var obj in objects)
{
    if (obj.Type == PdfPageObjectType.Path)
    {
        var path = (PdfPath)obj;
        Console.WriteLine($"Found path {path}");
    }
    else if (obj.Type == PdfPageObjectType.XObject)
    {
        var paintedXObject = (PdfPaintedXObject)obj;
        var nestedObjects = paintedXObject.XObject.GetObjects(options);
        // ...
    }
}

Añadir HTML a páginas PDF

Superponer contenido HTML en un documento PDF puede ser útil para agregar elementos dinámicos como gráficos o cotizaciones de acciones a sus PDF.

Lea sobre cómo insertar HTML en PDF para obtener más detalles y descargar un código de ejemplo.

Editar texto PDF

Esta sección trata sobre cómo editar el texto en un PDF, cómo cambiar el color del texto en un PDF y cómo agregar texto nuevo.

El editor de PDF cambia el texto

Tenemos un artículo dedicado a cómo extraer texto de un PDF. Échale un vistazo para obtener más información sobre el tema.

Aplanar texto también es posible con la ayuda de Docotic.Pdf.

Buscar y reemplazar

Para modificar el texto en un PDF, deberá buscar el área que contiene el texto y luego eliminarlo. El último paso es agregar el texto nuevo a la misma área del documento.

La búsqueda de archivos PDF puede ser complicada porque, internamente, el documento puede contener palabras en cualquier orden. El texto también se puede rotar. Afortunadamente, tenemos un código de muestra que muestra cómo buscar palabras o frases en un PDF.

Cuando tenga las coordenadas del texto que desea eliminar, será el momento de editar el contenido de la página que lo contiene. La biblioteca proporciona medios para enumerar y copiar objetos de página. Por lo tanto, es posible omitir parte del texto al copiar objetos. Esto eliminará esencialmente el texto. El código del ejemplo editar contenido de página PDF muestra todos los detalles del proceso. Deberá actualizar el método ShouldRemoveText para utilizar las coordenadas encontradas.

Lea la siguiente sección para ver cómo agregar el nuevo texto al documento.

Si crea documentos con un texto de marcador de posición y luego reemplaza el marcador de posición con otro texto, puede usar cuadros de texto en su lugar.

La idea es agregar un cuadro de texto de solo lectura sin bordes al documento y colocar el texto del marcador de posición en él. Luego, puede abrir el documento, buscar el cuadro de texto por su nombre y reemplazar el marcador de posición con una simple llamada box.Text = "new text";. Aplane el cuadro de texto después del reemplazo si no desea realizar más cambios.

Añadir nuevo texto

Para agregar texto a los documentos, utilice los métodos DrawString y DrawText de un objeto PdfCanvas. Los métodos utilizan la fuente del lienzo actual. La fuente debe contener glifos para todos los caracteres del texto. Utilice el método PdfFont.ContainsGlyphsForText para comprobar si la fuente cumple con este requisito.

var canvas = pdf.Pages[0].Canvas;
canvas.Font = pdf.AddFont("NSimSun")
    ?? throw new ArgumentException("Font not found");

canvas.DrawString(10, 50, "Olá. 你好. Hello. This is some new text");

Puede agregar texto Unicode dibujado con fuentes Type1, TrueType y OpenType. La biblioteca puede usar fuentes instaladas en su sistema, 14 fuentes Type1 integradas o cargar una fuente requerida desde un archivo.

Cambiar el color del texto

Para cambiar el color del texto en PDF, utilice el mismo enfoque que con eliminar texto. Deberá cambiar al menos el método ReplaceColor en el código de muestra.

Imágenes

Docotic.Pdf ofrece todo lo necesario para editar imágenes PDF. A continuación, se muestran fragmentos de código C# para las operaciones más habituales.

El grupo Imágenes de códigos de muestra contiene proyectos de prueba completos para los ejemplos de esta sección.

Añadir imagen a PDF

La biblioteca puede importar imágenes en formatos GIF/TIFF/PNG/BMP/JPEG. También puede agregar una imagen desde un objeto System.Drawing.Image.

var canvas = pdf.Pages[0].Canvas;
var image = pdf.AddImage("image.jpg")
    ?? throw new ArgumentException("Cannot add image");

canvas.DrawImage(image, 10, 50);

Puede especificar un ángulo de rotación y un tamaño de salida mediante sobrecargas del método DrawImage. Para dibujar la misma imagen en varias páginas, agregue la imagen una vez y use el mismo objeto PdfImage en varias llamadas al método DrawImage.

Combinar imágenes en PDF

Aquí está el código C# que muestra cómo combinar varias imágenes en un PDF.

using var pdf = new PdfDocument();

var imagePaths = new string[] { "image.jpg", "another-image.png" };
foreach (var path in imagePaths)
{
    var image = pdf.AddImage(path)
        ?? throw new ArgumentException("Cannot add image");

    var page = pdf.AddPage();
    page.Width = image.Width;
    page.Height = image.Height;

    page.Canvas.DrawImage(image, 0, 0);
}

pdf.RemovePage(0);
pdf.Save("combined-images.pdf");

El código agrega varias imágenes al PDF y cambia el tamaño de cada página para que coincida con el tamaño de la imagen correspondiente. Antes de guardar el resultado, el código elimina la primera página vacía agregada implícitamente.

Extraer imágenes PDF

Diseñamos Docotic.Pdf para extraer imágenes de archivos PDF sin comprometer la calidad de las imágenes. La biblioteca no cambia el tamaño ni la compresión de las imágenes. Obtendrá imágenes de la misma calidad que en el PDF.

using var pdf = new PdfDocument("file-with-images.pdf");
int i = 0;
foreach (PdfImage image in pdf.GetImages())
{
    var path = image.Save($"image{i++}");
    Console.WriteLine($"Saved to {path}");
}

Eliminar y reemplazar imágenes

Utilice el método PdfPage.RemovePaintedImages para eliminar todas las imágenes o imágenes específicas de una página PDF. Puede filtrar las imágenes por posición, tamaño, transformación u otros parámetros.

using var pdf = new PdfDocument("file-with-images.pdf");
pdf.Pages[0].RemovePaintedImages(
    image =>
    {
        return image.Size.Width > 100;
    }
);

pdf.RemoveUnusedResources();
pdf.Save("no-wide-images.pdf");

El código C# anterior muestra cómo eliminar imágenes con la ayuda de Docotic.Pdf. Recomiendo eliminar los recursos no utilizados después de modificar o eliminar imágenes.

Utilice el método PdfImage.ReplaceWith para reemplazar todas las apariciones de la imagen dentro del documento PDF.

using var pdf = new PdfDocument("file-with-images.pdf");
var firstImage = pdf.GetImages(false).FirstOrDefault()
    ?? throw new ArgumentException("No images found");

firstImage.ReplaceWith("another-image.png");

pdf.RemoveUnusedResources();
pdf.Save("replaced-image.pdf");

Cambiar el esquema de compresión

Docotic.Pdf ofrece métodos para cambiar la compresión de imágenes PDF. Es posible volver a empaquetar las imágenes utilizando algoritmos de compresión JPEG, CCITT Grupo 3 y 4 (fax), JPEG 2000 y zip/deflate.

Dependiendo de la compresión inicial y de la nueva, el cambio puede provocar pérdida de detalle o de calidad de la imagen. Pero las conversiones con pérdida suelen ayudar a reducir el tamaño del documento.

firstImage.RecompressWithJpeg2000(25);

Existen otros métodos para volver a empaquetar una imagen. Consulte los métodos PdfImage cuyos nombres comiencen con RecompressWith. Puede eliminar cualquier compresión de una imagen utilizando el método Uncompress.

Cambiar el tamaño de las imágenes

Si algunas imágenes en un documento PDF son más grandes de lo necesario, la biblioteca puede cambiar su tamaño o reducir su tamaño para usted.

firstImage.Scale(0.5, PdfImageCompression.Jpeg2000, 25);

El código anterior reduce el tamaño de la primera imagen dos veces en ambas direcciones. La biblioteca utiliza compresión JPEG 2000 para la imagen resultante.

Puede utilizar uno de los métodos ResizeTo para especificar valores exactos para el ancho y la altura resultantes.

Cambiar el tamaño de las imágenes generalmente reduce el tamaño del archivo PDF incluso más que cambiar su compresión (ver la sección anterior), pero es un proceso con pérdida.

Marcas de agua y fondos

Marca de agua en PDF

La marca de agua de un PDF implica estos pasos:

  • Crear un XObject, el contenedor para el contenido de la marca de agua
  • Rellenar el objeto con texto, imágenes y gráficos vectoriales
  • Estampar el objeto en las páginas PDF

Aquí está el código C# que agrega la marca de agua Confidential al PDF:

using var pdf = new PdfDocument("existing.pdf");

var watermark = pdf.CreateXObject();
watermark.DrawOnBackground = true;

var canvas = watermark.Canvas;
canvas.FontSize = 72;
canvas.Brush.Color = new PdfRgbColor(222, 35, 35);
canvas.Brush.Opacity = 45;
canvas.Pen.Color = canvas.Brush.Color;
canvas.Pen.Opacity = canvas.Brush.Opacity;
canvas.Pen.Width = 5;

var padding = 10;
var text = "CONFIDENTIAL";
canvas.DrawString(padding, padding, text);

var textSize = canvas.MeasureText(text);
var watermarkRect = new PdfRectangle(
    padding, padding, textSize.Width, textSize.Height);
canvas.DrawRoundedRectangle(watermarkRect, new PdfSize(padding, padding));

foreach (var page in pdf.Pages)
{
    page.Canvas.DrawXObject(
        watermark,
        (page.Width - watermarkRect.Width) / 2,
        (page.Height - watermarkRect.Height) / 2);
}

pdf.Save("watermarked.pdf");

El código establece las propiedades del pincel y del lápiz del lienzo de la marca de agua. El pincel se utiliza para pintar el texto. Para averiguar el tamaño del texto, el código mide el texto. Luego dibuja un rectángulo con esquinas redondeadas alrededor del texto. El lápiz se utiliza para trazar el rectángulo.

Una vez que el contenido de la marca de agua está listo, el código lo dibuja en el centro de cada página.

Los fondos de PDF son muy similares a las marcas de agua. Al menos, se pueden crear de forma prácticamente idéntica. Para añadir un fondo a un PDF, haz lo mismo que en el código anterior, pero añade watermark.DrawOnBackground = true; después de la llamada CreateXObject. Ten en cuenta que el contenido opaco, como las imágenes, puede oscurecer el fondo.

Anotaciones

Docotic.Pdf ofrece una API completa para anotaciones en PDF. Puede crear, editar y eliminar anotaciones de documentos PDF. También es posible aplanar anotaciones.

Para anotar un texto, existen:

  • Notas adhesivas o anotaciones de texto. Consulte el método AddTextAnnotation de la clase PdfPage.
  • Resaltados. Consulte el método AddHighlightAnnotation.
  • Tachados. Consulte el método AddStrikeoutAnnotation.
  • Subrayados. Consulte los métodos AddJaggedUnderlineAnnotation y AddUnderlineAnnotation.

Utilice enlaces para pasar de una página a otra o a un recurso externo. Puede utilizar anotaciones de tinta para dibujar a mano alzada en una página PDF. Existen anotaciones de redacción para las partes que se designan para eliminar del documento. También puede incrustar audio, video o contenido 3D.

Resaltar texto

A continuación se explica cómo resaltar texto en documentos PDF:

using var pdf = new PdfDocument();

var page = pdf.Pages[0];
var canvas = page.Canvas;
canvas.FontSize = 30;

var text = "Highlighted text.";
var position = new PdfPoint(10, 50);
canvas.DrawString(position, text);
canvas.DrawString(" Not highlighted.");

var size = canvas.MeasureText(text);
var bounds = new PdfRectangle(position, size);

var color = new PdfRgbColor(145, 209, 227);
var annotationText = "Please pay attention to this part.";
page.AddHighlightAnnotation(annotationText, bounds, color);

pdf.Save("highlighted.pdf");

Para vincular a una página específica en PDF, use un código como este:

using var pdf = new PdfDocument();
var secondPage = pdf.AddPage();
secondPage.Canvas.DrawString(10, 50, "Welcome to the second page.");

var firstPage = pdf.Pages[0];
var canvas = firstPage.Canvas;
var linkRect = new PdfRectangle(10, 50, 100, 60);
canvas.DrawRectangle(linkRect, PdfDrawMode.Stroke);

var options = new PdfTextDrawingOptions(linkRect)
{
    HorizontalAlignment = PdfTextAlign.Center,
    VerticalAlignment = PdfVerticalAlign.Center
};
canvas.DrawText("Go to 2nd page", options);

firstPage.AddLinkToPage(linkRect, 1);

pdf.Save("linked.pdf");

En el código, la anotación del área de acción funciona como un hipervínculo interno. Estas áreas pueden navegar a recursos externos y también realizar acciones que no requieren navegación.

Eliminar anotaciones

Para eliminar anotaciones de un PDF:

  1. Acceda a la colección de widgets mediante la propiedad PdfPage.Widgets o el método PdfDocument.GetWidgets.
  2. Verifique el tipo, las propiedades o decida qué anotaciones ya no necesita.
  3. Elimine la anotación mediante el método PdfDocument.RemoveWidget o los métodos del objeto PdfWidgetCollection.

Para eliminar archivos adjuntos de un PDF, deberá eliminar tanto las anotaciones del archivo como archivos adjuntos compartidos.

Redactar PDF

Como biblioteca de redacción de PDF, Docotic.Pdf ofrece métodos para eliminar permanentemente o bloquear rápidamente información confidencial de sus documentos PDF.

Ocultar información en un PDF

Redactar texto

Aquí se explica cómo ocultar texto en PDF sin la herramienta Redactar, usando solo C# y Docotic.Pdf.

int i = 0;
foreach (var page in pdf.Pages)
{
    foreach (var word in page.GetWords())
    {
        if (i % 3 == 0)
        {
            page.Canvas.AppendRectangle(word.Bounds);
            page.Canvas.FillPath(PdfFillMode.Winding);
        }

        i++;
    }
}

El código dibuja un rectángulo negro sobre cada tercera palabra de un documento. Tenga en cuenta que el texto detrás de los rectángulos permanece en el documento y es posible extraerlo más tarde. Para eliminar el texto de forma permanente, utilice el enfoque de la sección sobre reemplazo de texto.

Redactar imágenes

También puedes usar rectángulos negros para cubrir imágenes, pero un método más sencillo sería reemplazar la imagen con una imagen negra de 1 por 1 píxel. Esto no solo resaltará visualmente la imagen censurada, sino que también eliminará los datos de la imagen original.

Consulta la sección sobre eliminación y reemplazo de imágenes para ver ejemplos de código. También recomiendo llamar al método PdfDocument.ReplaceDuplicateObjects después del reemplazo.

Formularios PDF

Docotic.Pdf puede crear Acroforms (este es otro nombre para formularios PDF) utilizando todo tipo de elementos interactivos como botones, casillas de verificación, listas desplegables, cuadros de lista, botones de opción y campos de texto.

Por lo general, solo se necesitan unas pocas líneas de código para agregar y configurar un campo de formulario. Por ejemplo, puede agregar campos editables a un PDF simplemente llamando al método PdfPage.AddTextBox. Los códigos de muestra del grupo Formularios y anotaciones brindan más información sobre la creación y el uso de formularios.

Cómo rellenar un formulario PDF

Utilice el método PdfDocument.GetControl para buscar un control PDF por su nombre completo o parcial. Una alternativa es enumerar los controles de documento mediante el método GetControls. En cualquier caso, deberá convertir el control al tipo de campo esperado.

using var pdf = new PdfDocument(@"example-form.pdf");

if (pdf.GetControl("txt-name") is PdfTextBox nameTextBox)
    nameTextBox.Text = "Bit Miracle team";

if (pdf.GetControl("txt-email") is PdfTextBox emailTextBox)
    emailTextBox.Text = "support@bitmiracle.com";

if (pdf.GetControl("check-agree") is PdfCheckBox agreeCheckBox)
    agreeCheckBox.Checked = true;

pdf.Save("filled-form.pdf");

El código utiliza este ejemplo de formulario PDF. En el código, establezco valores para los dos campos de texto y marco la casilla de verificación.

Cuando haya terminado de completar un formulario, puede aplanar todos sus campos.

Uso de JavaScript en formularios

Puede agregar acciones para controlar eventos. La clase PdfControl proporciona acceso a un conjunto predefinido de eventos. Los nombres de los eventos comienzan con On (por ejemplo, OnMouseDown).

A continuación se muestra un ejemplo de uso de JavaScript para formularios PDF:

using var pdf = new PdfDocument(@"example-form.pdf");
foreach (var field in pdf.GetControls())
    field.OnChange = pdf.CreateJavaScriptAction($"app.alert('{field.Name} changed!',3)");

pdf.Save("javascript-events.pdf");

Formato de datos de formularios

Existe otra forma de completar electrónicamente un PDF. Utilice la función de conversión de FDF a PDF de la biblioteca para completar automáticamente el formulario PDF desde una base de datos u otra fuente.

using var pdf = new PdfDocument(@"example-form.pdf");
pdf.ImportFdf("form-data.fdf");
pdf.Save("auto-populated.pdf");

El código utiliza este archivo FDF para llenar todos los campos del formulario a la vez.

Aplanar PDF

Esta sección trata sobre cómo aplanar un PDF.

Aplanamiento de PDF

Al acoplar un PDF, se convierten elementos interactivos, como formularios y anotaciones, en contenido estático para evitar que se realicen más ediciones. Un PDF acoplado puede ocupar muchos menos bytes y mantener el mismo aspecto.

Aplanar formularios y anotaciones

Para aplanar un PDF rellenable, utilice el método PdfDocument.FlattenControls. Este método dibuja todos los campos de formulario y otros controles en su página principal, eliminando el control de origen del documento.

Al aplanar un formulario PDF, también tiene sentido aplanar las anotaciones. Utilice el método PdfDocument.FlattenWidgets para aplanar los controles y las anotaciones al mismo tiempo.

Si solo desea convertir algunos controles o anotaciones a su representación visual, utilice el método PdfWidget.Flatten. Primero deberá encontrar el control requerido o la anotación.

Aplanar texto

Puede convertir texto PDF en contornos con la ayuda de Docotic.Pdf. El motivo habitual para ello es lograr la independencia de las fuentes. Independientemente de si las fuentes están instaladas, el texto aplanado se verá igual en cualquier dispositivo.

Sin embargo, una vez que conviertes el texto en contornos, ya no puedes editarlo como texto. Además, durante el proceso de aplanamiento, la biblioteca convierte el texto en gráficos vectoriales. Esto puede aumentar el tamaño de los archivos.

Para aplanar el texto de un PDF, deberá extraer el texto como rutas vectoriales y copiarlo en una página nueva o en la misma página. Hay un código de muestra para esto.

Opciones de guardado

En los fragmentos de código anteriores, utilicé el método PdfDocument.Save sin argumentos adicionales. La biblioteca utiliza las opciones de guardado predeterminadas en estos casos. Seleccionamos cuidadosamente las opciones predeterminadas para que funcionen perfectamente en los casos habituales.

Aun así, hay casos en los que es necesario anular las opciones predeterminadas. Para ello, cree un objeto PdfSaveOptions, configure las opciones y proporciónelas a uno de los métodos de guardado. A continuación, describiré esos casos.

Para proteger un PDF con una contraseña o un certificado, cree un controlador de cifrado y configúrelo en la propiedad EncryptionHandler.

Cuando desee firmar el mismo PDF varias veces, active el modo de actualizaciones incrementales configurando la propiedad WriteIncrementally en true. Haga lo mismo cuando guarde un archivo previamente firmado con nuevas anotaciones o datos de formulario.

Establezca la propiedad Linearize en true para generar un archivo PDF linealizado (o optimizado para Fast Web View). Los lectores que reconocen esta optimización pueden visualizar dichos archivos más rápido.

Para evitar cambios en la hora de guardado en algunos de los campos de metadatos, configure las propiedades UpdateProducer y UpdateModifiedDate en false.