Utilidades en Business Central: Conversión de Imágenes y Documentos a Base64 (Parte 4)

En esta cuarta entrega de la serie de utilidades para Business Central, exploro cómo convertir imágenes y documentos a Base64, desde imágenes hasta informes configurados.

Continuando con mi serie de utilidades para Microsoft Dynamics 365 Business Central, en esta cuarta entrega abordaré la conversión de datos a formato Base64. Esta funcionalidad resulta útil para transmitir datos binarios a través de canales que solo soportan texto, especialmente en integraciones con aplicaciones externas. En este artículo, explicaré cómo convertir imágenes y documentos en Base64 utilizando procedimientos específicos en Business Central.

¡Vamos manos a la obra! 😀

💡 Convertir Texto Base64 a una Imagen Temporal

procedure ConvertImageTextBase64ToTempBlob(ImageTextBase64: Text) TempBlob: Codeunit "Temp Blob"
var
    Base64Convert: Codeunit "Base64 Convert";
    OutStream: OutStream;
begin
    if ImageTextBase64 = '' then
        exit;

    Clear(TempBlob);
    Clear(Base64Convert);
    Clear(OutStream);

    TempBlob.CreateOutStream(OutStream);
    Base64Convert.FromBase64(ImageTextBase64, OutStream);
end;

El primer procedimiento, ConvertImageTextBase64ToTempBlob, permite tomar un texto en formato Base64 y convertirlo en un blob temporal, un tipo de almacenamiento que permite almacenar datos binarios en Business Central. El procedimiento recibe un parámetro, ImageTextBase64, que es el texto en formato Base64 de la imagen. Lo primero que hace el procedimiento es verificar si el texto está vacío; si es así, sale de inmediato, evitando operaciones innecesarias. Luego, utiliza el objeto TempBlob para limpiar y preparar el almacenamiento temporal. Se crea un flujo de salida (OutStream) en el blob temporal, y a continuación, con Base64Convert.FromBase64, se decodifica el texto en Base64 y se almacena directamente en el flujo de salida. Este enfoque permite trabajar con imágenes codificadas en Base64 de manera eficiente, haciendo que sea sencillo integrarlas en sistemas que esperan estos datos en formato binario.

📜 Convertir un Conjunto de Medios a Base64

procedure ConvertMediaSetToBase64(MediaId: Text) ReturnValue: Text
var
    TenantMedia: Record "Tenant Media";
    Base64Convert: Codeunit "Base64 Convert";
    InStream: InStream;
begin
    ReturnValue := '';
    Clear(InStream);
    TenantMedia.Reset();

    if TenantMedia.Get(MediaId) then begin
        TenantMedia.CalcFields(Content);
        TenantMedia.Content.CreateInStream(InStream);
        ReturnValue := Base64Convert.ToBase64(InStream);
    end;
end;

El procedimiento ConvertMediaSetToBase64 convierte un archivo multimedia existente en Business Central en una cadena de texto en formato Base64. Recibe un MediaId, que es el identificador del archivo almacenado en el registro Tenant Media. Primero, el procedimiento limpia cualquier flujo de entrada previo y restablece el registro Tenant Media. Si se encuentra el archivo con el MediaId especificado, el procedimiento calcula el campo Content, que contiene el archivo en sí, y crea un flujo de entrada (InStream) del contenido del archivo. Usando Base64Convert.ToBase64, convierte el flujo de entrada en una cadena Base64 que es retornada como resultado. Esto es especialmente útil para aplicaciones en las que necesito enviar imágenes o documentos almacenados en Business Central a otras aplicaciones o sistemas que esperan recibir el contenido en un formato Base64 legible.

📝 Convertir Documentos a Base64

procedure ConvertDocumentToBase64(RecVariant: Variant; ReportSelectionUsage: Enum "Report Selection Usage") ReturnValue: Text;
var
    ReportSelections: Record "Report Selections";
    TempBlob: Codeunit "Temp Blob";
    Base64Convert: Codeunit "Base64 Convert";
    RecordRef: RecordRef;
    InStream: InStream;
    OutStream: OutStream;
begin
    Clear(Base64Convert);
    Clear(InStream);
    Clear(OutStream);
    Clear(TempBlob);
    Clear(RecordRef);

    RecordRef.GetTable(RecVariant);

    ReportSelections.Reset();
    ReportSelections.SetRange(Usage, ReportSelectionUsage);
    ReportSelections.FindFirst();

    ReportSelections.TestField("Report ID");

    TempBlob.CreateOutStream(OutStream, TextEncoding::UTF8);
    REPORT.SaveAs(ReportSelections."Report ID", '', SearchReportFormat(ReportSelections."Report ID"), OutStream, RecordRef);
    TempBlob.CreateInStream(InStream, TextEncoding::UTF8);

    ReturnValue := Base64Convert.ToBase64(InStream);
end;

Este procedimiento, ConvertDocumentToBase64, se encarga de convertir un informe en Business Central a Base64. Para hacerlo, recibe dos parámetros: RecVariant, que representa la tabla de registros del documento, y ReportSelectionUsage, que indica el tipo de informe seleccionado. En primer lugar, el procedimiento limpia todas las variables y luego obtiene el registro del informe usando RecordRef.GetTable. A continuación, se reinicia la selección de informes (ReportSelections), que se filtra según el tipo de uso (ReportSelectionUsage) y se identifica el primer informe configurado con FindFirst. Si se encuentra el informe, se utiliza la función REPORT.SaveAs para guardarlo en un blob temporal (TempBlob) en el formato adecuado, que se obtiene de la función SearchReportFormat. Finalmente, el procedimiento convierte el flujo de entrada (InStream) del blob temporal a Base64 y devuelve este texto. Este proceso es muy útil cuando se necesita enviar informes desde Business Central a sistemas externos en un formato legible y estandarizado como Base64.

