Esta página puede contener texto traducido automáticamente.
Editar PDF en C#
Use 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.
Docotic.Pdf proporciona muchas formas de editar documentos PDF. Estas son algunas de las funciones clave de la biblioteca para la edición de PDF:
- Combine varios PDF en uno o divida un único PDF en varios archivos.
- Reduzca el tamaño de los archivos PDF.
- Reordene, 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.
- Rellene AcroForms, agregue o elimine controles de formulario.
- Aplane campos de formulario y anotaciones para que pasen a formar parte del contenido del PDF.
- Agregue, elimine o reemplace texto dentro del PDF.
- Inserte, reemplace y cambie el tamaño de imágenes.
- Agregue marcas de agua y fondos.
- Convierta documentos escaneados en texto editable y قابل de 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 PDFs
Esta sección trata dos funciones con objetivos opuestos.

Combinar PDF
Cuando consolida archivos PDF, crea un único documento PDF. El PDF combinado 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 combinació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, patrones.
copy.RemoveUnusedResources();
copy.Save(i + ".pdf");
}
Lea sobre otros enfoques para implementar un divisor de PDF en el artículo dedicado.
Compresión de PDF
Hay dos enfoques principales al comprimir un PDF. El primero consiste en aplicar solo operaciones que no cambian el contenido del archivo, solo su forma. El segundo enfoque también incluye cambios que pueden provocar pérdida de detalle o de calidad del documento para lograr una mejor compresión.
Compresión sin pérdida de PDF
De forma predeterminada, la biblioteca guarda los objetos PDF para que ocupen menos bytes. Para ello, excluye los objetos no utilizados, escribe los objetos sin formato y usa una forma más corta cuando es posible.
Para mejorar aún más la compresión, Docotic.Pdf también produce flujos de objetos en los PDF de salida. Esta es otra forma de escribir objetos con la representación más compacta. Los flujos de objetos se comprimen con el algoritmo Flate.
Puede influir en la forma en que la biblioteca guarda los objetos mediante las opciones de guardado.
Algunos documentos contienen fuentes, imágenes, perfiles de color y otros objetos duplicados. Suele ocurrir en documentos actualizados incrementalmente y en archivos creados al combinar varios documentos. La deduplicación de estos objetos usando 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 eran visibles en la página pero ya no lo son. Use el método PdfDocument.RemoveUnusedResources para eliminar esos recursos.
Todas estas operaciones sobre PDF reducen el tamaño del archivo sin perder calidad.
Transformaciones con pérdida
En archivos con imágenes, una de las formas más eficaces de reducir el tamaño del PDF es cambiar el esquema de compresión de las imágenes. Por ejemplo, usar una compresión con pérdida como JPEG en las imágenes reducirá el tamaño. Como efecto secundario, los artefactos de compresión y la pérdida de detalle pueden ser visibles en las imágenes.
Si las imágenes del PDF son más grandes de lo necesario, puede cambiarles el tamaño. Esto puede ofrecer una compresión incluso mejor. Otra opción es convertir las imágenes a blanco y negro (bitonal).
Puede aplanar campos de formulario y anotaciones para ahorrar algo de espacio. Tiene sentido cuando ya no necesita anotaciones ni campos de formulario editables en sus documentos.
Las fuentes pueden ocupar mucho espacio en los documentos. El método PdfDocument.RemoveUnusedFontGlyphs puede eliminar glifos no utilizados de las fuentes para optimizar el tamaño de salida. La subconfiguración de fuentes es otro nombre para este proceso. Incluso puede eliminar por completo los bytes de la fuente del documento (desincrustar la fuente). 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 un archivo PDF.
Reordenar páginas en PDF
Hay suficientes razones para cambiar el orden de las páginas dentro de un PDF. Por ejemplo, puede que necesite agrupar información relacionada, o mejorar la legibilidad del documento asegurando que fluya de forma lógica.

