¿Cómo insertar texto en un archivo PDF con C# .Net? ITextSharp

Para realizar esto vamos a hacer uso de la librería ITextSharp.Net, la cual deben instalar primero mediante Nuget (si no sabes cómo utilizar Nuget yo te muestro aquí).

El código a continuación viene comentado paso a paso para que puedas entender cómo se puede insertar texto en un archivo PDF existente.


 //rutas de nuestros pdf
string pathPDF = @"C:\original.pdf";
string pathPDF2 = @"C:\con_texto.pdf";

//Objeto para leer el pdf original
PdfReader oReader = new PdfReader(pathPDF);
//Objeto que tiene el tamaño de nuestro documento
Rectangle oSize = oReader.GetPageSizeWithRotation(1);
//documento de itextsharp para realizar el trabajo asignandole el tamaño del original
Document oDocument = new Document(oSize);

// Creamos el objeto en el cual haremos la inserción
FileStream oFS = new FileStream(pathPDF2, FileMode.Create, FileAccess.Write);
PdfWriter oWriter = PdfWriter.GetInstance(oDocument, oFS);
oDocument.Open();

//El contenido del pdf, aqui se hace la escritura del contenido
PdfContentByte oPDF = oWriter.DirectContent;

//Propiedades de nuestra fuente a insertar
BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA_BOLD, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
oPDF.SetColorFill(BaseColor.RED);
oPDF.SetFontAndSize(bf, 8);

//Se abre el flujo para escribir el texto
oPDF.BeginText();
//asignamos el texto
string text = "HOLA SOY UN TEXTO ROJO EN UN PDF";
// Le damos posición y rotación al texto
// la posición de Y es al revés de como estamos acostumbrados
oPDF.ShowTextAligned(1, text, 30, oSize.Height-30, 0);
oPDF.EndText();         

//crea una nueva pagina y agrega el pdf original
PdfImportedPage page = oWriter.GetImportedPage(oReader, 1);
oPDF.AddTemplate(page, 0, 0);

// Cerramos los objetos utilizados
oDocument.Close();
oFS.Close();
oWriter.Close();
oReader.Close();

¿Cómo aplicar un update a varias filas por medio de EntityFramework.Extended? C# .Net

Existen varias formas de modificar varios elementos en conjunto por medio de Entity Framework.

Aquí te muestro como hacerlo sin utilizar una librería externa, es decir, modificar varios objetos sin EntityFramework.Extended.

Igual te recuerdo que utilizar EntityFramework.Extended como Entity Framework nativo no las recomiendo cuando vas a modificar más de mil datos, mejor utiliza un procedimiento almacenado.

La ventaja que veo al utilizar EntityFramework.Extended es un aspecto de sintaxis ya que de esta manera evitamos hacer el recorrido de los elementos e ir modificando objeto por objeto, con esta librería es de una forma más sencilla para el programador.

Para el siguiente ejemplo,  supongamos que tenemos una tabla llamada Persona, que debemos modificar la edad a 10 años de todas las personas de Nombre “Juan”. Seria de la siguiente manera:


using(MiEntity db= new MiEntity()){

  //realizamos la modificación sin foreach, ni SaveChanges()
  db.Persona.Where(d => d.Nombre=="Juan")
 .Update(x => new Persona() { Edad = 10 });

}

De esta manera no necesitamos el método SaveChanges(), ya que Update lo hace internamente.

¿Cómo convertir archivo PDF a Docx en C# .Net? – Spire.Pdf vs SautinSoft.PdfFocus

Te muestro como convertir un archivo PDF a un archivo Docx con dos librerías que tienen precio pero hacen su trabajo.

