Entradas

Mostrando las entradas de octubre, 2025

Reducir el tamaño de un archivo PDF con GhostScript

Mientras buscaba un documento en PDF, me encontré con éste script, que reduce el tamaño de un archivo PDF, entre el 35% y 95% de su tamaño original.  En resumidas cuentas, convierte las imágenes a escala de grises con la calidad más baja posible y el texto le quita el formato.  

Recuerdo que se usó para enviar 150 MB de evidencias a una cuenta de correo del auditor que sólo aceptaba archivos adjuntos con un total de 15 MB.

gswin64c ^
 -q -dNOPAUSE -dBATCH -dSAFER ^
 -sDEVICE=pdfwrite ^
 -dCompatibilityLevel=1.4 ^
 -dPDFSETTINGS=/screen ^
 -dBlackText=true ^
 -dUseFastColor ^
 -dEmbedAllFonts=true -dSubsetFonts=true ^
 -sProcessColorModel=DeviceGray ^
 -sColorConversionStrategy=Gray ^
 -dOverrideICC ^
 -dGrayImageDownsampleType=/Bicubic ^
 -dDownsampleGrayImages=true ^
 -dGrayImageDownsampleThreshold=1.0 ^
 -dGrayImageResolution=8 ^
 -sOutputFile="compress/%~n1.pdf" ^
"%~1"

Enlaces simbólicos en Windows Server

El problema

Tengo 2 sistemas que usan los mismos archivos y pues hacer una copia de un sistema a otro es engorroso, y según recuerdo, en linux existe algo que permite tratar dos rutas como si fueran la misma: enlaces simbólicos.

Crear un enlace simbólico

mklink /D ruta_enlace ruta_origen
Y por si acaso, ésta es la versión de linux:
ln -s ruta_enlace ruta_origen

Más información

Comandos varios de SQL Server

Ver el tipo de modelo de recuperación

SELECT name, recovery_model_desc
FROM sys.databases
WHERE name = 'YourDatabaseName';

Establecer el modo de recuperación a FULL

ALTER DATABASE AdventureWorks SET RECOVERY FULL

Consultas en bruto con Entity Framework

El problema

Hacer una consulta a la base de datos antes de que se inicie nuestra aplicación de Blazor, (aunque también se puede aplicar fácilmente a una versión de consola). Necesito hacer una consulta a la base de datos para obtener un string, es un cambio trivial que de otra forma hubiera requerido un mapeado y un problema con QA. Lo pongo aquí porque estoy seguro que no será la única vez que lo vaya a necesitar.

Creamos el escalar

public class ScalarString { 
    public string Value { get; set; } = default!; 
}

Creamos la clase que maneja la conexión a BD

public class DBDirectAccess : DbContext
{
    protected readonly string _connectionString = string.Empty;

    public DBDirectAccess(string connectionString)
    {
        _connectionString = connectionString;
    }
    
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(_connectionString);
    }
}

Y Finalmente hacemos la consulta

Cabe mencionar que la consulta debe de regresar un Value para llenar la clase escalar.
using (DBDirectAccess db = new DBDirectAccess(builder.Configuration.GetConnectionString("SQLServer_Connection")!))
{
    ScalarString? url = await db.Database.SqlQueryRaw<ScalarString>($"SELECT Url as Value FROM TB_URLS WHERE HUMAN_ID = 'HOST'").SingleOrDefaultAsync();
}