Además de la capacidad de fusionar y dividir páginas, Docotic.Pdf proporciona un amplio conjunto de otros métodos para reorganizar páginas en PDF. Usaré fragmentos de código en 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 Páginas y navegación de los códigos de ejemplo. Uso 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 de 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 siguiente código 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, use el método PdfDocument.MovePage.
Intercambiar páginas de PDF
Para intercambiar dos páginas, use 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, use uno de los métodos para mover páginas.
Agregar e insertar páginas
Todo PdfDocument contiene al menos una página. Cuando crea un documento nuevo, la biblioteca agrega una página implícitamente.
Así se inserta una página en blanco en PDF usando la API de Docotic.Pdf. Puede insertar páginas en posiciones con índices desde 0 hasta 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 PDF, use 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, use una combinación de llamadas como se describe en la sección Anteponer PDF. Puede usar esa combinación de llamadas para agregar una página de portada a un PDF.
Duplicar páginas de PDF
Con la API de la biblioteca, puede realizar la operación de duplicado 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, use el método PdfDocument.Append. Luego mueva las páginas agregadas a la posición requerida.
Extraer páginas
El siguiente fragmento muestra cómo extraer páginas de un PDF. Extrae las tres primeras 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 solo contiene una página.
Recomendamos eliminar los recursos no utilizados del documento con las páginas extraídas.
Eliminar página de PDF
Consulte el fragmento que muestra cómo eliminar una página en un documento PDF. En realidad, elimina dos páginas usando 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, use el método PdfDocument.RemovePages. Esas sobrecargas del método funcionan con matrices de índices de página o de objetos de página.
Firmas digitales
Docotic.Pdf implementa muchas operaciones para firmas digitales en PDF y puede ayudarle a mantener la confiabilidad y la validez legal de sus documentos PDF. Estos son algunos ejemplos de lo que la biblioteca puede hacer:
Firmar PDF con certificado. Agregar firmas digitales en PDF es la forma de confirmar la identidad del firmante y asegurarse de que nadie haya alterado el documento después de firmarlo.
Certificar la 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 la firma en PDF. Compruebe la validez de una firma digital para confirmar que la parte firmada del documento no cambió.
Permitir varias firmas. Los contratos, acuerdos y formularios a menudo requieren que varias partes firmen un solo documento. Agregar varias firmas a un PDF requiere que el documento se guarde incrementalmente.
Incorporar la marca de tiempo de la firma. Es posible especificar una URL de una 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 el certificado. La biblioteca incorpora automáticamente los certificados de firma en las firmas digitales.
La página de Firmas digitales contiene códigos de ejemplo y más información sobre cada operación.
Proteger PDF
Hay tres funciones que puede usar para garantizar la seguridad del PDF. Docotic.Pdf puede trabajar con ellas en ambos sentidos: la biblioteca puede proteger un PDF y desbloquear un PDF protegido.

Protección con contraseña
Esta función 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.
Hay dos tipos de contraseñas en los 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 PDF compatible no abrirá el documento.
- Contraseña de permisos (contraseña del propietario). Esta contraseña es necesaria para eliminar los permisos del PDF. Abrir un PDF con la contraseña del 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 descifrar archivos PDF para saber cómo eliminar contraseñas de documentos PDF.
Cifrado
El cifrado de PDF y las contraseñas de PDF funcionan juntos para garantizar que la información sensible dentro del 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 usando algoritmos RC4 de 40 bits, RC4 de 128 bits, AES de 128 bits y cifrado AES de 256 bits.
Permisos y restricciones
Puede establecer distintos 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 del propietario.
Para eliminar los permisos de un PDF, primero tendría que quitar la contraseña de seguridad del PDF. Lea cómo hacerlo usando C# y la API de 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 PDF son información incrustada dentro de un archivo PDF que proporciona detalles sobre el documento. Hay dos fuentes principales de metadatos: las propiedades del documento PDF y los metadatos XMP.
Las propiedades del documento también se denominan comúnmente 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 usa un modelo de datos flexible que puede almacenar cualquier conjunto de propiedades de metadatos. Estos metadatos usan espacios de nombres para agrupar propiedades relacionadas. Algunos espacios de nombres comunes incluyen XMP Core/XMP Basic y Dublin Core.
Docotic.Pdf admite completamente tanto los metadatos XMP como las propiedades del documento. Tenga en cuenta que el estándar PDF 2.0 marcó como obsoletas la mayoría de las propiedades del diccionario de información del documento. Las únicas excepciones son la fecha de creación y la fecha de modificación.
Puede encontrar proyectos de prueba completos para los ejemplos de esta sección en el grupo Metadatos de los códigos de ejemplo.
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 las opciones de guardado.
Para eliminar todos los metadatos especificados en las propiedades del documento, use el método PdfInfo.Clear. Si lo desea, el método puede eliminar solo las propiedades personalizadas.
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 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 usando 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, use el método XmpMetadata.Unembed.
Sincronizar metadatos
Es deseable asegurarse de que tanto los metadatos XMP como las propiedades de Document Info tengan los mismos valores para las propiedades correspondientes. Esto es especialmente cierto si edita ambas fuentes de metadatos en el mismo archivo.
Use el método PdfDocument.SyncMetadata para sincronizar los valores en XMP Metadata y Document Info. Cuando una propiedad cambió en ambas fuentes, el método sobrescribirá una fuente con el valor de la otra. Lea la documentación del método para más detalles.
Marcadores de 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.