Código del ejemplo:


  class Program
    {
        //ORIGEN PDF
        static string pathPDF = @"C:\AlgunaRuta\archivo.pdf";

        //DESTINOS ARCHIVO DOCX
        static string pathDoc1 = @"C:\AlgunaRuta\archivo-spire.docx";
        static string pathDoc2 = @"C:\AlgunaRuta\archivo-sautin.docx";

        static void Main(string[] args)
        {
            //llamamos para convertir el pdf con spire
            UsandoSpirePdf();

            //llamamos para convertir el pdf con sautinsoft
            UsandoSautin();

        }

        public static void UsandoSpirePdf()
        {

            PdfDocument pdf = new PdfDocument();
            //cargamos el pdf
            pdf.LoadFromFile(pathPDF);

            //guardamos el docx
            pdf.SaveToFile(pathDoc1, FileFormat.DOCX);

            //abrimos el archivo
            System.Diagnostics.Process.Start(pathDoc1);

        }

        public static void UsandoSautin()
        {

            SautinSoft.PdfFocus oPdfFocus = new SautinSoft.PdfFocus();

            //cargamos el pdf
            oPdfFocus.OpenPdf(pathPDF);

            //si se tiene mas de 1 pagina
            if (oPdfFocus.PageCount > 0)
            {
                //asignamos el tipo de documento al que convertiremos
                oPdfFocus.WordOptions.Format = SautinSoft.PdfFocus.CWordOptions.eWordDocument.Docx;

                //guardamos el dox
                int resultado = oPdfFocus.ToWord(pathDoc2);

                if (resultado == 0)
                {
                    //abrimos el documento
                    System.Diagnostics.Process.Start(pathDoc2);
                }
            }
        }
    }

Spire.Pdf: https://www.e-iceblue.com/Introduce/pdf-for-net-introduce.html

SautinSoft.PdfFocus: http://www.sautinsoft.com/products/pdf-focus/

¿Cómo convertir una cadena XML a Objeto en c#? deserializar

Existen varias formas de llenar un objeto por medio de valores incrustados en XML(deserialización) y esta que planteo a continuación es la forma más comprensible de hacerlo.
Teniendo el siguiente texto de xml:


<padre>
  <hijo>
    <id>18</id>
    <valor>CFE7785</valor>
    <entero>1</entero>
  </hijo>
<padre>

Primero tenemos que hacer un conjunto de clases las cuales nos ayudaran a guardar los valores:

    [XmlRoot("padre")]
    public class padre
    {
        [XmlElement("hijo")]
        public List lstHijos{ get; set; }
    }

    public class hijo
    {
        [XmlElement("id")]
        public int id { get; set; }
        [XmlElement("valor")]
        public string valor { get; set; }

        [XmlElement("entero")]
        public int entero { get; set; }

    }

Y ahora el proceso para la magia:


string xml= "<padre> <hijo> <id>18</id> <valor>CFE7785</valor> <entero>1</entero> </hijo> <padre>"

XmlSerializer serializer = new XmlSerializer(typeof(padre));
using (TextReader reader = new StringReader(xml))
{
        //de esta manera se deserializa
        padre result = (padre)serializer.Deserialize(reader);
}

¿Cómo convertir una imagen de formato RGB a CMYK en c# .Net?

Hace poco termine unos proyectos en los cuales debía manejar la manipulación de imágenes enormes, y me encontré con mucha problemática y poca información, pero gracias a muchas desveladas conseguí el objetivo.
Uno de mis quebraderos de cabeza fue el transformar una imagen de formato RGB a formato CMYK, y hacer de una manera que sea gratuita (ya que encontré algunas empresas que vendían dlls a precios descabellados).

Si van a manipular imágenes enormes, ahórrense martirios y horas de trabajo demás, NO UTILICEN System.Drawing, la misma documentación de Microsoft no recomienda que lo utilices para proyectos con manipulación de imágenes grandes.

Ahora que ya resolví este problema publico este post que a más de uno le servirá, primero vamos a tener que instalar un dll que es gratuito (prácticamente es un wrapper hecho en c++), este magnífico dll se llama Magick.Net. Solo destacare que hay varios dlls con este nombre, lo que los diferencia es que tienen un numero al final, entre sea más elevado el número, se puede trabajar con imágenes mayores, descarguen según les convenga (si utilizaran imágenes enormes les recomiendo que bajen Q16 de 64 bits).
Si no sabes cómo instalar un dll por medio de nuget da clic aquí y te explico con un video como hacerlo.
Una vez que instalamos Magick.Net (otro problema que me encontré es la falta de ejemplos para .Net) vamos a crear la imagen CMYK. Para ellos lo haremos de la siguiente manera:


using(MagickImage image = new MagickImage("miimagenRGB.jpg")){
                        //lineas magicas que convierten a CMYK
                        image.AddProfile(ColorProfile.SRGB);
                        image.AddProfile(ColorProfile.USWebCoatedSWOP);

                        //y si guardamos nuestra imagen cmyk
                        image.Write("imagenCMYK.jpg");
}

Así de fácil se resuelve un problema en el cual estuve investigando casi por un mes (sorpresas de la vida del programador).
Más adelante iré agregando más artículos sobre esta potente librería.