🔍 Buscar el Formato de Informe

procedure SearchReportFormat(ReportID: Integer) ReturnValue: ReportFormat
var
    ReportLayoutList: Record "Report Layout List";
    DefaultReportLayoutList: Record "Report Layout List";
    IsDefaultLayout: Boolean;
    ValueMimeType: Text;
    Pos: Integer;
begin
    ReturnValue := ReturnValue::Pdf;

    ReportLayoutList.Reset();
    ReportLayoutList.SetRange("Report ID", ReportID);
    if ReportLayoutList.FindSet() then
        repeat
            if DefaultReportLayoutList."Report ID" <> ReportLayoutList."Report ID" then
                GetDefaultReportLayoutSelection(ReportLayoutList."Report ID", DefaultReportLayoutList);

            IsDefaultLayout := (DefaultReportLayoutList."Report ID" = ReportLayoutList."Report ID") and (DefaultReportLayoutList.Name = ReportLayoutList.Name) and (DefaultReportLayoutList."Application ID" = ReportLayoutList."Application ID");

            if IsDefaultLayout then begin
                case ReportLayoutList."Layout Format" of
                    ReportLayoutList."Layout Format"::Excel:
                        ReturnValue := ReturnValue::Excel;
                    ReportLayoutList."Layout Format"::RDLC:
                        ReturnValue := ReturnValue::Pdf;
                    ReportLayoutList."Layout Format"::Word:
                        ReturnValue := ReturnValue::Word;
                    else begin
                        ValueMimeType := ReportLayoutList."MIME Type";
                        Pos := StrPos(ValueMimeType, '/');
                        ValueMimeType := CopyStr(ValueMimeType, Pos, StrLen(ValueMimeType));

                        case ValueMimeType of
                            'docx':
                                ReturnValue := ReturnValue::Word;
                            'xlsx':
                                ReturnValue := ReturnValue::Excel;
                        end;
                    end;
                end;
                exit;
            end;
        until ReportLayoutList.Next() = 0;
end;

La función SearchReportFormat encuentra el formato de layout del informe que corresponde a un ReportID específico. El procedimiento busca en Report Layout List y determina si el formato predeterminado es PDF, Excel o Word según los ajustes y preferencias configuradas en el sistema. Al identificar el layout, selecciona el formato de salida correcto, lo que es crucial para guardar el informe en un formato adecuado y compatible con el procedimiento de conversión a Base64.

🔄 Obtener la Selección de Layout Predeterminado

local procedure GetDefaultReportLayoutSelection(ReportId: Integer; var DefaultReportLayoutList: Record "Report Layout List"): Boolean
var
    ReportMetadata: Record "Report Metadata";
    TenantReportLayoutSelection: Record "Tenant Report Layout Selection";
    EmptyGuid: Guid;
begin
    TenantReportLayoutSelection.Init();
    DefaultReportLayoutList.Init();

    if TenantReportLayoutSelection.Get(ReportId, CompanyName(), EmptyGuid) then begin
        DefaultReportLayoutList.SetRange("Name", TenantReportLayoutSelection."Layout Name");
        DefaultReportLayoutList.SetRange("Application ID", TenantReportLayoutSelection."App ID");
        DefaultReportLayoutList.SetRange("Report ID", ReportId);

        if DefaultReportLayoutList.FindFirst() then
            exit(true);
    end else
        if ReportMetadata.Get(ReportId) then begin
            DefaultReportLayoutList.SetRange("Name", ReportMetadata."DefaultLayoutName");
            DefaultReportLayoutList.SetFilter("Application ID", '<>%1', EmptyGuid);
            DefaultReportLayoutList.SetRange("Report ID", ReportId);

            if DefaultReportLayoutList.FindFirst() then
                exit(true);
        end;

    exit(false);
end;

La función GetDefaultReportLayoutSelection localiza el layout predeterminado para

el informe especificado por ReportId. Esta función busca en Tenant Report Layout Selection y Report Metadata para identificar el layout configurado por defecto. Luego, filtra en DefaultReportLayoutList el layout correspondiente. Esto asegura que el informe se guarde en el layout correcto, cumpliendo con las configuraciones definidas por el usuario en Business Central y facilitando una conversión eficiente y precisa del informe en formatos externos.

Beneficios y Aplicaciones Prácticas

Este conjunto de procedimientos es ideal para cualquier empresa que necesite intercambiar documentos e imágenes en un formato estandarizado y legible, como Base64. Al convertir imágenes y documentos, se simplifica su transmisión y almacenamiento en plataformas externas, mejorando la interoperabilidad del sistema. Este proceso es particularmente útil para integraciones de documentos y medios con sistemas externos que requieren datos en formato Base64.

Conclusión

En esta cuarta entrega de mi serie de utilidades para Business Central, la conversión de imágenes y documentos a Base64 se revela como una habilidad clave para desarrolladores que trabajan con integraciones de datos. Estos procedimientos ofrecen una solución clara y eficiente para procesar archivos en este formato, facilitando la comunicación entre sistemas.

Para seguir todos los posts de esta serie, puedes encontrarlos bajo la etiqueta #UtilsBc.

¡Gracias por seguir esta serie y feliz codificación! 😊

Share your love

Leave a Reply

Your email address will not be published. Required fields are marked *