Las aplicaciones visor suelen mostrar los marcadores como una tabla de contenidos en un libro, pero de forma interactiva. Cuando el lector hace clic en un marcador, la aplicación visor salta a la parte designada del documento. Se puede conseguir un comportamiento similar usando anotaciones de enlace.
Aquí hay un fragmento de código en C# que muestra cómo agregar marcadores a 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 PDF puede tener marcadores principales y submarcadores, lo que facilita estructurar documentos grandes. Así se crean submarcadores 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");
Puede aplicar fuentes y colores a los elementos de marcador. Consulte el ejemplo completo para crear un esquema con estilos.
Para eliminar un marcador de PDF, use los métodos RemoveChild o RemoveChildAt. Puede eliminar todos los marcadores llamando al método RemoveAllChildren en el nodo raíz.
Adjuntos de archivo
Los adjuntos de PDF son archivos externos incrustados dentro de un documento PDF. A estos archivos también se los suele llamar archivos incrustados y adjuntos de archivo. Puede adjuntar cualquier archivo: una imagen, un archivo de audio/vídeo, otro PDF, un documento de Word, hojas de cálculo de Excel o cualquier otra cosa.
Si desea adjuntar PDFs entre sí para crear un archivo PDF combinado, consulte el artículo sobre fusionar documentos PDF.
Aquí está el código en C# que muestra cómo agregar un adjunto a PDF con ayuda de la API de 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 Attachments de su visor.
También es posible agregar adjuntos a las páginas PDF. Estos adjuntos son visibles dentro del contenido de la página como cualquier otra anotación.
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 Adjuntos de los códigos de ejemplo para encontrar proyectos de prueba completos para los ejemplos de esta sección.
Para eliminar adjuntos de PDF, tendría que enumerar tanto los 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 todos los adjuntos compartidos, puede usar una llamada pdf.SharedAttachments.Clear().
También tendría que enumerar colecciones para extraer archivos incrustados de PDF. Aquí hay un ejemplo de código:
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 asignados a páginas en 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.
Así se agregan etiquetas de página a 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 siguientes tres etiquetas son 5, 6 y 7. Para las páginas restantes, las etiquetas serán Appendix page 1, Appendix page 2 y Appendix page 3.
OCR de 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 para OCR es extraer texto de un PDF que usa un mapeo de glifos personalizados a Unicode.

Tenemos una publicación en el blog que muestra cómo aplicar OCR a documentos escaneados. La publicación contiene un ejemplo de PDF no buscable y muestra cómo usar OCR de Tesseract, código en C# y Docotic.Pdf para reconocer texto en PDFs que solo contienen imágenes. También puede agregar una capa de texto OCR a archivos PDF escaneados con ayuda de Docotic.Pdf.
Editar páginas
Esta sección trata sobre cambios en páginas PDF existentes, como:
- cómo rotar páginas PDF
- cómo cambiar el tamaño de página
- usar gráficos vectoriales en el lienzo de la página
- agregar contenido HTML
Lea acerca de la Layout API 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.
Consulte las otras secciones para obtener información sobre:
- cómo editar texto en PDF
- operaciones con imágenes
- marca de agua en PDF
- cómo anotar un PDF
- cómo rellenar formularios PDF
Rotar páginas
Vea el fragmento de código en C# sobre 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 puede rotar páginas PDF 0, 90 y 270 grados.
Cambiar tamaño de 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 usar las propiedades Width y Height de un objeto PdfPage para especificar el tamaño deseado. En un documento existente, esto no redimensionará el contenido de las páginas del documento. Y no eliminará ningún contenido. Solo ocultará todo el contenido de la página que esté fuera del rectángulo del tamaño especificado.
Un enfoque similar es recortar páginas. Puede cambiar el CropBox de una página usando código C# como este:
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 la opción adecuada 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 distinto tamaño, entonces use 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 escalándolo y rotándolo según sea necesario.
Una vez que el XObject está listo, limpio el contenido anterior de la página, redimensiono 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 gráficas a partir de objetos gráficos. Luego puede rellenar o trazar las rutas usando colores de distintos espacios de color.
Encuentre el código de ejemplo para las funciones relacionadas con gráficos en el grupo Gráficos de los códigos de ejemplo.
También es posible extraer gráficos de PDF. Empiece llamando al método GetObjects y luego extraiga información de objetos de tipo PdfPageObjectType.Path. No olvide 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);
// ...
}
}
Agregar HTML a páginas PDF
Superponer contenido HTML sobre un documento PDF puede ser útil para agregar elementos dinámicos como gráficos o un ticker de precios 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 PDF y cómo agregar texto nuevo.

Tenemos un artículo dedicado a cómo extraer texto de un PDF. Consúltelo para obtener más información sobre el tema.
También es posible aplanar texto con ayuda de Docotic.Pdf.
Buscar y reemplazar
Para modificar texto en PDF, tendría que encontrar el área que contiene el texto y luego eliminar el texto en esa área. El último paso es agregar el nuevo texto a la misma área del documento.
Buscar en PDF puede ser complicado porque internamente el documento puede contener palabras en cualquier orden. El texto también puede estar rotado. Por suerte, tenemos un código de ejemplo que muestra cómo buscar palabras o frases en un PDF.
Cuando tenga las coordenadas del texto que desea eliminar, es momento de editar el contenido de la página correspondiente. La biblioteca proporciona medios para enumerar y copiar objetos de página. Así es posible omitir parte del texto mientras se copian los objetos. Esto eliminará esencialmente el texto. El código del ejemplo editar el contenido de una página PDF muestra todos los detalles del proceso. Tendría que actualizar el método ShouldRemoveText para usar las coordenadas encontradas.
Lea la siguiente sección para ver cómo agregar el nuevo texto al documento.
Si crea documentos con texto de marcador de posición y luego reemplaza ese marcador por otro texto, entonces puede usar cuadros de texto en su lugar.
La idea es agregar al documento un cuadro de texto de solo lectura y sin bordes, y poner en él el texto de marcador de posición. Más tarde puede abrir el documento, encontrar el cuadro de texto por su nombre y reemplazar el marcador con una simple llamada box.Text = "new text";. Aplane el cuadro de texto después del reemplazo si no desea más cambios.
Agregar texto nuevo
Para agregar algo de texto a los documentos, use los métodos DrawString y DrawText de un objeto PdfCanvas. Los métodos usan la fuente actual del lienzo. La fuente debe contener glifos para todos los caracteres del texto. Use el método PdfFont.ContainsGlyphsForText para comprobar si la fuente cumple este requisito.
var canvas = pdf.Pages[0].Canvas;
canvas.Font = pdf.CreateFont("NSimSun");
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 necesaria desde un archivo.
Cambiar color del texto
Para cambiar el color del texto en PDF, use el mismo enfoque que con eliminación de texto. Tendría que cambiar al menos el método ReplaceColor en el código de ejemplo.
Imágenes
Docotic.Pdf proporciona todo lo necesario para editar imágenes PDF. A continuación hay fragmentos de código en C# para las operaciones más populares.
El grupo Imágenes de los códigos de ejemplo contiene proyectos de prueba completos para los ejemplos de esta sección.
Agregar imagen al 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.CreateImage("image.jpg");
canvas.DrawImage(image, 10, 50);
Puede especificar un ángulo de rotación y un tamaño de salida usando 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 en C# que muestra cómo combinar varias imágenes en un único PDF.
using var pdf = new PdfDocument();
var imagePaths = new string[] { "image.jpg", "another-image.png" };
foreach (var path in imagePaths)
{
var image = pdf.CreateImage(path);
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 a PDF, cambiando 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 de 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 con 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
Use el método PdfPage.RemovePaintedImages para eliminar todas o algunas imágenes de una página PDF. Puede filtrar 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 ayuda de Docotic.Pdf. Recomiendo eliminar los recursos no utilizados después de haber cambiado o eliminado imágenes.
Use 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 esquema de compresión
Docotic.Pdf proporciona métodos para cambiar la compresión de imágenes PDF. Es posible volver a codificar las imágenes usando algoritmos de compresión JPEG, CCITT Group 3 y 4 (fax), JPEG 2000 y zip/deflate.
Según la compresión inicial y la nueva, el cambio puede causar pérdida de detalle o de calidad en 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. Revise los métodos de PdfImage cuyos nombres comienzan con RecompressWith. Puede eliminar cualquier compresión de una imagen usando el método Uncompress.
Cambiar tamaño de imágenes
Si algunas imágenes de un documento PDF son más grandes de lo necesario, la biblioteca puede cambiarles el tamaño o reducir su escala por usted.
firstImage.Scale(0.5, PdfImageCompression.Jpeg2000, 25);
El código anterior hace que la primera imagen sea dos veces más pequeña en ambas direcciones. La biblioteca usa compresión JPEG 2000 para la imagen resultante.
Puede usar uno de los métodos ResizeTo para especificar valores exactos de ancho y alto para el resultado.
Cambiar el tamaño de las imágenes suele reducir el tamaño del archivo PDF incluso más que cambiar su compresión (consulte la sección anterior), pero es un proceso con pérdida.
Marcas de agua y fondos

Crear una marca de agua en PDF implica estos pasos:
- Cree un XObject, el contenedor del contenido de la marca de agua
- Rellene el objeto con texto, imágenes y gráficos vectoriales
- Estampe las páginas PDF con el objeto
Aquí está el código en 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 de pincel y pluma del lienzo de la marca de agua. El pincel se usa para pintar el texto. Para conocer el tamaño del texto, el código mide el texto. Luego dibuja un rectángulo con esquinas redondeadas alrededor del texto. La pluma se usa 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 puede crearlos casi de la misma manera. Para agregar un fondo al PDF, haga lo mismo que en el código anterior, pero agregue watermark.DrawOnBackground = true; después de la llamada CreateXObject. Tenga en cuenta que el contenido opaco, como las imágenes, puede ocultar el fondo.
Anotaciones
Docotic.Pdf proporciona una API rica para anotaciones en PDF. Puede crear, editar y eliminar anotaciones de documentos PDF. También es posible aplanar anotaciones.
Para anotar texto, existen:
- Notas adhesivas o anotaciones de texto. Vea el método
AddTextAnnotationde la clasePdfPage. - Resaltados. Vea el método
AddHighlightAnnotation. - Tachados. Vea el método
AddStrikeoutAnnotation. - Subrayados. Vea los métodos
AddJaggedUnderlineAnnotationyAddUnderlineAnnotation.
Use enlaces para saltar de una página a otra o a un recurso externo. Puede usar anotaciones de tinta para dibujar a mano alzada en una página PDF. Existen anotaciones de censura para partes que están designadas para ser eliminadas del documento. También puede incrustar contenido de audio, vídeo o 3D.
Resaltar texto
Así se resalta 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");
Enlaces
Para enlazar 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 también pueden navegar a recursos externos y realizar acciones que no implican navegación.
Eliminar anotaciones
Para eliminar anotaciones de PDF:
- Acceda a la colección de widgets usando la propiedad
PdfPage.Widgetso el métodoPdfDocument.GetWidgets. - Compruebe el tipo, las propiedades o decida de otro modo qué anotaciones ya no necesita.
- Elimine la anotación usando el método
PdfDocument.RemoveWidgeto los métodos del objetoPdfWidgetCollection.
Para eliminar adjuntos de PDF, tendría que eliminar tanto las anotaciones de archivo como los adjuntos compartidos.
Censurar PDF
Como biblioteca de censura de PDF, Docotic.Pdf ofrece métodos para eliminar de forma permanente o para ocultar rápidamente información sensible de sus documentos PDF.

Censurar texto
Así puede ocultar texto en PDF sin la herramienta Redact, 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, use el enfoque de la sección sobre reemplazar texto.
Censurar imágenes
También puede usar rectángulos negros para cubrir imágenes. Pero un enfoque 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 originales de la imagen.
Consulte la sección sobre eliminar y reemplazar 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) usando 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 hacen falta unas pocas líneas de código para agregar y configurar un campo de formulario. Por ejemplo, puede agregar campos editables a PDF simplemente llamando al método PdfPage.AddTextBox. Los códigos de ejemplo en el grupo Formularios y anotaciones proporcionan más información sobre cómo crear y usar formularios.
Cómo rellenar un formulario PDF
Use el método PdfDocument.TryGetControl para recuperar un control PDF por su nombre completo o parcial. Alternativamente, puede enumerar todos los controles del documento usando el método GetControls. En ambos enfoques, necesitará convertir el resultado al tipo de campo esperado.
using var pdf = new PdfDocument(@"example-form.pdf");
if (pdf.TryGetControl("txt-name", out var c) && c is PdfTextBox nameTextBox)
nameTextBox.Text = "Bit Miracle team";
if (pdf.TryGetControl("txt-email", out c) && c is PdfTextBox emailTextBox)
emailTextBox.Text = "support@bitmiracle.com";
if (pdf.TryGetControl("check-agree", out c) && c is PdfCheckBox agreeCheckBox)
agreeCheckBox.Checked = true;
pdf.Save("filled-form.pdf");
El código usa este ejemplo de formulario PDF. En el código, establezco valores para los dos campos de texto y marco la casilla.
Cuando termine de rellenar un formulario, puede aplanar todos sus campos.
Uso de JavaScript en formularios
Puede agregar acciones a eventos de controles. La clase PdfControl proporciona acceso a un conjunto predefinido de eventos. Los nombres de los eventos comienzan con "On" (por ejemplo, OnMouseDown).
Aquí hay 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 una forma más de rellenar electrónicamente un PDF. Use la función FDF a PDF de la biblioteca para completar automáticamente un 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 usa este archivo FDF para rellenar todos los campos del formulario a la vez.
Aplanar PDF
Esta sección trata sobre cómo aplanar un PDF.

Cuando aplana un PDF, convierte elementos interactivos como formularios y anotaciones en contenido estático para evitar ediciones posteriores. Un PDF aplanado puede ocupar muchos menos bytes y verse igual.
Aplanar formularios y anotaciones
Para aplanar un PDF rellenable, use 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.
Cuando aplana un formulario PDF, tiene sentido aplanar también las anotaciones. Use el método PdfDocument.FlattenWidgets para aplanar controles y anotaciones al mismo tiempo.
Si solo desea convertir algunos controles y/o anotaciones a su representación visual, use el método PdfWidget.Flatten. Primero tendría que encontrar el control requerido o la anotación.
Aplanar texto
Puede convertir texto PDF en contornos con ayuda de Docotic.Pdf. La razón habitual para hacerlo es lograr independencia de fuentes. Independientemente de si las fuentes están instaladas, el texto aplanado se verá igual en cualquier dispositivo.
Sin embargo, una vez que convierte el texto en contornos, ya no puede editarlo como texto. Además, durante el proceso de aplanado, la biblioteca convierte el texto en gráficos vectoriales. Esto puede aumentar el tamaño del archivo.
Para aplanar texto PDF, tendría que extraer el texto como rutas vectoriales y copiarlo en una página nueva o en la misma. Hay un código de ejemplo para esto.
Opciones de guardado
En los fragmentos de código anteriores, usé el método PdfDocument.Save sin argumentos adicionales. La biblioteca usa las opciones de guardado predeterminadas en esos casos. Hemos elegido cuidadosamente los valores predeterminados para que, en los casos habituales, funcionen perfectamente.
Aun así, hay casos en los que necesita sobrescribir las opciones predeterminadas. Para ello, cree un objeto PdfSaveOptions, configure las opciones y páselas 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 asígnelo a la propiedad EncryptionHandler.
Cuando quiera firmar el mismo PDF varias veces, active el modo de actualizaciones incrementales estableciendo la propiedad WriteIncrementally en true. Haga lo mismo cuando guarde un archivo firmado previamente con nuevas anotaciones o datos de formulario.
Establezca la propiedad Linearize en true para producir un archivo PDF linealizado (u optimizado para Fast Web View). Los visores que reconocen esta optimización pueden mostrar esos archivos más rápido.
Para evitar cambios en tiempo de guardado en algunos de los campos de metadatos, establezca las propiedades UpdateProducer y UpdateModifiedDate en false.