using Exferia_Aplicacion.General;
using Exferia_EntityFramework;
using Exferia_Formularios;
using Exferia_General;
using Exferia_GestionDocumental._0_Modelos;
using Exferia_GestionDocumental._1_Datos;
using Exferia_GestionDocumental._3_Vistas.ControlesPersonalizados;
using Exferia_GestionDocumental.General;
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.parser;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using System.Text;
using Exferia_Aplicacion.Modelos_Eventos;

namespace Exferia_GestionDocumental._3_Vistas.Controladoras
{
    public class P_AlmacenarDocumentos_Controladora
    {
        #region Variables Generales
        private P_AlmacenarDocumentos g_frm_P_AlmacenarDocumentos;//Variable que enlaza con la pantalla asociada
        private PE_Esperando g_frm_PE_Esperando;//Pantalla de Espera, para cuando se ejecutan tareas pesadas como cargar, guardar, etc

        //Clases necesarias
        private GTD_PlantillasDocumentosCabecera_Datos g_obj_GTD_PlantillasDocumentosCabecera_Datos = new GTD_PlantillasDocumentosCabecera_Datos();
        private GTD_DocumentosTipos_Datos g_obj_GTD_DocumentosTipos_Datos = new GTD_DocumentosTipos_Datos();
        private GTD_Documentos_Datos g_obj_GTD_Documentos_Datos = new GTD_Documentos_Datos();
        private GTD_Documentos_Archivos_Datos g_obj_GTD_Documentos_Archivos_Datos = new GTD_Documentos_Archivos_Datos();
        private GTD_Documentos_EnTexto_Datos g_obj_GTD_Documentos_EnTexto_Datos = new GTD_Documentos_EnTexto_Datos();
        private GTD_Documentos_BusquedaEtiquetasAuxiliar_Datos g_obj_GTD_Documentos_BusquedaEtiquetasAuxiliar_Datos = new GTD_Documentos_BusquedaEtiquetasAuxiliar_Datos();
        private GTD_Documentos_BusquedaEtiquetas_Datos g_obj_GTD_Documentos_BusquedaEtiquetas_Datos = new GTD_Documentos_BusquedaEtiquetas_Datos();
        private GTD_Documentos_Palabras_Datos g_obj_GTD_Documentos_Palabras_Datos = new GTD_Documentos_Palabras_Datos();
        private GTD_Rutas_Datos g_obj_GTD_Rutas_Datos = new GTD_Rutas_Datos();
        private ConexionExterna_Datos g_obj_ConexionExterna_Datos = new ConexionExterna_Datos();
        Encriptador g_obj_Encriptador = new Encriptador();

        private string g_str_BotonSepararQuitarSeparacion_Separar = "Separar";
        private string g_str_BotonSepararQuitarSeparacion_QuitarSeparacion = "Quitar separación";

        #region Tareas Asincronas
        //Tareea Asincrona de rellenar listado
        private BackgroundWorker g_obj_TareaAsincrona_RellenarListado;

        //Tareea Asincrona de cargar los datos del registro seleccionado
        private BackgroundWorker g_obj_TareaAsincrona_CargarDatos_RegistroSeleccionado;

        //Tareea Asincrona de separar documento
        private BackgroundWorker g_obj_TareaAsincrona_SepararDocumento;

        //Tareea Asincrona de Quitar separacion de documento
        private BackgroundWorker g_obj_TareaAsincrona_QuitarSeparacionDocumento;

        //Tareea Asincrona de rellenar Listado Etiquetas Inicial
        private BackgroundWorker g_obj_TareaAsincrona_RellenarListado_Etiquetas_Inicial;

        //Tareea Asincrona de rellenar Listado Etiquetas
        private BackgroundWorker g_obj_TareaAsincrona_RellenarListadoEtiquetas;

        //Tareea Asincrona de recargar Listado Etiquetas
        private BackgroundWorker g_obj_TareaAsincrona_RecargarListadoEtiquetas;
        #endregion

        //PDFS
        public List<INTERNO_DatosDocumento_Modelo> g_lst_INTERNO_DatosDocumento_Modelo = null;
        private int g_int_TotalRegistrosInsertados_PDFs = 0;
        private int g_int_TotalRegistros_PDFs = 0;

        private long g_lng_Identificador = 1;
        public long g_lng_Identificador_Seleccionado = -1;

        #region Posiciones de campos en Listado
        public int g_int_PosicionColumna_Identificador = 0;
        public int g_int_PosicionColumna_IdentificadorPadre = 1;
        public int g_int_PosicionColumna_SeparacionTipo = 2;
        public int g_int_PosicionColumna_Boton = 3;
        public int g_int_PosicionColumna_Separar = 4;
        public int g_int_PosicionColumna_Descripcion = 5;
        public int g_int_PosicionColumna_Extension = 6;
        public int g_int_PosicionColumna_Size = 7;
        public int g_int_PosicionColumna_FaltanDatos = 8;
        public int g_int_PosicionColumna_ErrorBD = 9;
        public int g_int_PosicionColumna_Boton_Ver =10;
        #endregion

        //Variables para la creacion de los Etiquetas ################
        private int g_int_Etiquetas_PosicionY = 5;
        private int g_int_NumeroLineas_Etiquetas = 0;
        private List<int> g_lst_ListadoLineas_Etiquetas = new List<int>();
        private Dictionary<long, List<GTD_Documentos_BusquedaEtiquetas>> g_dct_DocumentosEtiquetas = null;


        //Variables para la creacion de las Etiquetas Auxiliares ################
        private int g_int_EtiquetaAuxiliar_PosicionY = 5;
        private int g_int_NumeroLineas_EtiquetaAuxiliar = 0;
        private Dictionary<long, Dictionary<int, string>> g_dct_DocumentosEtiquetasAuxiliar = null;

        #region Extensiones
        public List<string> g_lst_Extensiones_PDF = new List<string>();
        public List<string> g_lst_Extensiones_IMAGEN = new List<string>();
        public List<string> g_lst_Extensiones_WORD = new List<string>();
        public List<string> g_lst_Extensiones_EXCEL = new List<string>();
        #endregion

        #endregion

        #region Constructor
        public P_AlmacenarDocumentos_Controladora(P_AlmacenarDocumentos _frm_P_AlmacenarDocumentos)
        {
            g_frm_P_AlmacenarDocumentos = _frm_P_AlmacenarDocumentos;

            g_dct_DocumentosEtiquetas = new Dictionary<long, List<GTD_Documentos_BusquedaEtiquetas>>();

            #region Rellenar Extensiones
            //PDF
            g_lst_Extensiones_PDF = Funciones_GestionDocumental.Rellenar_Extensiones_PDF();

            //IMAGEN
            g_lst_Extensiones_IMAGEN = Funciones_GestionDocumental.Rellenar_Extensiones_IMAGEN();

            //WORD
            g_lst_Extensiones_WORD = Funciones_GestionDocumental.Rellenar_Extensiones_WORD();

            //EXCEL
            g_lst_Extensiones_EXCEL = Funciones_GestionDocumental.Rellenar_Extensiones_EXCEL();
            #endregion

            PdfReader.unethicalreading = true;
        }
        #endregion

        #region Carga Inicial
        public void CargaInicial()
        {
            try
            {
                //Bloquear el formulario para que no se pueda hacer nada hasta que termine
                g_frm_P_AlmacenarDocumentos.Enabled = false;

                //Mostrar la pantalla de espera
                g_frm_PE_Esperando = new PE_Esperando();

                BackgroundWorker obj_TareaAsincrona_CargaInicial = new BackgroundWorker();
                obj_TareaAsincrona_CargaInicial.DoWork += new DoWorkEventHandler(TareaAsincrona_CargaInicial_DoWork);
                obj_TareaAsincrona_CargaInicial.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_CargaInicial_Completed);
                obj_TareaAsincrona_CargaInicial.WorkerReportsProgress = true;


                //(Tarea Asincrona) Cargar Datos ##################################################################
                obj_TareaAsincrona_CargaInicial.RunWorkerAsync();
                //#################################################################################################

                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                g_frm_P_AlmacenarDocumentos.Enabled = true;

                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }

                throw new Control_Errores("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(CargaInicial), true);
            }
        }
        private void TareaAsincrona_CargaInicial_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                string str_Errores = "";

                List<GTD_Rutas> lst_GTD_Rutas = g_obj_GTD_Rutas_Datos.Obtener_ModeloListado();
                if (lst_GTD_Rutas != null && lst_GTD_Rutas.Count > 0)
                {
                    //ver si tiene algun valor la bandeja de entrada
                    GTD_Rutas mdl_GTD_Rutas_BANDEJAENTRADA = lst_GTD_Rutas.Where(m => m.id.Equals(Exferia_Aplicacion.General.Variables.G_LNG_RUTA_GTD_BANDEJAENTRADA)).FirstOrDefault();
                    if (mdl_GTD_Rutas_BANDEJAENTRADA != null && mdl_GTD_Rutas_BANDEJAENTRADA.rutaFichero != null && mdl_GTD_Rutas_BANDEJAENTRADA.rutaFichero.Trim().Length > 0)
                    {
                        //ver si existe la ruta
                        if (!Directory.Exists(mdl_GTD_Rutas_BANDEJAENTRADA.rutaFichero))
                        {
                            str_Errores += "La ruta para la bandeja de entrada '" + mdl_GTD_Rutas_BANDEJAENTRADA.rutaFichero + "' no existe." + System.Environment.NewLine;
                        }
                        else
                        {
                            g_frm_P_AlmacenarDocumentos.Exferia_TextBox_BandejaEntrada.Text = mdl_GTD_Rutas_BANDEJAENTRADA.rutaFichero;
                            g_frm_P_AlmacenarDocumentos.FolderBrowserDialog_BandejaEntrada.SelectedPath = mdl_GTD_Rutas_BANDEJAENTRADA.rutaFichero;

                        }
                    }

                    //ver si tiene algun valor la bandeja de entrada
                    GTD_Rutas mdl_GTD_Rutas_BANDEJASALIDA = lst_GTD_Rutas.Where(m => m.id.Equals(Exferia_Aplicacion.General.Variables.G_LNG_RUTA_GTD_BANDEJASALIDA)).FirstOrDefault();
                    if (mdl_GTD_Rutas_BANDEJASALIDA != null && mdl_GTD_Rutas_BANDEJASALIDA.rutaFichero != null && mdl_GTD_Rutas_BANDEJASALIDA.rutaFichero.Trim().Length > 0)
                    {
                        //ver si existe la ruta
                        if (!Directory.Exists(mdl_GTD_Rutas_BANDEJASALIDA.rutaFichero))
                        {
                            str_Errores += "La ruta para la bandeja de salida '" + mdl_GTD_Rutas_BANDEJASALIDA.rutaFichero + "' no existe." + System.Environment.NewLine;
                        }
                        else
                        {
                            g_frm_P_AlmacenarDocumentos.Exferia_TextBox_BandejaSalida.Text = mdl_GTD_Rutas_BANDEJASALIDA.rutaFichero;
                            g_frm_P_AlmacenarDocumentos.FolderBrowserDialog_BandejaSalida.SelectedPath = mdl_GTD_Rutas_BANDEJASALIDA.rutaFichero;
                        }
                    }
                }

                if (str_Errores.Trim().Length > 0)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = str_Errores;
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                }

            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(TareaAsincrona_CargaInicial_DoWork));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(TareaAsincrona_CargaInicial_DoWork));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_INTERNO_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_CargaInicial_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            //Desbloquear el Formulario
            g_frm_P_AlmacenarDocumentos.Enabled = true;

            try
            {
                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_Resultado = (INTERNO_ValorDevuelto_Modelo)e.Result;

                //Mostrar si tuviera algun mensaje
                if (mdl_ValorDevuelto_Modelo_Resultado.TodoCorrecto == false)
                {
                    Mensajes.MostrarMensaje_Y_EsperarRespuesta(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);
                }

                //Buscar los documentos de la ruta de entrada
                if (g_frm_P_AlmacenarDocumentos.Exferia_TextBox_BandejaEntrada.Text.ToString().Trim().Length > 0)
                {
                    Rellenar_Listado(g_frm_P_AlmacenarDocumentos.Exferia_TextBox_BandejaEntrada.Text, true);
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(TareaAsincrona_CargaInicial_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

                g_frm_P_AlmacenarDocumentos.Salir_P_Base();
            }
        }
        #endregion

        #region Rellenar Listado 
        public void Rellenar_Listado(string _str_Ruta_BandejaEntrada, bool _bol_RecargardesdeRuta)
        {
            try
            {
                //Bloquear el formulario para que no se pueda hacer nada hasta que termine
                g_frm_P_AlmacenarDocumentos.Enabled = false;


                //Mostrar lka pantalla de espera
                g_frm_PE_Esperando = new PE_Esperando();

                //Si la tarea asincrona esta en marcha la paro
                if (g_obj_TareaAsincrona_RellenarListado != null)
                {
                    while (g_obj_TareaAsincrona_RellenarListado.IsBusy)
                        System.Windows.Forms.Application.DoEvents();
                }
                else
                {
                    g_obj_TareaAsincrona_RellenarListado = new BackgroundWorker();
                    g_obj_TareaAsincrona_RellenarListado.DoWork += new DoWorkEventHandler(TareaAsincrona_RellenarListado_DoWork);
                    g_obj_TareaAsincrona_RellenarListado.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_RellenarListado_ProgressChanged);
                    g_obj_TareaAsincrona_RellenarListado.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_RellenarListado_Completed);
                    g_obj_TareaAsincrona_RellenarListado.WorkerReportsProgress = true;
                }

                //Vaciar DataGridView
                g_frm_P_AlmacenarDocumentos.Exferia_DataGridView_Documentos.Rows.Clear();

                if (_bol_RecargardesdeRuta)
                {
                    g_lst_INTERNO_DatosDocumento_Modelo = new List<INTERNO_DatosDocumento_Modelo>();
                    g_dct_DocumentosEtiquetas.Clear();

                    Vaciar_Todo();
                }
                g_int_TotalRegistrosInsertados_PDFs = 0;
                g_int_TotalRegistros_PDFs = 0;
                g_frm_P_AlmacenarDocumentos.Exferia_BarraProgreso_Documentos.Exferia_BarraProgreso_Total = g_int_TotalRegistros_PDFs;
                g_frm_P_AlmacenarDocumentos.Exferia_BarraProgreso_Documentos.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_PDFs;

                //(Tarea Asincrona) Cargar Datos ##################################################################
                List<object> lst_Argumentos = new List<object>();
                lst_Argumentos.Add(_str_Ruta_BandejaEntrada);
                lst_Argumentos.Add(_bol_RecargardesdeRuta);

                g_obj_TareaAsincrona_RellenarListado.RunWorkerAsync(lst_Argumentos);
                //#################################################################################################

                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                g_frm_P_AlmacenarDocumentos.Enabled = true;

                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }

                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(Rellenar_Listado));
            }
        }

        private void TareaAsincrona_RellenarListado_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                //Argumentos
                List<object> lst_Argumentos = (List<object>)e.Argument;
                string str_RutaBandejaEntrada = (string)lst_Argumentos[0];
                bool bol_RecargarDesdeCarpeta = (bool)lst_Argumentos[1];

                //Si existe calculo sino no
                if (bol_RecargarDesdeCarpeta)
                {
                    if (Directory.Exists(str_RutaBandejaEntrada))
                    {
                        //Primero obtengo la carpeta seleccionada
                        DirectoryInfo obj_DirectoryInfo = new DirectoryInfo(str_RutaBandejaEntrada);

                        //Recorro la carpeta para ver que archivos se encuentran en ella
                        if (obj_DirectoryInfo.GetFiles() != null && obj_DirectoryInfo.GetFiles().Count() > 0)
                        {
                            g_lng_Identificador = 1;
                            long lng_Orden = 1000;
                            byte[] arr_Documento_Original = null;
                            string str_Nombre_SinExtension = "";
                            foreach (FileInfo obj_FileInfo in obj_DirectoryInfo.GetFiles().ToList())
                            {
                                // PDF ################################################################################################################# 
                                if (g_lst_Extensiones_PDF.Contains(obj_FileInfo.Extension.ToLower()))
                                {
                                    arr_Documento_Original = File.ReadAllBytes(obj_FileInfo.FullName);

                                    //Añadir al listado
                                    str_Nombre_SinExtension = obj_FileInfo.Name.Substring(0, obj_FileInfo.Name.LastIndexOf("."));
                                    g_lst_INTERNO_DatosDocumento_Modelo.Add(new INTERNO_DatosDocumento_Modelo(g_lng_Identificador,
                                                                                                                str_Nombre_SinExtension,
                                                                                                                str_Nombre_SinExtension,
                                                                                                                str_Nombre_SinExtension,
                                                                                                                obj_FileInfo.Extension.ToLower(),
                                                                                                                arr_Documento_Original,
                                                                                                                null,
                                                                                                                lng_Orden,
                                                                                                                obj_FileInfo.Length,
                                                                                                                false));

                                    //Aumentar el Identificador
                                    g_lng_Identificador += 1;

                                    //Aurmentar orden
                                    lng_Orden += 1000;
                                }
                                // IMAGEN #############################################################################################################
                                else if (g_lst_Extensiones_IMAGEN.Contains(obj_FileInfo.Extension.ToLower()))
                                {
                                    //Convertir Docmento en byte[]
                                    arr_Documento_Original = File.ReadAllBytes(obj_FileInfo.FullName);

                                    //Añadir al listado
                                    str_Nombre_SinExtension = obj_FileInfo.Name.Substring(0, obj_FileInfo.Name.LastIndexOf("."));

                                    g_lst_INTERNO_DatosDocumento_Modelo.Add(new INTERNO_DatosDocumento_Modelo(g_lng_Identificador,
                                                                                                                str_Nombre_SinExtension,
                                                                                                                str_Nombre_SinExtension,
                                                                                                                str_Nombre_SinExtension,
                                                                                                                obj_FileInfo.Extension.ToLower(),
                                                                                                                arr_Documento_Original,
                                                                                                                null,
                                                                                                                lng_Orden,
                                                                                                                obj_FileInfo.Length,
                                                                                                                true));

                                    //Aumentar el Identificador
                                    g_lng_Identificador += 1;

                                    //Aurmentar orden
                                    lng_Orden += 1000;
                                }
                                // WORD #############################################################################################################
                                else if (g_lst_Extensiones_WORD.Contains(obj_FileInfo.Extension.ToLower()))
                                {
                                    //Convertir Docmento en byte[]
                                    arr_Documento_Original = File.ReadAllBytes(obj_FileInfo.FullName);

                                    //Añadir al listado
                                    str_Nombre_SinExtension = obj_FileInfo.Name.Substring(0, obj_FileInfo.Name.LastIndexOf("."));


                                    g_lst_INTERNO_DatosDocumento_Modelo.Add(new INTERNO_DatosDocumento_Modelo(g_lng_Identificador,
                                                                                                                str_Nombre_SinExtension,
                                                                                                                str_Nombre_SinExtension,
                                                                                                                str_Nombre_SinExtension,
                                                                                                                obj_FileInfo.Extension.ToLower(),
                                                                                                                arr_Documento_Original,
                                                                                                                null,
                                                                                                                lng_Orden,
                                                                                                                obj_FileInfo.Length,
                                                                                                                false));

                                    //Aumentar el Identificador
                                    g_lng_Identificador += 1;

                                    //Aurmentar orden
                                    lng_Orden += 1000;
                                }
                                // EXCEL #############################################################################################################
                                else if (g_lst_Extensiones_EXCEL.Contains(obj_FileInfo.Extension.ToLower()))
                                {
                                    //Convertir Docmento en byte[]
                                    arr_Documento_Original = File.ReadAllBytes(obj_FileInfo.FullName);

                                    //Añadir al listado
                                    str_Nombre_SinExtension = obj_FileInfo.Name.Substring(0, obj_FileInfo.Name.LastIndexOf("."));



                                    g_lst_INTERNO_DatosDocumento_Modelo.Add(new INTERNO_DatosDocumento_Modelo(g_lng_Identificador,
                                                                                                                str_Nombre_SinExtension,
                                                                                                                str_Nombre_SinExtension,
                                                                                                                str_Nombre_SinExtension,
                                                                                                                obj_FileInfo.Extension.ToLower(),
                                                                                                                arr_Documento_Original,
                                                                                                                null,
                                                                                                                lng_Orden,
                                                                                                                obj_FileInfo.Length,
                                                                                                                false));

                                    //Aumentar el Identificador
                                    g_lng_Identificador += 1;

                                    //Aurmentar orden
                                    lng_Orden += 1000;
                                }
                            }
                        }
                    }
                }

                #region Rellenar el listado con los pdfs obtenidos
                if (g_lst_INTERNO_DatosDocumento_Modelo != null && g_lst_INTERNO_DatosDocumento_Modelo.Count > 0)
                {
                    //Total
                    g_int_TotalRegistros_PDFs = g_lst_INTERNO_DatosDocumento_Modelo.Count;
                    foreach (INTERNO_DatosDocumento_Modelo mdl_INTERNO_DatosDocumento_Modelo in g_lst_INTERNO_DatosDocumento_Modelo.OrderBy(m => m.Orden))
                    {
                        //Se Cancelo la tarea asincrona #########################
                        if (((BackgroundWorker)sender).CancellationPending)
                        {
                            e.Cancel = true;
                            return;
                        }

                        //Progreso
                        g_int_TotalRegistrosInsertados_PDFs += 1;

                        //Añadir al DataGridView
                        ((BackgroundWorker)sender).ReportProgress(2, Transformar_Modelo_A_Row_LineaPDF(mdl_INTERNO_DatosDocumento_Modelo, null));

                        //Esperar un poco
                        Thread.Sleep(1);
                    }
                }
                #endregion
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(TareaAsincrona_RellenarListado_DoWork));
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(TareaAsincrona_RellenarListado_DoWork));
            }

        }
        private void TareaAsincrona_RellenarListado_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                //Añadir Linea 
                g_frm_P_AlmacenarDocumentos.Exferia_DataGridView_Documentos.Rows.Add((DataGridViewRow)e.UserState);

                //Barra de Progreso
                g_frm_P_AlmacenarDocumentos.Exferia_BarraProgreso_Documentos.Exferia_BarraProgreso_Total = g_int_TotalRegistros_PDFs;
                g_frm_P_AlmacenarDocumentos.Exferia_BarraProgreso_Documentos.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_PDFs;

            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_RellenarListado_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando.Dispose();
                g_frm_PE_Esperando = null;
            }

            //Desbloquear el Formulario
            g_frm_P_AlmacenarDocumentos.Enabled = true;

            g_frm_P_AlmacenarDocumentos.P_Base_SeModificoDatosPantalla = false;

        }

        public DataGridViewRow Transformar_Modelo_A_Row_LineaPDF(INTERNO_DatosDocumento_Modelo _mdl_INTERNO_DatosDocumento_Modelo, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {
                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_AlmacenarDocumentos.Exferia_DataGridView_Documentos.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_AlmacenarDocumentos.Exferia_DataGridView_Documentos);
            }

            //Identificador
            obj_DataGridViewRow.Cells[g_int_PosicionColumna_Identificador].Value = _mdl_INTERNO_DatosDocumento_Modelo.Indentificador;

            //Indentificador_Padre
            obj_DataGridViewRow.Cells[g_int_PosicionColumna_IdentificadorPadre].Value = _mdl_INTERNO_DatosDocumento_Modelo.Indentificador_Padre;

            //SeparacionTipo
            obj_DataGridViewRow.Cells[g_int_PosicionColumna_SeparacionTipo].Value = _mdl_INTERNO_DatosDocumento_Modelo.Separado;

            //Expandir o contraer
            obj_DataGridViewRow.Cells[g_int_PosicionColumna_Boton].Value = "/";
            obj_DataGridViewRow.Cells[g_int_PosicionColumna_Boton].ToolTipText = "Contraer";

            //Separar
            if (_mdl_INTERNO_DatosDocumento_Modelo.Separado == 1)
            {
                obj_DataGridViewRow.Cells[g_int_PosicionColumna_Separar].Value = "X";
            }
            else
            {
                obj_DataGridViewRow.Cells[g_int_PosicionColumna_Separar].Value = "";
            }

            //Descripcion
            obj_DataGridViewRow.Cells[g_int_PosicionColumna_Descripcion].Value = _mdl_INTERNO_DatosDocumento_Modelo.Nombre_SinExtension;

            //Extension
            obj_DataGridViewRow.Cells[g_int_PosicionColumna_Extension].Value = _mdl_INTERNO_DatosDocumento_Modelo.Extension.ToLower();

            //Size
            string str_Size = "0 KB";
            if (_mdl_INTERNO_DatosDocumento_Modelo.Size > 0)
            {
                str_Size = Math.Round((decimal)_mdl_INTERNO_DatosDocumento_Modelo.Size / 1024).ToString() + " KB";
            }
            obj_DataGridViewRow.Cells[g_int_PosicionColumna_Size].Value = str_Size;

            //FaltanDatos
            if (_mdl_INTERNO_DatosDocumento_Modelo.FaltanDatos)
            {
                obj_DataGridViewRow.Cells[g_int_PosicionColumna_FaltanDatos].Value = "X";
            }
            else
            {
                obj_DataGridViewRow.Cells[g_int_PosicionColumna_FaltanDatos].Value = "";
            }

            //Error B.D.
            if (_mdl_INTERNO_DatosDocumento_Modelo.ErrorBD)
            {
                obj_DataGridViewRow.Cells[g_int_PosicionColumna_ErrorBD].Value = "X";
            }
            else
            {
                obj_DataGridViewRow.Cells[g_int_PosicionColumna_ErrorBD].Value = "";
            }

            //Ver
            obj_DataGridViewRow.Cells[g_int_PosicionColumna_Boton_Ver].Value = "M";
            obj_DataGridViewRow.Cells[g_int_PosicionColumna_Boton_Ver].ToolTipText = "Ver";

            return obj_DataGridViewRow;
        }

        private void Listado_Actualizar_FaltanDatos(long _lng_Identificador)
        {
            try
            {
                //Faltan datos
                bool bol_FaltanDatos = false;
                if (g_lst_INTERNO_DatosDocumento_Modelo != null)
                {
                    INTERNO_DatosDocumento_Modelo mdl_INTERNO_DatosDocumento_Modelo = g_lst_INTERNO_DatosDocumento_Modelo.Where(m => m.Indentificador == _lng_Identificador).FirstOrDefault();
                    if (mdl_INTERNO_DatosDocumento_Modelo != null)
                    {
                        if (mdl_INTERNO_DatosDocumento_Modelo.Separado != 1)
                        {
                            //Validar que tiene Nombre
                            if (mdl_INTERNO_DatosDocumento_Modelo.Nombre_SinExtension.Trim().Length == 0)
                            {
                                bol_FaltanDatos = true;
                            }

                            //Validar que tiene un tipo de documento introducido
                            if (bol_FaltanDatos == false && mdl_INTERNO_DatosDocumento_Modelo.TipoDocumento == null)
                            {
                                bol_FaltanDatos = true;
                            }
                        }
                        else
                        {
                            bol_FaltanDatos = false;
                        }

                        //Actualizar el listado general
                        mdl_INTERNO_DatosDocumento_Modelo.FaltanDatos = bol_FaltanDatos;


                        //Actualizar el DatagridView
                        DataGridViewRow dgvr_Actualizar = g_frm_P_AlmacenarDocumentos.Exferia_DataGridView_Documentos.Rows
                                         .Cast<DataGridViewRow>()
                                         .Where(r => r.Cells[g_int_PosicionColumna_Identificador].Value.Equals(_lng_Identificador)).FirstOrDefault();

                        if (dgvr_Actualizar != null)//Modificada
                        {
                            //Actualizar el Grid
                            if (bol_FaltanDatos)
                            {
                                dgvr_Actualizar.Cells[g_int_PosicionColumna_FaltanDatos].Value = "X";
                            }
                            else
                            {
                                dgvr_Actualizar.Cells[g_int_PosicionColumna_FaltanDatos].Value = "";
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(Listado_Actualizar_FaltanDatos));
            }
        }

        #endregion

        #region Vaciar 
        private void Vaciar_Todo()
        {
            try
            {
                g_lng_Identificador = 1;

                Vaciar();

                //Tipos
                g_dct_DocumentosEtiquetas.Clear();

                Vaciar_EtiquetasAuxiliares(true);
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(Vaciar_Todo));
            }
        }

        public void Vaciar()
        {
            try
            {
                g_lng_Identificador_Seleccionado = -1;

                //NombreReal
                g_frm_P_AlmacenarDocumentos.Exferia_Label_SinColor_NombreReal.Text = "";

                //Nombre
                g_frm_P_AlmacenarDocumentos.Exferia_TextBox_Nombre.Text = "";
                g_frm_P_AlmacenarDocumentos.Exferia_TextBox_Nombre.Enabled = true;
                g_frm_P_AlmacenarDocumentos.Exferia_F3_DocumentoTipo.Enabled = true;

                //Plantilla
                g_frm_P_AlmacenarDocumentos.Exferia_F3_PlantillaDocumentoCabecera.Exferia_F3_Id = -1;
                g_frm_P_AlmacenarDocumentos.Exferia_F3_PlantillaDocumentoCabecera.Exferia_F3_Codigo = "";
                g_frm_P_AlmacenarDocumentos.Exferia_F3_PlantillaDocumentoCabecera.Exferia_F3_Descripcion = "";
                g_frm_P_AlmacenarDocumentos.Exferia_F3_PlantillaDocumentoCabecera.Exferia_F3_FechaBorrado = null;
                g_frm_P_AlmacenarDocumentos.Exferia_F3_PlantillaDocumentoCabecera.Enabled = true;
                g_frm_P_AlmacenarDocumentos.Exferia_F3_PlantillaDocumentoCabecera.Exferia_F3_RELACIONADOS = null;
                g_frm_P_AlmacenarDocumentos.Exferia_F3_PlantillaDocumentoCabecera.Enabled = false;

                //Tipo
                g_frm_P_AlmacenarDocumentos.Exferia_F3_DocumentoTipo.Exferia_F3_Id = -1;
                g_frm_P_AlmacenarDocumentos.Exferia_F3_DocumentoTipo.Exferia_F3_Codigo = "";
                g_frm_P_AlmacenarDocumentos.Exferia_F3_DocumentoTipo.Exferia_F3_Descripcion = "";
                g_frm_P_AlmacenarDocumentos.Exferia_F3_DocumentoTipo.Exferia_F3_FechaBorrado = null;
                g_frm_P_AlmacenarDocumentos.Exferia_F3_DocumentoTipo.Enabled = true;

                //Separar
                g_frm_P_AlmacenarDocumentos.Exferia_Button_ConBorde_SepararQuitarSeparacion.Visible = false;
                g_frm_P_AlmacenarDocumentos.Exferia_Button_ConBorde_SepararQuitarSeparacion.Text = g_str_BotonSepararQuitarSeparacion_Separar;
                g_frm_P_AlmacenarDocumentos.Exferia_Button_ConBorde_SepararQuitarSeparacion.Tag = "0";

                //EtiquetasAuxuliares
                g_frm_P_AlmacenarDocumentos.Exferia_Button_EtiquetaAuxiliar.Enabled = false;
                g_frm_P_AlmacenarDocumentos.Exferia_Panel_Degradado_EtiquetasAuxiliares.Enabled = false;

                //Etiquetas
                g_frm_P_AlmacenarDocumentos.Exferia_Panel_Degradado_Etiquetas.Controls.Clear();
                g_frm_P_AlmacenarDocumentos.Exferia_Panel_Degradado_Etiquetas.Enabled = false;
                g_int_Etiquetas_PosicionY = 5;
                g_int_NumeroLineas_Etiquetas = 0;
                g_lst_ListadoLineas_Etiquetas.Clear();

                //Actualizar
                g_frm_P_AlmacenarDocumentos.Exferia_Button_Actualizar.Visible = false;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(Vaciar));
            }
        }
        private void Vaciar_EtiquetasAuxiliares(bool _bol_Todo)
        {
            try
            {
                g_frm_P_AlmacenarDocumentos.Exferia_Panel_Degradado_EtiquetasAuxiliares.Controls.Clear();
                g_int_EtiquetaAuxiliar_PosicionY = 5;

                if (_bol_Todo)
                {
                    g_int_NumeroLineas_EtiquetaAuxiliar = 0;
                    g_dct_DocumentosEtiquetasAuxiliar = new Dictionary<long, Dictionary<int, string>>();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(Vaciar_EtiquetasAuxiliares));
            }
        }
        #endregion

        #region Cargar los datos del Registro Seleccionado
        public void CargarDatos_RegistroSeleccionado(long _lng_Identificador)
        {
            try
            {
                //Bloquear el formulario para que no se pueda hacer nada hasta que termine
                g_frm_P_AlmacenarDocumentos.Enabled = false;

                //Si la tarea asincrona esta en marcha la paro
                if (g_obj_TareaAsincrona_CargarDatos_RegistroSeleccionado != null)
                {
                    while (g_obj_TareaAsincrona_CargarDatos_RegistroSeleccionado.IsBusy)
                        System.Windows.Forms.Application.DoEvents();
                }
                else
                {
                    g_obj_TareaAsincrona_CargarDatos_RegistroSeleccionado = new BackgroundWorker();
                    g_obj_TareaAsincrona_CargarDatos_RegistroSeleccionado.DoWork += new DoWorkEventHandler(TareaAsincrona_CargarDatos_RegistroSeleccionado_DoWork);
                    g_obj_TareaAsincrona_CargarDatos_RegistroSeleccionado.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_CargarDatos_RegistroSeleccionado_ProgressChanged);
                    g_obj_TareaAsincrona_CargarDatos_RegistroSeleccionado.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_CargarDatos_RegistroSeleccionado_Completed);
                    g_obj_TareaAsincrona_CargarDatos_RegistroSeleccionado.WorkerReportsProgress = true;
                }

                //Vaciar 
                Vaciar();
                Vaciar_EtiquetasAuxiliares(false);

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_obj_TareaAsincrona_CargarDatos_RegistroSeleccionado.RunWorkerAsync(_lng_Identificador);
                //#################################################################################################
            }
            catch (Exception ex)
            {
                g_frm_P_AlmacenarDocumentos.Enabled = true;

                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(CargarDatos_RegistroSeleccionado));
            }
        }

        private void TareaAsincrona_CargarDatos_RegistroSeleccionado_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                //Argumentos
                g_lng_Identificador_Seleccionado = (long)e.Argument;

                INTERNO_DatosDocumento_Modelo mdl_INTERNO_DatosDocumento_Modelo = g_lst_INTERNO_DatosDocumento_Modelo.Where(m => m.Indentificador == g_lng_Identificador_Seleccionado).FirstOrDefault();

                if (mdl_INTERNO_DatosDocumento_Modelo != null)
                {
                    #region Cargar Valores

                    //Nombre_Real_SinExtension
                    g_frm_P_AlmacenarDocumentos.Exferia_Label_SinColor_NombreReal.Text = mdl_INTERNO_DatosDocumento_Modelo.Nombre_Real_SinExtension;

                    //Entension
                    g_frm_P_AlmacenarDocumentos.Exferia_Label_SinColor_DocumentoExtension.Text = mdl_INTERNO_DatosDocumento_Modelo.Extension.ToLower();

                    //DocumentoSize
                    string str_Size = "0 KB";
                    if (mdl_INTERNO_DatosDocumento_Modelo.Size > 0)
                    {
                        str_Size = Math.Round((decimal)mdl_INTERNO_DatosDocumento_Modelo.Size / 1024).ToString() + " KB";
                    }
                    g_frm_P_AlmacenarDocumentos.Exferia_Label_SinColor_DocumentoSize.Text = str_Size;

                    // Nombre_SinExtension
                    g_frm_P_AlmacenarDocumentos.Exferia_TextBox_Nombre.Text = mdl_INTERNO_DatosDocumento_Modelo.Nombre_SinExtension;

                    //Convertir PDFA
                    g_frm_P_AlmacenarDocumentos.g_bol_Bloquear_ConversionPDFA = true;
                    g_frm_P_AlmacenarDocumentos.Exferia_CheckBox_ConversionPDF.Checked = mdl_INTERNO_DatosDocumento_Modelo.ConvertirPDFA;
                    g_frm_P_AlmacenarDocumentos.g_bol_Bloquear_ConversionPDFA = false;

                    //TipoDocumento
                    if (mdl_INTERNO_DatosDocumento_Modelo.TipoDocumento != null)
                    {
                        g_frm_P_AlmacenarDocumentos.Exferia_F3_DocumentoTipo.Exferia_F3_Id = mdl_INTERNO_DatosDocumento_Modelo.TipoDocumento.id;
                        g_frm_P_AlmacenarDocumentos.Exferia_F3_DocumentoTipo.Exferia_F3_Codigo = mdl_INTERNO_DatosDocumento_Modelo.TipoDocumento.codigo;
                        g_frm_P_AlmacenarDocumentos.Exferia_F3_DocumentoTipo.Exferia_F3_Descripcion = mdl_INTERNO_DatosDocumento_Modelo.TipoDocumento.descripcion;
                        g_frm_P_AlmacenarDocumentos.Exferia_F3_DocumentoTipo.Exferia_F3_FechaBorrado = mdl_INTERNO_DatosDocumento_Modelo.TipoDocumento.fechaBorrado;

                        //Rellenar los Filtros de la Plantilla
                        List<INTERNO_Filtro_OpcionPadre_Modelo> lst_INTERNO_Filtro_OpcionPadre_Modelo = new List<INTERNO_Filtro_OpcionPadre_Modelo>();
                        lst_INTERNO_Filtro_OpcionPadre_Modelo.Add(new INTERNO_Filtro_OpcionPadre_Modelo(Exferia_Aplicacion.General.Variables.G_STR_OPCION_GTD_DOCUMENTOSTIPOS, mdl_INTERNO_DatosDocumento_Modelo.TipoDocumento.id));
                        g_frm_P_AlmacenarDocumentos.Exferia_F3_PlantillaDocumentoCabecera.Exferia_F3_RELACIONADOS = lst_INTERNO_Filtro_OpcionPadre_Modelo;
                        g_frm_P_AlmacenarDocumentos.Exferia_F3_PlantillaDocumentoCabecera.Enabled = true;
                    }

                    //Plantilla
                    bool bol_Separar = false;
                    bool bol_MostrarOcultar_SepararGrabar = false;
                    bool bol_MostrarOcultar_Actualizar = false;
                    if (mdl_INTERNO_DatosDocumento_Modelo.Plantilla != null)
                    {
                        g_frm_P_AlmacenarDocumentos.Exferia_CheckBox_ConversionPDF.Enabled = false;

                        g_frm_P_AlmacenarDocumentos.Exferia_F3_PlantillaDocumentoCabecera.Exferia_F3_Id = mdl_INTERNO_DatosDocumento_Modelo.Plantilla.id;
                        g_frm_P_AlmacenarDocumentos.Exferia_F3_PlantillaDocumentoCabecera.Exferia_F3_Codigo = mdl_INTERNO_DatosDocumento_Modelo.Plantilla.codigo;
                        g_frm_P_AlmacenarDocumentos.Exferia_F3_PlantillaDocumentoCabecera.Exferia_F3_Descripcion = mdl_INTERNO_DatosDocumento_Modelo.Plantilla.descripcion;
                        g_frm_P_AlmacenarDocumentos.Exferia_F3_PlantillaDocumentoCabecera.Exferia_F3_FechaBorrado = mdl_INTERNO_DatosDocumento_Modelo.Plantilla.fechaBorrado;

                        //Actualiar
                        if (mdl_INTERNO_DatosDocumento_Modelo.Plantilla.GTD_PlantillasDocumentosLineas != null &&
                            mdl_INTERNO_DatosDocumento_Modelo.Plantilla.GTD_PlantillasDocumentosLineas.Count > 0)
                        {
                            bol_MostrarOcultar_Actualizar = true;
                        }

                        //Separar
                        if (mdl_INTERNO_DatosDocumento_Modelo.Plantilla.GTD_PlantillasDocumentosLineas != null &&
                            mdl_INTERNO_DatosDocumento_Modelo.Plantilla.GTD_PlantillasDocumentosLineas.Count > 0 &&
                            mdl_INTERNO_DatosDocumento_Modelo.Plantilla.GTD_PlantillasDocumentosLineas.ToList().Exists(m => m.separador != null && m.separador.Value))
                        {
                            if (mdl_INTERNO_DatosDocumento_Modelo.Separado == 1)
                            {
                                g_frm_P_AlmacenarDocumentos.Exferia_Button_ConBorde_SepararQuitarSeparacion.Text = g_str_BotonSepararQuitarSeparacion_QuitarSeparacion;
                                bol_Separar = true;
                                g_frm_P_AlmacenarDocumentos.Exferia_Button_ConBorde_SepararQuitarSeparacion.Tag = "1";

                                //Ocultar Separar y Grabar
                                bol_MostrarOcultar_SepararGrabar = false;

                            }
                            else if (mdl_INTERNO_DatosDocumento_Modelo.Separado == 2)
                            {
                                g_frm_P_AlmacenarDocumentos.Exferia_Button_ConBorde_SepararQuitarSeparacion.Text = g_str_BotonSepararQuitarSeparacion_Separar;
                                bol_Separar = false;
                                g_frm_P_AlmacenarDocumentos.Exferia_Button_ConBorde_SepararQuitarSeparacion.Tag = "0";

                                //Mostrar Separar y Grabar
                                bol_MostrarOcultar_SepararGrabar = false;
                            }
                            else
                            {
                                g_frm_P_AlmacenarDocumentos.Exferia_Button_ConBorde_SepararQuitarSeparacion.Text = g_str_BotonSepararQuitarSeparacion_Separar;
                                bol_Separar = true;
                                g_frm_P_AlmacenarDocumentos.Exferia_Button_ConBorde_SepararQuitarSeparacion.Tag = "0";

                                //Mostrar Separar y Grabar
                                bol_MostrarOcultar_SepararGrabar = true;
                            }
                        }
                        else
                        {
                            //Separar
                            g_frm_P_AlmacenarDocumentos.Exferia_Button_ConBorde_SepararQuitarSeparacion.Text = g_str_BotonSepararQuitarSeparacion_Separar;
                            bol_Separar = false;
                            g_frm_P_AlmacenarDocumentos.Exferia_Button_ConBorde_SepararQuitarSeparacion.Tag = "0";

                            //Mostrar Separar y Grabar
                            bol_MostrarOcultar_SepararGrabar = false;
                        }
                    }
                    else
                    {
                        g_frm_P_AlmacenarDocumentos.Exferia_CheckBox_ConversionPDF.Enabled = true;

                        //Separar
                        g_frm_P_AlmacenarDocumentos.Exferia_Button_ConBorde_SepararQuitarSeparacion.Text = g_str_BotonSepararQuitarSeparacion_Separar;
                        bol_Separar = false;
                        g_frm_P_AlmacenarDocumentos.Exferia_Button_ConBorde_SepararQuitarSeparacion.Tag = "0";

                        //Mostrar Separar y Grabar
                        bol_MostrarOcultar_SepararGrabar = false;
                    }
                    //Mostrar u ocultar Boton Seperar
                    ((BackgroundWorker)sender).ReportProgress(1, bol_Separar);

                    //Mostrar u ocultar Boton Seperar y grabar
                    ((BackgroundWorker)sender).ReportProgress(3, bol_MostrarOcultar_SepararGrabar);
                    //Mostrar u ocultar BotonActualizar
                    ((BackgroundWorker)sender).ReportProgress(4, bol_MostrarOcultar_Actualizar);

                    #endregion

                    #region Cargar Etiquetas Auxiliares
                    if (mdl_INTERNO_DatosDocumento_Modelo.Separado != 1)
                    {
                        if (g_dct_DocumentosEtiquetasAuxiliar != null &&
                            g_dct_DocumentosEtiquetasAuxiliar.Count > 0 &&
                            g_dct_DocumentosEtiquetasAuxiliar.ContainsKey(g_lng_Identificador_Seleccionado))
                        {
                            Dictionary<int, string> dct_Etiquetas_NumeroLineavalores = g_dct_DocumentosEtiquetasAuxiliar[g_lng_Identificador_Seleccionado];

                            if (dct_Etiquetas_NumeroLineavalores != null && dct_Etiquetas_NumeroLineavalores.Count > 0)
                            {
                                foreach (KeyValuePair<int, string> kvp_NumeroLinea in dct_Etiquetas_NumeroLineavalores)
                                {
                                    //Crear Etiqueta
                                    List<object> lst_Argumentos = new List<object>();
                                    lst_Argumentos.Add(kvp_NumeroLinea.Value);
                                    lst_Argumentos.Add(kvp_NumeroLinea.Key);

                                    ((BackgroundWorker)sender).ReportProgress(0, lst_Argumentos);
                                }
                            }
                        }
                    }

                    #endregion

                    #region Bloqueo y Desbloqueo de controles
                    //TipoSeparacion
                    ((BackgroundWorker)sender).ReportProgress(2, mdl_INTERNO_DatosDocumento_Modelo.Separado);
                    #endregion

                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_RegistroSeleccionado_DoWork));
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_RegistroSeleccionado_DoWork));
            }
            finally
            {
                g_frm_P_AlmacenarDocumentos.g_bol_Bloquear_ConversionPDFA = false;
            }
        }
        private void TareaAsincrona_CargarDatos_RegistroSeleccionado_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                //Crear Etiquetas Auxiliares
                if (e.ProgressPercentage == 0)
                {
                    List<object> lst_Argumentos = (List<object>)e.UserState;
                    Crear_EtiquetasAuxiliares_Linea((string)lst_Argumentos[0], (int)lst_Argumentos[1]);
                }
                //Mostrar/ocultar botone de Seperar
                else if (e.ProgressPercentage == 1)
                {
                    g_frm_P_AlmacenarDocumentos.Exferia_Button_ConBorde_SepararQuitarSeparacion.Visible = (bool)e.UserState;
                }
                //Mostrar/ocultar botone de Seperar y Grabar
                else if (e.ProgressPercentage == 3)
                {
                    g_frm_P_AlmacenarDocumentos.Exferia_Button_ConBorde_SepararGrabar.Visible = (bool)e.UserState;
                }
                //Tipo de Seperacion
                else if (e.ProgressPercentage == 2)
                {
                    //Separado-> Documento principal
                    if ((int)e.UserState == 1)
                    {
                        g_frm_P_AlmacenarDocumentos.Exferia_TextBox_Nombre.Enabled = false;
                        g_frm_P_AlmacenarDocumentos.Exferia_F3_DocumentoTipo.Enabled = false;
                        g_frm_P_AlmacenarDocumentos.Exferia_F3_PlantillaDocumentoCabecera.Enabled = false;

                        //Tipos
                        g_frm_P_AlmacenarDocumentos.Exferia_Panel_Degradado_Etiquetas.Enabled = false;

                        //Etiquetas
                        g_frm_P_AlmacenarDocumentos.Exferia_Button_EtiquetaAuxiliar.Enabled = false;
                        g_frm_P_AlmacenarDocumentos.Exferia_Panel_Degradado_EtiquetasAuxiliares.Enabled = false;

                    }
                    //Separado-> Documentos hijos
                    else if ((int)e.UserState == 2)
                    {
                        g_frm_P_AlmacenarDocumentos.Exferia_TextBox_Nombre.Enabled = true;
                        g_frm_P_AlmacenarDocumentos.Exferia_F3_DocumentoTipo.Enabled = false;
                        g_frm_P_AlmacenarDocumentos.Exferia_F3_PlantillaDocumentoCabecera.Enabled = false;

                        //Tipos
                        g_frm_P_AlmacenarDocumentos.Exferia_Panel_Degradado_Etiquetas.Enabled = true;

                        //Etiquetas
                        g_frm_P_AlmacenarDocumentos.Exferia_Button_EtiquetaAuxiliar.Enabled = true;
                        g_frm_P_AlmacenarDocumentos.Exferia_Panel_Degradado_EtiquetasAuxiliares.Enabled = true;

                    }
                    //No Separado
                    else
                    {
                        g_frm_P_AlmacenarDocumentos.Exferia_TextBox_Nombre.Enabled = true;
                        g_frm_P_AlmacenarDocumentos.Exferia_F3_DocumentoTipo.Enabled = true;

                        //Tipos
                        g_frm_P_AlmacenarDocumentos.Exferia_Panel_Degradado_Etiquetas.Enabled = true;

                        //Etiquetas
                        g_frm_P_AlmacenarDocumentos.Exferia_Button_EtiquetaAuxiliar.Enabled = true;
                        g_frm_P_AlmacenarDocumentos.Exferia_Panel_Degradado_EtiquetasAuxiliares.Enabled = true;

                    }
                }
                //Mostrar/ocultar boton de Actualizar
                else if (e.ProgressPercentage == 4)
                {
                    g_frm_P_AlmacenarDocumentos.Exferia_Button_Actualizar.Visible = (bool)e.UserState;
                }
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_CargarDatos_RegistroSeleccionado_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            //Desbloquear el Formulario
            g_frm_P_AlmacenarDocumentos.Enabled = true;

            #region Cargar Valores Etiquetas
            RellenarListado_Etiquetas(g_lng_Identificador_Seleccionado);
            #endregion

        }
        #endregion

        #region Cargar Nombre en Listado Memoria
        public void Cargar_ListadoMemoria_Nombre(string _str_Nombre)
        {
            try
            {
                if (g_lng_Identificador_Seleccionado > -1)
                {
                    //Actualizar listado
                    g_lst_INTERNO_DatosDocumento_Modelo[g_lst_INTERNO_DatosDocumento_Modelo.IndexOf(g_lst_INTERNO_DatosDocumento_Modelo.Where(m => m.Indentificador.Equals(g_lng_Identificador_Seleccionado)).FirstOrDefault())].Nombre_SinExtension = _str_Nombre;

                    //Actualiazr DataGridView
                    DataGridViewRow dgvr_Actualizar = g_frm_P_AlmacenarDocumentos.Exferia_DataGridView_Documentos.Rows
                                     .Cast<DataGridViewRow>()
                                     .Where(r => r.Cells[g_int_PosicionColumna_Identificador].Value.Equals(g_lng_Identificador_Seleccionado)).FirstOrDefault();

                    if (dgvr_Actualizar != null)//Modificada
                    {
                        //Actualizar el Grid
                        dgvr_Actualizar.Cells[g_int_PosicionColumna_Descripcion].Value = _str_Nombre;
                    }

                    //Saber si el documento tiene todos los datos necesarios rellenos
                    Listado_Actualizar_FaltanDatos(g_lng_Identificador_Seleccionado);

                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(Cargar_ListadoMemoria_Nombre));
            }
        }
        #endregion

        #region Cargar Modelo Tipo en Listado Memoria
        public void Cargar_ListadoMemoria_ModeloDocumentoTipo(long _lng_idDocumentoTipo,bool _bol_BuscarDocumento)
        {
            try
            {
                if (g_lst_INTERNO_DatosDocumento_Modelo != null && g_lst_INTERNO_DatosDocumento_Modelo.Count > 0)
                {
                    INTERNO_DatosDocumento_Modelo mdl_INTERNO_DatosDocumento_Modelo= g_lst_INTERNO_DatosDocumento_Modelo.Where(m => m.Indentificador == g_lng_Identificador_Seleccionado).FirstOrDefault();

                    //rellenar la Tipo
                    GTD_DocumentosTipos mdl_GTD_DocumentosTipos = null;
                    if (_lng_idDocumentoTipo > -1)
                    {
                        mdl_GTD_DocumentosTipos = g_obj_GTD_DocumentosTipos_Datos.Obtener_Modelo_Por_Id(_lng_idDocumentoTipo, true);
                    }

                    //Check Convertir PDFA
                    mdl_INTERNO_DatosDocumento_Modelo.ConvertirPDFA = g_frm_P_AlmacenarDocumentos.Exferia_CheckBox_ConversionPDF.Checked;


                    //TipoDocumento
                    mdl_INTERNO_DatosDocumento_Modelo.TipoDocumento = mdl_GTD_DocumentosTipos;

                    //Actualiazr en el listado
                    g_lst_INTERNO_DatosDocumento_Modelo[g_lst_INTERNO_DatosDocumento_Modelo.IndexOf(g_lst_INTERNO_DatosDocumento_Modelo.Where(m => m.Indentificador.Equals(g_lng_Identificador_Seleccionado)).FirstOrDefault())] = mdl_INTERNO_DatosDocumento_Modelo;


                    //Si tiene una tipo se habilita la seleccion de tipo de plantilla se pone el filtro
                    //Filtrado de Opciones del Padre
                    List<INTERNO_Filtro_OpcionPadre_Modelo> lst_INTERNO_Filtro_OpcionPadre_Modelo = new List<INTERNO_Filtro_OpcionPadre_Modelo>();
                    if (mdl_GTD_DocumentosTipos != null)
                    {
                        lst_INTERNO_Filtro_OpcionPadre_Modelo.Add(new INTERNO_Filtro_OpcionPadre_Modelo(Exferia_Aplicacion.General.Variables.G_STR_OPCION_GTD_DOCUMENTOSTIPOS, mdl_GTD_DocumentosTipos.id));
                        g_frm_P_AlmacenarDocumentos.Exferia_F3_PlantillaDocumentoCabecera.Exferia_F3_RELACIONADOS = lst_INTERNO_Filtro_OpcionPadre_Modelo;
                        g_frm_P_AlmacenarDocumentos.Exferia_F3_PlantillaDocumentoCabecera.Enabled = true;
                    }
                    else
                    {
                        g_frm_P_AlmacenarDocumentos.Exferia_F3_PlantillaDocumentoCabecera.Exferia_F3_RELACIONADOS = null;
                        g_frm_P_AlmacenarDocumentos.Exferia_F3_PlantillaDocumentoCabecera.Enabled = false;
                    }

                    //Vaciar la plantilla
                    g_frm_P_AlmacenarDocumentos.Exferia_F3_PlantillaDocumentoCabecera.Exferia_F3_Id = -1;
                    g_frm_P_AlmacenarDocumentos.Exferia_F3_PlantillaDocumentoCabecera.Exferia_F3_Codigo = "";
                    g_frm_P_AlmacenarDocumentos.Exferia_F3_PlantillaDocumentoCabecera.Exferia_F3_Descripcion = "";
                    g_frm_P_AlmacenarDocumentos.Exferia_F3_PlantillaDocumentoCabecera.Exferia_F3_FechaBorrado = null;

                    //Convertir el Documento a PDFA
                    if  (_lng_idDocumentoTipo>-1 &&
                            (
                                _bol_BuscarDocumento ||
                                (
                                    mdl_INTERNO_DatosDocumento_Modelo != null &&
                                    mdl_INTERNO_DatosDocumento_Modelo.Documento_PDF == null
                                )
                            )
                        )
                    {
                        CargarConvertir_Documento_PDF(mdl_INTERNO_DatosDocumento_Modelo);
                    }

                    Cargar_ListadoMemoria_ModeloPlantillaCabecera(-1);
                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(Cargar_ListadoMemoria_ModeloDocumentoTipo));
            }
        }
        #endregion

        #region Cargar el Documento o Convertirlo en PDF-A
        private async void CargarConvertir_Documento_PDF(INTERNO_DatosDocumento_Modelo _mdl_INTERNO_DatosDocumento_Modelo)
        {
            try
            {

                g_frm_P_AlmacenarDocumentos.Enabled = false;

                string str_NombreFichero_PDFA = Path.GetTempPath() + DateTime.Now.ToString("yyyyMMddHHmmss") + _mdl_INTERNO_DatosDocumento_Modelo.Nombre_Fichero_Final + ".pdf";
                string str_NombreFichero_PDFA_Final = Path.GetTempPath() + DateTime.Now.ToString("yyyyMMddHHmmss") + _mdl_INTERNO_DatosDocumento_Modelo.Nombre_Fichero_Final + "_Final.pdf";

                if (!g_frm_P_AlmacenarDocumentos.Exferia_CheckBox_ConversionPDF.Checked)
                {
                    File.WriteAllBytes(str_NombreFichero_PDFA_Final, _mdl_INTERNO_DatosDocumento_Modelo.Documento_Original);
                    Actualizar_Modelo_Documento_ConvertidoPDFA(str_NombreFichero_PDFA_Final);
                }
                else
                {
                    //PDF4ME
                    if (Variables.G_MDL_GESTIONDOCUMENTAL_VALORESPORDEFECTO.pdf4me_Clave != null &&
                        Variables.G_MDL_GESTIONDOCUMENTAL_VALORESPORDEFECTO.pdf4me_Clave.Trim().Length > 0)
                    {
                        //PDF
                        if (g_lst_Extensiones_PDF.Contains(_mdl_INTERNO_DatosDocumento_Modelo.Extension))
                        {
                            await Convertidor_PDF4ME_PDF_A_PDFA(str_NombreFichero_PDFA, _mdl_INTERNO_DatosDocumento_Modelo);
                        }
                        //WORD, EXCEL E IMAGEN
                        else if (g_lst_Extensiones_WORD.Contains(_mdl_INTERNO_DatosDocumento_Modelo.Extension) ||
                                    g_lst_Extensiones_EXCEL.Contains(_mdl_INTERNO_DatosDocumento_Modelo.Extension) ||
                                    g_lst_Extensiones_IMAGEN.Contains(_mdl_INTERNO_DatosDocumento_Modelo.Extension))
                        {
                            await Convertidor_PDF4ME_DOCEXLSPNG_A_PDFA(str_NombreFichero_PDFA, str_NombreFichero_PDFA_Final, _mdl_INTERNO_DatosDocumento_Modelo);
                        }
                    }
                    //PDF24
                    else
                    {
                        //PDF
                        if (g_lst_Extensiones_PDF.Contains(_mdl_INTERNO_DatosDocumento_Modelo.Extension))
                        {
                            Convertidor_PDF24_PDF_A_PDFA(str_NombreFichero_PDFA, _mdl_INTERNO_DatosDocumento_Modelo);
                        }
                        //WORD, EXCEL E IMAGEN
                        else if (g_lst_Extensiones_WORD.Contains(_mdl_INTERNO_DatosDocumento_Modelo.Extension) ||
                                    g_lst_Extensiones_EXCEL.Contains(_mdl_INTERNO_DatosDocumento_Modelo.Extension) ||
                                    g_lst_Extensiones_IMAGEN.Contains(_mdl_INTERNO_DatosDocumento_Modelo.Extension))
                        {
                            Convertidor_PDF24_DOCEXLSPNG_A_PDFA(str_NombreFichero_PDFA, str_NombreFichero_PDFA_Final, _mdl_INTERNO_DatosDocumento_Modelo);
                        }
                    }
                }

                //Esperar a que el Documento PDF este generado en PDF-A
                int int_TiempoEspera = 0;
                while (_mdl_INTERNO_DatosDocumento_Modelo.Documento_PDF == null)
                {
                    System.Windows.Forms.Application.DoEvents();

                    Thread.Sleep(1000);

                    if (int_TiempoEspera == 60)
                    {
                        break;
                    }

                    int_TiempoEspera += 1;
                }

                g_frm_P_AlmacenarDocumentos.Enabled = true;


            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(CargarConvertir_Documento_PDF));
            }
        }
        #endregion

        #region Cargar Modelo de la Plantilla Cabecera en Listado Memoria
        public void Cargar_ListadoMemoria_ModeloPlantillaCabecera(long _lng_idPlantillaDocumentoCabecera)
        {
            try
            {
                INTERNO_DatosDocumento_Modelo mdl_INTERNO_DatosDocumento_Modelo = g_lst_INTERNO_DatosDocumento_Modelo.Where(m => m.Indentificador == g_lng_Identificador_Seleccionado).FirstOrDefault();

                if (mdl_INTERNO_DatosDocumento_Modelo != null)
                {
                    //rellenar la plantilla
                    GTD_PlantillasDocumentosCabecera mdl_GTD_PlantillasDocumentosCabecera = null;
                    if (_lng_idPlantillaDocumentoCabecera > -1)
                    {
                        mdl_GTD_PlantillasDocumentosCabecera = g_obj_GTD_PlantillasDocumentosCabecera_Datos.Obtener_Modelo_Por_Id(_lng_idPlantillaDocumentoCabecera, true, true);
                    }
                    g_lst_INTERNO_DatosDocumento_Modelo[g_lst_INTERNO_DatosDocumento_Modelo.IndexOf(g_lst_INTERNO_DatosDocumento_Modelo.Where(m => m.Indentificador.Equals(g_lng_Identificador_Seleccionado)).FirstOrDefault())].Plantilla = mdl_GTD_PlantillasDocumentosCabecera;

                    //Habilitar el Separar
                    if (mdl_GTD_PlantillasDocumentosCabecera != null &&
                        mdl_GTD_PlantillasDocumentosCabecera.GTD_PlantillasDocumentosLineas != null &&
                        mdl_GTD_PlantillasDocumentosCabecera.GTD_PlantillasDocumentosLineas.Count > 0 &&
                        mdl_GTD_PlantillasDocumentosCabecera.GTD_PlantillasDocumentosLineas.ToList().Exists(m => m.separador != null && m.separador.Value))
                    {
                        g_frm_P_AlmacenarDocumentos.Exferia_Button_ConBorde_SepararQuitarSeparacion.Text = g_str_BotonSepararQuitarSeparacion_Separar;
                        g_frm_P_AlmacenarDocumentos.Exferia_Button_ConBorde_SepararQuitarSeparacion.Visible = true;
                        g_frm_P_AlmacenarDocumentos.Exferia_Button_ConBorde_SepararQuitarSeparacion.Tag = "0";

                        g_frm_P_AlmacenarDocumentos.Exferia_Button_ConBorde_SepararGrabar.Visible = true;
                    }
                    else
                    {
                        g_frm_P_AlmacenarDocumentos.Exferia_Button_ConBorde_SepararQuitarSeparacion.Text = g_str_BotonSepararQuitarSeparacion_Separar;
                        g_frm_P_AlmacenarDocumentos.Exferia_Button_ConBorde_SepararQuitarSeparacion.Visible = false;
                        g_frm_P_AlmacenarDocumentos.Exferia_Button_ConBorde_SepararQuitarSeparacion.Tag = "0";

                        g_frm_P_AlmacenarDocumentos.Exferia_Button_ConBorde_SepararGrabar.Visible = false;
                    }

                    //Separado
                    mdl_INTERNO_DatosDocumento_Modelo.Separado = 0;

                    //Actualizar
                    if (mdl_GTD_PlantillasDocumentosCabecera != null)
                    {
                        g_frm_P_AlmacenarDocumentos.Exferia_Button_Actualizar.Visible = true;
                    }
                    else
                    {
                        g_frm_P_AlmacenarDocumentos.Exferia_Button_Actualizar.Visible = false;
                    }

                    //Vaciar los Valores Tipos
                    if (g_dct_DocumentosEtiquetas.ContainsKey(g_lng_Identificador_Seleccionado))
                    {
                        g_dct_DocumentosEtiquetas.Remove(g_lng_Identificador_Seleccionado);
                    }

                    #region Rellenar listado de Etiquetas Inicial
                    RellenarListado_Etiquetas_Inicial(g_lng_Identificador_Seleccionado);

                    #endregion

                    //Cargar los valores de la plantilla
                    //RellenarListado_Etiquetas(g_lng_Identificador_Seleccionado);

                    //Saber si el documento tiene todos los datos necesarios rellenos
                    Listado_Actualizar_FaltanDatos(g_lng_Identificador_Seleccionado);

                    #region Nombre Fichero
                    string str_NombreFichero = Funciones_GestionDocumental.Obtener_NombreFichero_Final(mdl_GTD_PlantillasDocumentosCabecera, mdl_INTERNO_DatosDocumento_Modelo);
                    
                    //Nombre_Fichero_Final
                    mdl_INTERNO_DatosDocumento_Modelo.Nombre_Fichero_Final = str_NombreFichero;
                    mdl_INTERNO_DatosDocumento_Modelo.Nombre_SinExtension = str_NombreFichero;

                    g_frm_P_AlmacenarDocumentos.Exferia_TextBox_Nombre.Text = str_NombreFichero;
                    #endregion
                }
            }
            catch (Control_Errores)
            {}
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(Cargar_ListadoMemoria_ModeloPlantillaCabecera));
            }
            finally
            {
                g_frm_P_AlmacenarDocumentos.g_bol_Bloquear_ConversionPDFA = false;
            }
            
        }
        #endregion

        #region Separar Documento
        private bool g_bol_GrabarDespuesDeSeparar = false;
        public void Separar_Documento(long _lng_Identificador,bool _bol_GrabarDespuesDeSeparar)
        {
            try
            {
                g_bol_GrabarDespuesDeSeparar = _bol_GrabarDespuesDeSeparar;

                #region Validaciones
                //Validar que tiene Nombre
                if (g_frm_P_AlmacenarDocumentos.Exferia_TextBox_Nombre.Text.Trim().Length==0)
                {
                    Mensajes.MostrarMensaje(Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_AlmacenarDocumentos.Exferia_Label_Nombre.Text));
                    return;
                }

                //Validar que tiene un tipo de documento introducido
                if (g_frm_P_AlmacenarDocumentos.Exferia_F3_DocumentoTipo.Exferia_F3_Codigo.Trim().Length == 0 &&
                    g_frm_P_AlmacenarDocumentos.Exferia_F3_DocumentoTipo.Exferia_F3_Descripcion.Trim().Length == 0)
                {
                    Mensajes.MostrarMensaje(Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_AlmacenarDocumentos.Exferia_F3_DocumentoTipo.Exferia_F3_Titulo));
                    return;
                }

                // Validar que el tipo de documento es valido 
                if ((g_frm_P_AlmacenarDocumentos.Exferia_F3_DocumentoTipo.Exferia_F3_Codigo.Trim().Length != 0 ||
                    g_frm_P_AlmacenarDocumentos.Exferia_F3_DocumentoTipo.Exferia_F3_Descripcion.Trim().Length != 0) && g_frm_P_AlmacenarDocumentos.Exferia_F3_DocumentoTipo.Exferia_F3_Id == -1)
                {
                    Mensajes.MostrarMensaje(Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_AlmacenarDocumentos.Exferia_F3_DocumentoTipo.Exferia_F3_Titulo));
                    return;
                }
                #endregion

                //Bloquear el formulario para que no se pueda hacer nada hasta que termine
                g_frm_P_AlmacenarDocumentos.Enabled = false;

                //Si la tarea asincrona esta en marcha la paro
                if (g_obj_TareaAsincrona_SepararDocumento != null)
                {
                    while (g_obj_TareaAsincrona_SepararDocumento.IsBusy)
                        System.Windows.Forms.Application.DoEvents();
                }
                else
                {
                    g_obj_TareaAsincrona_SepararDocumento = new BackgroundWorker();
                    g_obj_TareaAsincrona_SepararDocumento.DoWork += new DoWorkEventHandler(TareaAsincrona_SepararDocumento_DoWork);
                    g_obj_TareaAsincrona_SepararDocumento.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_SepararDocumento_Completed);
                    g_obj_TareaAsincrona_SepararDocumento.WorkerReportsProgress = false;
                }

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_obj_TareaAsincrona_SepararDocumento.RunWorkerAsync(_lng_Identificador);
                //#################################################################################################
            }
            catch (Exception ex)
            {
                g_frm_P_AlmacenarDocumentos.Enabled = true;

                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(Separar_Documento));
            }
        }

        private void TareaAsincrona_SepararDocumento_DoWork(object sender, DoWorkEventArgs e)
        {
            PdfReader obj_PdfReader_Etiquetas = null;
            PdfReader obj_PdfReader = null;
            try
            {
                //Argumentos
                long lng_Identificador = (long)e.Argument;

                INTERNO_DatosDocumento_Modelo mdl_INTERNO_DatosDocumento_Modelo = g_lst_INTERNO_DatosDocumento_Modelo.Where(m => m.Indentificador == lng_Identificador).FirstOrDefault();

                if (mdl_INTERNO_DatosDocumento_Modelo != null)
                {
                    
                    obj_PdfReader = new PdfReader(mdl_INTERNO_DatosDocumento_Modelo.Documento_PDF);
                    if (obj_PdfReader != null)
                    {
                        //Diccionario Paginas
                        Dictionary<string, List<int>> dct_SeparacionDocumentos = new Dictionary<string, List<int>>();
                        string str_Documento = "";
                        List<int> lst_Paginas = null;

                        for (int int_Contador = 1; int_Contador <= obj_PdfReader.NumberOfPages; int_Contador++)
                        {
                            string str_Documento_HojaActual = "";

                            //campos Separadores
                            string str_Separadores_AUX = "";
                            foreach (GTD_PlantillasDocumentosLineas mdl_GTD_PlantillasDocumentosLineas in mdl_INTERNO_DatosDocumento_Modelo.Plantilla.GTD_PlantillasDocumentosLineas.Where(m => m.separador != null && m.separador.Value).ToList())
                            {
                                System.util.RectangleJ obj_RectangleJ_Elemento = new System.util.RectangleJ(float.Parse(mdl_GTD_PlantillasDocumentosLineas.posicionX_En_Documento), float.Parse(mdl_GTD_PlantillasDocumentosLineas.posicionY_En_Documento), float.Parse(mdl_GTD_PlantillasDocumentosLineas.ancho_En_Documento), float.Parse(mdl_GTD_PlantillasDocumentosLineas.alto_En_Documento));
                                RenderFilter[] arr_RenderFilter_Elemento = { new RegionTextRenderFilter(obj_RectangleJ_Elemento) };
                                ITextExtractionStrategy obj_ITextExtractionStrategy_Elemento = new FilteredTextRenderListener(new LocationTextExtractionStrategy(), arr_RenderFilter_Elemento);

                                str_Separadores_AUX = (PdfTextExtractor.GetTextFromPage(obj_PdfReader, int_Contador, obj_ITextExtractionStrategy_Elemento)).Trim();

                                //Ver si tengo que limpiar el valor
                                if (mdl_GTD_PlantillasDocumentosLineas.limpiar!=null && mdl_GTD_PlantillasDocumentosLineas.limpiar.Value)
                                {
                                    str_Separadores_AUX = Funciones_GestionDocumental.Limpiar_Valores_Etiquetas(str_Separadores_AUX);
                                }


                                //Ver si tengo que QuitarEspaciosEnBlanco el valor
                                if (mdl_GTD_PlantillasDocumentosLineas.quitarEspaciosEnBlanco != null && mdl_GTD_PlantillasDocumentosLineas.quitarEspaciosEnBlanco.Value)
                                {
                                    str_Separadores_AUX = Funciones_GestionDocumental.QuitarEspaciosEnBlanco_Valores_Etiquetas(str_Separadores_AUX);
                                }

                                str_Documento_HojaActual += str_Separadores_AUX + "_";

                            }

                            //Si es la primera vez
                            if (str_Documento == "")
                            {
                                //Instanciar las paginas
                                lst_Paginas = new List<int>();

                                //Agregar la pagina
                                lst_Paginas.Add(int_Contador);

                                str_Documento = str_Documento_HojaActual;

                            }
                            //Si la pagina es de otro documento
                            else if (str_Documento != str_Documento_HojaActual)
                            {
                                //Agregar al Diccionario
                                if (dct_SeparacionDocumentos.ContainsKey(str_Documento))
                                {
                                    dct_SeparacionDocumentos[str_Documento].AddRange(lst_Paginas);
                                }
                                else
                                {
                                    dct_SeparacionDocumentos.Add(str_Documento, lst_Paginas);
                                }

                                //Instanciar las paginas
                                lst_Paginas = new List<int>();

                                //Agregar la pagina
                                lst_Paginas.Add(int_Contador);

                                str_Documento = str_Documento_HojaActual;
                            }
                            //Si la pagina es del mismo documento
                            else
                            {
                                //Agregar la pagina
                                lst_Paginas.Add(int_Contador);

                                str_Documento = str_Documento_HojaActual;
                            }
                        }

                        //Añadir el ultimo registro
                        if (dct_SeparacionDocumentos.ContainsKey(str_Documento))
                        {
                            dct_SeparacionDocumentos[str_Documento].AddRange(lst_Paginas);
                        }
                        else
                        {
                            dct_SeparacionDocumentos.Add(str_Documento, lst_Paginas);
                        }

                        if (dct_SeparacionDocumentos != null && dct_SeparacionDocumentos.Count() > 0)
                        {
                            int int_NumeroCopia = 1;
                            long lng_Orden = mdl_INTERNO_DatosDocumento_Modelo.Orden;
                            foreach (KeyValuePair<string, List<int>> kvp_Valores in dct_SeparacionDocumentos)
                            {
                                MemoryStream obj_MemoryStream = new MemoryStream();
                                iTextSharp.text.Document obj_Document = new iTextSharp.text.Document(obj_PdfReader.GetPageSizeWithRotation(1));

                                PdfCopy pdfCopyProvider = new PdfSmartCopy(obj_Document, obj_MemoryStream);
                                pdfCopyProvider.SetPdfVersion(PdfWriter.PDF_VERSION_1_7);
                                pdfCopyProvider.CompressionLevel = PdfStream.BEST_COMPRESSION;

                                pdfCopyProvider.SetFullCompression();

                                obj_Document.Open();
                                PdfImportedPage obj_PdfImportedPage = null;

                                foreach (int int_Pagina in kvp_Valores.Value)
                                {
                                    obj_PdfImportedPage = pdfCopyProvider.GetImportedPage(obj_PdfReader, int_Pagina);
                                    obj_PdfReader.RemoveUnusedObjects();

                                    pdfCopyProvider.AddPage(obj_PdfImportedPage);
                                }
                                obj_Document.Close();

                                //Aumentar el identificador
                                g_lng_Identificador += 1;

                                //Crear Modelo del Documetno nuevo
                                INTERNO_DatosDocumento_Modelo mdl_INTERNO_DatosDocumento_Modelo_Nueva = new INTERNO_DatosDocumento_Modelo(g_lng_Identificador,
                                                                                                                                            mdl_INTERNO_DatosDocumento_Modelo.Nombre_Real_SinExtension + "(" + int_NumeroCopia + ")",
                                                                                                                                            mdl_INTERNO_DatosDocumento_Modelo.Nombre_SinExtension + "(" + int_NumeroCopia + ")",
                                                                                                                                            mdl_INTERNO_DatosDocumento_Modelo.Nombre_SinExtension + "(" + int_NumeroCopia + ")",
                                                                                                                                           ".pdf",
                                                                                                                                            obj_MemoryStream.ToArray(),
                                                                                                                                            obj_MemoryStream.ToArray(),
                                                                                                                                            lng_Orden,
                                                                                                                                            obj_MemoryStream.ToArray().Length,
                                                                                                                                            false
                                                                                                                                            );
                                //Indentificador_Padre
                                mdl_INTERNO_DatosDocumento_Modelo_Nueva.Indentificador_Padre = lng_Identificador;
                                //Separar
                                mdl_INTERNO_DatosDocumento_Modelo_Nueva.Separado = 2;
                                //Plantilla
                                mdl_INTERNO_DatosDocumento_Modelo_Nueva.Plantilla = mdl_INTERNO_DatosDocumento_Modelo.Plantilla;
                                //TipoDocumento
                                mdl_INTERNO_DatosDocumento_Modelo_Nueva.TipoDocumento = mdl_INTERNO_DatosDocumento_Modelo.TipoDocumento;
                                //FaltanDatos
                                mdl_INTERNO_DatosDocumento_Modelo_Nueva.FaltanDatos = false;
                                //ErrorBD
                                mdl_INTERNO_DatosDocumento_Modelo_Nueva.ErrorBD = false;

                                string str_NombreFichero = Funciones_GestionDocumental.Obtener_NombreFichero_Final(mdl_INTERNO_DatosDocumento_Modelo.Plantilla, mdl_INTERNO_DatosDocumento_Modelo_Nueva);
                                //Nombre_Fichero_Final
                                mdl_INTERNO_DatosDocumento_Modelo_Nueva.Nombre_Fichero_Final = str_NombreFichero;
                                mdl_INTERNO_DatosDocumento_Modelo_Nueva.Nombre_SinExtension = str_NombreFichero;

                                #region Etiquetas de Plantilla
                                bool bol_ErroresAlBuscarEnBD = false;

                                List<GTD_Documentos_BusquedaEtiquetas> lst_GTD_Documentos_BusquedaEtiquetas = new List<GTD_Documentos_BusquedaEtiquetas>();
                                List<long> lst_idDocumentoTipoEtiqueta = new List<long>();
                                if (mdl_INTERNO_DatosDocumento_Modelo_Nueva.Plantilla != null)
                                {
                                    obj_PdfReader_Etiquetas = new PdfReader(mdl_INTERNO_DatosDocumento_Modelo_Nueva.Documento_PDF);

                                    #region Campos Relacionados
                                    List<AUX_EtiquetasCamposRelacionales_Modelo> lst_AUX_EtiquetasCamposRelacionales_Modelo_LISTADOFINAL = new List<AUX_EtiquetasCamposRelacionales_Modelo>();

                                    if (mdl_INTERNO_DatosDocumento_Modelo.Plantilla.GTD_PlantillasDocumentosLineas != null && mdl_INTERNO_DatosDocumento_Modelo.Plantilla.GTD_PlantillasDocumentosLineas.Count > 0)
                                    {
                                        //Crear Consulta para obtener Valores
                                        string str_Tabla = "";
                                        string str_ServidorBaseDatosTabla_OLD = "";
                                        string str_ServidorBaseDatosTabla = "";

                                        GTD_ConexionBDExterna mdl_GTD_ConexionBDExterna = null;
                                        string str_ClavesPrimarias = "";
                                        Dictionary<GTD_DocumentosTipos_Etiquetas, AUX_CampoTipo_Modelo> dct_Etiqueta_Campo_CampoRelacionado = new Dictionary<GTD_DocumentosTipos_Etiquetas, AUX_CampoTipo_Modelo>();

                                        foreach (GTD_DocumentosTipos_CamposRelacionales mdl_GTD_DocumentosTipos_CamposRelacionales in mdl_INTERNO_DatosDocumento_Modelo.TipoDocumento.GTD_DocumentosTipos_CamposRelacionales.OrderBy(n => n.orden))
                                        {
                                            if (mdl_GTD_DocumentosTipos_CamposRelacionales.idConexionBDExterna != null)
                                            {
                                                str_ServidorBaseDatosTabla = mdl_GTD_DocumentosTipos_CamposRelacionales.GTD_ConexionBDExterna.servidor + "|" + mdl_GTD_DocumentosTipos_CamposRelacionales.GTD_ConexionBDExterna.baseDatos + "|" + mdl_GTD_DocumentosTipos_CamposRelacionales.tabla;
                                            }
                                            else
                                            {
                                                str_ServidorBaseDatosTabla = "ConexionInterna|" + mdl_GTD_DocumentosTipos_CamposRelacionales.tabla;
                                            }

                                            //Si cambio de Tabla
                                            if (str_ServidorBaseDatosTabla_OLD != "" && str_ServidorBaseDatosTabla != str_ServidorBaseDatosTabla_OLD)
                                            {
                                                str_ClavesPrimarias = str_ClavesPrimarias.Substring(0, str_ClavesPrimarias.Length - 4);
                                                AUX_EtiquetasCamposRelacionales_Valores_Modelo mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo = null;
                                                //Conexion Externa
                                                if (mdl_GTD_ConexionBDExterna != null)
                                                {
                                                    mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo = g_obj_ConexionExterna_Datos.Creador_Consultas(mdl_GTD_ConexionBDExterna.servidor,
                                                                                                                                                        mdl_GTD_ConexionBDExterna.baseDatos,
                                                                                                                                                        mdl_GTD_ConexionBDExterna.tieneUsuario,
                                                                                                                                                        mdl_GTD_ConexionBDExterna.usuario,
                                                                                                                                                        g_obj_Encriptador.Desencriptar(mdl_GTD_ConexionBDExterna.clave),
                                                                                                                                                        str_Tabla,
                                                                                                                                                        dct_Etiqueta_Campo_CampoRelacionado,
                                                                                                                                                        str_ClavesPrimarias);
                                                }
                                                //Conexion Interna
                                                else
                                                {
                                                    mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo = g_obj_ConexionExterna_Datos.Creador_Consultas(Variables.G_STR_CONEXION_SERVIDOR, Variables.G_STR_CONEXION_BASEDATOS, (Variables.G_STR_CONEXION_USUARIO != null && Variables.G_STR_CONEXION_USUARIO.Trim().Length > 0) ? true : false, Variables.G_STR_CONEXION_USUARIO, Variables.G_STR_CONEXION_CLAVE, str_Tabla, dct_Etiqueta_Campo_CampoRelacionado, str_ClavesPrimarias);
                                                }

                                                if (mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo != null)
                                                {
                                                    bool bol_TodosLosValoresNulos = true;

                                                    //Valores
                                                    for (int int_Contador = 1; int_Contador <= dct_Etiqueta_Campo_CampoRelacionado.Count; int_Contador++)
                                                    {
                                                        AUX_EtiquetasCamposRelacionales_Modelo mdl_AUX_EtiquetasCamposRelacionales_Modelo = new AUX_EtiquetasCamposRelacionales_Modelo();

                                                        //idDocumentoTipo_Etiqueta
                                                        mdl_AUX_EtiquetasCamposRelacionales_Modelo.idDocumentoTipo_Etiqueta = (long)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("DocumentoTipoEtiqueta_Id_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null);

                                                        //Codigo
                                                        mdl_AUX_EtiquetasCamposRelacionales_Modelo.Codigo = (string)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("DocumentoTipoEtiqueta_Codigo_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null);

                                                        //Descripcion
                                                        mdl_AUX_EtiquetasCamposRelacionales_Modelo.Descripcion = (string)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("DocumentoTipoEtiqueta_Descripcion_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null);

                                                        //Valor
                                                        mdl_AUX_EtiquetasCamposRelacionales_Modelo.Valor = (string)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("Valor_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null);
                                                        if (mdl_AUX_EtiquetasCamposRelacionales_Modelo.Valor != null && mdl_AUX_EtiquetasCamposRelacionales_Modelo.Valor.Trim().Length > 0)
                                                        {
                                                            bol_TodosLosValoresNulos = false;
                                                        }

                                                        //Añadir al listado
                                                        lst_AUX_EtiquetasCamposRelacionales_Modelo_LISTADOFINAL.Add(mdl_AUX_EtiquetasCamposRelacionales_Modelo);

                                                        //MODEO DE BUSQUEDA ETIQUETA
                                                        GTD_Documentos_BusquedaEtiquetas mdl_GTD_Documentos_BusquedaEtiquetas = new GTD_Documentos_BusquedaEtiquetas();
                                                        mdl_GTD_Documentos_BusquedaEtiquetas.id = -1;
                                                        mdl_GTD_Documentos_BusquedaEtiquetas.porPlantilla = true;
                                                        mdl_GTD_Documentos_BusquedaEtiquetas.idDocumentoTipoEtiqueta = (long)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("DocumentoTipoEtiqueta_Id_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null);
                                                        mdl_GTD_Documentos_BusquedaEtiquetas.valor = (string)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("Valor_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null);

                                                        //Añadir al listado
                                                        lst_GTD_Documentos_BusquedaEtiquetas.Add(mdl_GTD_Documentos_BusquedaEtiquetas);

                                                        //Añadir al listado de la ya utilizdas
                                                        lst_idDocumentoTipoEtiqueta.Add((long)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("DocumentoTipoEtiqueta_Id_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null));

                                                        if (bol_TodosLosValoresNulos)
                                                        {
                                                            bol_ErroresAlBuscarEnBD = true;
                                                        }
                                                    }

                                                    //Vaciar
                                                    str_ClavesPrimarias = "";
                                                    dct_Etiqueta_Campo_CampoRelacionado.Clear();
                                                    mdl_GTD_ConexionBDExterna = null;
                                                }
                                                else
                                                {
                                                    bol_ErroresAlBuscarEnBD = true;
                                                }
                                            }

                                            //Clave Primaria
                                            if (mdl_GTD_DocumentosTipos_CamposRelacionales.tipo.ToString() == Variables_GestionDocumental.G_MDL_TIPOCAMPOBASEDATOSPARACONSULTA_CLAVEPRIMARIA.Codigo)
                                            {
                                                //1º Buscar primero en los Campos ya Almacenados
                                                bool bol_Entro = false;
                                                if (lst_AUX_EtiquetasCamposRelacionales_Modelo_LISTADOFINAL != null && lst_AUX_EtiquetasCamposRelacionales_Modelo_LISTADOFINAL.Count > 0)
                                                {
                                                    AUX_EtiquetasCamposRelacionales_Modelo mdl_AUX_EtiquetasCamposRelacionales_Modelo_BUSCADOPARACLAVEPRIMARIA = lst_AUX_EtiquetasCamposRelacionales_Modelo_LISTADOFINAL.Where(m => m.idDocumentoTipo_Etiqueta == mdl_GTD_DocumentosTipos_CamposRelacionales.idDocumentoTipo_Etiqueta).FirstOrDefault();
                                                    if (mdl_AUX_EtiquetasCamposRelacionales_Modelo_BUSCADOPARACLAVEPRIMARIA != null &&
                                                        mdl_AUX_EtiquetasCamposRelacionales_Modelo_BUSCADOPARACLAVEPRIMARIA.Valor != null)
                                                    {
                                                        str_ClavesPrimarias += mdl_GTD_DocumentosTipos_CamposRelacionales.tabla + "." + mdl_GTD_DocumentosTipos_CamposRelacionales.campo + "='" + mdl_AUX_EtiquetasCamposRelacionales_Modelo_BUSCADOPARACLAVEPRIMARIA.Valor + "' and ";
                                                        bol_Entro = true;
                                                    }
                                                }

                                                //2º Buscar el valor de la etiqueta para esta clave primaria ##############################################
                                                if (bol_Entro == false)
                                                {
                                                    //Buscar Primero si y a existe en el listado general
                                                    bool bol_Entro_ListadoGeneral = false;
                                                    if (g_dct_DocumentosEtiquetas != null && g_dct_DocumentosEtiquetas.Count > 0)
                                                    {
                                                        if (g_dct_DocumentosEtiquetas.ContainsKey(g_lng_Identificador))
                                                        {
                                                            List<GTD_Documentos_BusquedaEtiquetas> lst_GTD_Documentos_BusquedaEtiquetas_AUX = g_dct_DocumentosEtiquetas[g_lng_Identificador];
                                                            if (lst_GTD_Documentos_BusquedaEtiquetas_AUX != null && lst_GTD_Documentos_BusquedaEtiquetas_AUX.Count > 0)
                                                            {
                                                                GTD_Documentos_BusquedaEtiquetas mdl_GTD_Documentos_BusquedaEtiquetas_AUX = lst_GTD_Documentos_BusquedaEtiquetas_AUX.Where(m => m.idDocumentoTipoEtiqueta == mdl_GTD_DocumentosTipos_CamposRelacionales.idDocumentoTipo_Etiqueta).FirstOrDefault();
                                                                if (mdl_GTD_Documentos_BusquedaEtiquetas_AUX != null &&
                                                                    mdl_GTD_Documentos_BusquedaEtiquetas_AUX.valor != null &&
                                                                    mdl_GTD_Documentos_BusquedaEtiquetas_AUX.valor.Trim().Length > 0)
                                                                {
                                                                    str_ClavesPrimarias += mdl_GTD_DocumentosTipos_CamposRelacionales.tabla + "." + mdl_GTD_DocumentosTipos_CamposRelacionales.campo + "='" + mdl_GTD_Documentos_BusquedaEtiquetas_AUX.valor + "' and ";

                                                                    bol_Entro_ListadoGeneral = true;
                                                                }
                                                            }
                                                        }
                                                    }

                                                    if (bol_Entro_ListadoGeneral == false)
                                                    {
                                                        GTD_PlantillasDocumentosLineas mdl_GTD_PlantillasDocumentosLineas = mdl_INTERNO_DatosDocumento_Modelo.Plantilla.GTD_PlantillasDocumentosLineas.Where(m => m.idDocumentoTipoEtiqueta == mdl_GTD_DocumentosTipos_CamposRelacionales.idDocumentoTipo_Etiqueta).FirstOrDefault();
                                                        string str_Valor_Devuelto_CampoRelacionado = "";
                                                        if (mdl_GTD_PlantillasDocumentosLineas != null && mdl_GTD_PlantillasDocumentosLineas.posicionX_En_Documento != null)
                                                        {
                                                            //Obtener Valor
                                                            System.util.RectangleJ obj_RectangleJ_Elemento = new System.util.RectangleJ(float.Parse(mdl_GTD_PlantillasDocumentosLineas.posicionX_En_Documento), float.Parse(mdl_GTD_PlantillasDocumentosLineas.posicionY_En_Documento), float.Parse(mdl_GTD_PlantillasDocumentosLineas.ancho_En_Documento), float.Parse(mdl_GTD_PlantillasDocumentosLineas.alto_En_Documento));
                                                            RenderFilter[] arr_RenderFilter_Elemento = { new RegionTextRenderFilter(obj_RectangleJ_Elemento) };
                                                            ITextExtractionStrategy obj_ITextExtractionStrategy_Elemento = new FilteredTextRenderListener(new LocationTextExtractionStrategy(), arr_RenderFilter_Elemento);
                                                            str_Valor_Devuelto_CampoRelacionado = PdfTextExtractor.GetTextFromPage(obj_PdfReader_Etiquetas, (mdl_GTD_PlantillasDocumentosLineas.posicionDocumento_CabeceraPieOtra == Variables_GestionDocumental.G_INT_POSICIONDOCUMENTO_PIE ? obj_PdfReader.NumberOfPages : 1), obj_ITextExtractionStrategy_Elemento);

                                                            //Ver si tengo que limpiar el valor
                                                            if (mdl_GTD_PlantillasDocumentosLineas.limpiar != null && mdl_GTD_PlantillasDocumentosLineas.limpiar.Value)
                                                            {
                                                                str_Valor_Devuelto_CampoRelacionado = Funciones_GestionDocumental.Limpiar_Valores_Etiquetas(str_Valor_Devuelto_CampoRelacionado);
                                                            }

                                                            //Ver si tengo que quitarEspaciosEnBlanco el valor
                                                            if (mdl_GTD_PlantillasDocumentosLineas.quitarEspaciosEnBlanco != null && mdl_GTD_PlantillasDocumentosLineas.quitarEspaciosEnBlanco.Value)
                                                            {
                                                                str_Valor_Devuelto_CampoRelacionado = Funciones_GestionDocumental.QuitarEspaciosEnBlanco_Valores_Etiquetas(str_Valor_Devuelto_CampoRelacionado);
                                                            }
                                                        }

                                                        str_ClavesPrimarias += mdl_GTD_DocumentosTipos_CamposRelacionales.tabla + "." + mdl_GTD_DocumentosTipos_CamposRelacionales.campo + "='" + str_Valor_Devuelto_CampoRelacionado + "' and ";
                                                    }
                                                }
                                            }
                                            //Consulta
                                            else if (mdl_GTD_DocumentosTipos_CamposRelacionales.tipo.ToString() == Variables_GestionDocumental.G_MDL_TIPOCAMPOBASEDATOSPARACONSULTA_CONSULTA.Codigo)
                                            {
                                                dct_Etiqueta_Campo_CampoRelacionado.Add(mdl_GTD_DocumentosTipos_CamposRelacionales.GTD_DocumentosTipos_Etiquetas, new AUX_CampoTipo_Modelo(mdl_GTD_DocumentosTipos_CamposRelacionales.tabla + "." + mdl_GTD_DocumentosTipos_CamposRelacionales.campo, mdl_GTD_DocumentosTipos_CamposRelacionales.tipoCampo));
                                            }

                                            //Almacenar para ver cuando cambia de tabla y se busca en BD ##############################################################
                                            if (mdl_GTD_DocumentosTipos_CamposRelacionales.idConexionBDExterna != null)
                                            {
                                                mdl_GTD_ConexionBDExterna = mdl_GTD_DocumentosTipos_CamposRelacionales.GTD_ConexionBDExterna;
                                                str_ServidorBaseDatosTabla_OLD = mdl_GTD_DocumentosTipos_CamposRelacionales.GTD_ConexionBDExterna.servidor + "|" + mdl_GTD_DocumentosTipos_CamposRelacionales.GTD_ConexionBDExterna.baseDatos + "|" + mdl_GTD_DocumentosTipos_CamposRelacionales.tabla;
                                            }
                                            else
                                            {
                                                mdl_GTD_ConexionBDExterna = null;
                                                str_ServidorBaseDatosTabla_OLD = "ConexionInterna|" + mdl_GTD_DocumentosTipos_CamposRelacionales.tabla;
                                            }

                                            str_Tabla = mdl_GTD_DocumentosTipos_CamposRelacionales.tabla;
                                        }


                                        //Si cambio de Tabla
                                        if (str_ServidorBaseDatosTabla_OLD != "")
                                        {
                                            str_ClavesPrimarias = str_ClavesPrimarias.Substring(0, str_ClavesPrimarias.Length - 4);
                                            AUX_EtiquetasCamposRelacionales_Valores_Modelo mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo = null;
                                            //Conexion Externa
                                            if (mdl_GTD_ConexionBDExterna != null)
                                            {
                                                mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo = g_obj_ConexionExterna_Datos.Creador_Consultas(mdl_GTD_ConexionBDExterna.servidor,
                                                                                                                                                    mdl_GTD_ConexionBDExterna.baseDatos,
                                                                                                                                                    mdl_GTD_ConexionBDExterna.tieneUsuario,
                                                                                                                                                    mdl_GTD_ConexionBDExterna.usuario,
                                                                                                                                                    g_obj_Encriptador.Desencriptar(mdl_GTD_ConexionBDExterna.clave),
                                                                                                                                                    str_Tabla,
                                                                                                                                                    dct_Etiqueta_Campo_CampoRelacionado,
                                                                                                                                                    str_ClavesPrimarias);
                                            }
                                            //Conexion Interna
                                            else
                                            {
                                                mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo = g_obj_ConexionExterna_Datos.Creador_Consultas(Variables.G_STR_CONEXION_SERVIDOR,
                                                                                                                                                    Variables.G_STR_CONEXION_BASEDATOS,
                                                                                                                                                    (Variables.G_STR_CONEXION_USUARIO != null && Variables.G_STR_CONEXION_USUARIO.Trim().Length > 0) ? true : false,
                                                                                                                                                    Variables.G_STR_CONEXION_USUARIO,
                                                                                                                                                    Variables.G_STR_CONEXION_CLAVE,
                                                                                                                                                    str_Tabla,
                                                                                                                                                    dct_Etiqueta_Campo_CampoRelacionado,
                                                                                                                                                    str_ClavesPrimarias);
                                            }

                                            if (mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo != null)
                                            {
                                                bool bol_TodosLosValoresNulos = true;

                                                //Valores
                                                for (int int_Contador = 1; int_Contador <= dct_Etiqueta_Campo_CampoRelacionado.Count; int_Contador++)
                                                {
                                                    AUX_EtiquetasCamposRelacionales_Modelo mdl_AUX_EtiquetasCamposRelacionales_Modelo = new AUX_EtiquetasCamposRelacionales_Modelo();

                                                    //idDocumentoTipo_Etiqueta
                                                    mdl_AUX_EtiquetasCamposRelacionales_Modelo.idDocumentoTipo_Etiqueta = (long)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("DocumentoTipoEtiqueta_Id_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null);

                                                    //Codigo
                                                    mdl_AUX_EtiquetasCamposRelacionales_Modelo.Codigo = (string)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("DocumentoTipoEtiqueta_Codigo_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null);

                                                    //Descripcion
                                                    mdl_AUX_EtiquetasCamposRelacionales_Modelo.Descripcion = (string)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("DocumentoTipoEtiqueta_Descripcion_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null);

                                                    //Valor
                                                    mdl_AUX_EtiquetasCamposRelacionales_Modelo.Valor = (string)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("Valor_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null);
                                                    if (mdl_AUX_EtiquetasCamposRelacionales_Modelo.Valor != null && mdl_AUX_EtiquetasCamposRelacionales_Modelo.Valor.Trim().Length > 0)
                                                    {
                                                        bol_TodosLosValoresNulos = false;
                                                    }

                                                    //Añadir al listado
                                                    lst_AUX_EtiquetasCamposRelacionales_Modelo_LISTADOFINAL.Add(mdl_AUX_EtiquetasCamposRelacionales_Modelo);

                                                    //MODEO DE BUSQUEDA ETIQUETA
                                                    GTD_Documentos_BusquedaEtiquetas mdl_GTD_Documentos_BusquedaEtiquetas = new GTD_Documentos_BusquedaEtiquetas();
                                                    mdl_GTD_Documentos_BusquedaEtiquetas.id = -1;
                                                    mdl_GTD_Documentos_BusquedaEtiquetas.porPlantilla = true;
                                                    mdl_GTD_Documentos_BusquedaEtiquetas.idDocumentoTipoEtiqueta = (long)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("DocumentoTipoEtiqueta_Id_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null);
                                                    mdl_GTD_Documentos_BusquedaEtiquetas.valor = (string)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("Valor_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null);

                                                    //Añadir al listado
                                                    lst_GTD_Documentos_BusquedaEtiquetas.Add(mdl_GTD_Documentos_BusquedaEtiquetas);

                                                    //Añadir al listado de la ya utilizdas
                                                    lst_idDocumentoTipoEtiqueta.Add((long)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("DocumentoTipoEtiqueta_Id_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null));
                                                }

                                                if (bol_TodosLosValoresNulos)
                                                {
                                                    bol_ErroresAlBuscarEnBD = true;
                                                }
                                            }
                                            else
                                            {
                                                bol_ErroresAlBuscarEnBD = true;
                                            }
                                        }
                                    }

                                    //Actualizar Columna y Campo
                                    if (bol_ErroresAlBuscarEnBD)
                                    {
                                        mdl_INTERNO_DatosDocumento_Modelo_Nueva.ErrorBD = bol_ErroresAlBuscarEnBD;
                                    }
                                    #endregion

                                    string str_Valor_Devuelto = "";
                                    foreach (GTD_PlantillasDocumentosLineas mdl_GTD_PlantillasDocumentosLineas in mdl_INTERNO_DatosDocumento_Modelo_Nueva.Plantilla.GTD_PlantillasDocumentosLineas)
                                    {
                                        //Buscar el DocumentoTipoEtiqueta
                                        if (mdl_GTD_PlantillasDocumentosLineas.idDocumentoTipoEtiqueta != null &&
                                            mdl_INTERNO_DatosDocumento_Modelo.TipoDocumento.GTD_DocumentosTipos_Etiquetas.Count > 0)
                                        {
                                            GTD_DocumentosTipos_Etiquetas mdl_GTD_DocumentosTipos_Etiquetas = mdl_INTERNO_DatosDocumento_Modelo_Nueva.TipoDocumento.GTD_DocumentosTipos_Etiquetas.Where(m => m.id == mdl_GTD_PlantillasDocumentosLineas.idDocumentoTipoEtiqueta.Value).FirstOrDefault();
                                            if (mdl_GTD_DocumentosTipos_Etiquetas != null)
                                            {
                                                //Buscar por si ya existe
                                                GTD_Documentos_BusquedaEtiquetas mdl_GTD_Documentos_BusquedaEtiquetas = null;
                                                if (lst_GTD_Documentos_BusquedaEtiquetas != null &&
                                                    lst_GTD_Documentos_BusquedaEtiquetas.Count > 0)
                                                {
                                                    mdl_GTD_Documentos_BusquedaEtiquetas = lst_GTD_Documentos_BusquedaEtiquetas.Where(m => m.idDocumentoTipoEtiqueta != null && m.idDocumentoTipoEtiqueta.Value.Equals(mdl_GTD_DocumentosTipos_Etiquetas.id) && m.porPlantilla).FirstOrDefault();
                                                }

                                                //Si no existe lo creo nuevo
                                                if (mdl_GTD_Documentos_BusquedaEtiquetas == null)
                                                {

                                                    //Ver si esta en las Relacioandas
                                                    if (lst_AUX_EtiquetasCamposRelacionales_Modelo_LISTADOFINAL != null &&
                                                        lst_AUX_EtiquetasCamposRelacionales_Modelo_LISTADOFINAL.Count > 0 &&
                                                        lst_AUX_EtiquetasCamposRelacionales_Modelo_LISTADOFINAL.Exists(m => m.idDocumentoTipo_Etiqueta == mdl_GTD_DocumentosTipos_Etiquetas.id))
                                                    {
                                                        str_Valor_Devuelto = lst_AUX_EtiquetasCamposRelacionales_Modelo_LISTADOFINAL.Where(m => m.idDocumentoTipo_Etiqueta == mdl_GTD_DocumentosTipos_Etiquetas.id).FirstOrDefault().Valor;
                                                    }
                                                    else
                                                    {
                                                        System.util.RectangleJ obj_RectangleJ_Elemento = new System.util.RectangleJ(float.Parse(mdl_GTD_PlantillasDocumentosLineas.posicionX_En_Documento), float.Parse(mdl_GTD_PlantillasDocumentosLineas.posicionY_En_Documento), float.Parse(mdl_GTD_PlantillasDocumentosLineas.ancho_En_Documento), float.Parse(mdl_GTD_PlantillasDocumentosLineas.alto_En_Documento));
                                                        RenderFilter[] arr_RenderFilter_Elemento = { new RegionTextRenderFilter(obj_RectangleJ_Elemento) };
                                                        ITextExtractionStrategy obj_ITextExtractionStrategy_Elemento = new FilteredTextRenderListener(new LocationTextExtractionStrategy(), arr_RenderFilter_Elemento);
                                                        int int_valor = (mdl_GTD_PlantillasDocumentosLineas.posicionDocumento_CabeceraPieOtra == Variables_GestionDocumental.G_INT_POSICIONDOCUMENTO_PIE ? obj_PdfReader_Etiquetas.NumberOfPages : 1);
                                                        str_Valor_Devuelto = PdfTextExtractor.GetTextFromPage(obj_PdfReader_Etiquetas, int_valor, obj_ITextExtractionStrategy_Elemento);

                                                        //Ver si tengo que limpiar el valor
                                                        if (mdl_GTD_PlantillasDocumentosLineas.limpiar != null && mdl_GTD_PlantillasDocumentosLineas.limpiar.Value)
                                                        {
                                                            str_Valor_Devuelto = Funciones_GestionDocumental.Limpiar_Valores_Etiquetas(str_Valor_Devuelto);
                                                        }

                                                        //Ver si tengo que quitarEspaciosEnBlanco el valor
                                                        if (mdl_GTD_PlantillasDocumentosLineas.quitarEspaciosEnBlanco != null && mdl_GTD_PlantillasDocumentosLineas.quitarEspaciosEnBlanco.Value)
                                                        {
                                                            str_Valor_Devuelto = Funciones_GestionDocumental.QuitarEspaciosEnBlanco_Valores_Etiquetas(str_Valor_Devuelto);
                                                        }
                                                    }

                                                    //MODELO DE BUSQUEDA ETIQUETA
                                                    mdl_GTD_Documentos_BusquedaEtiquetas = new GTD_Documentos_BusquedaEtiquetas();
                                                    mdl_GTD_Documentos_BusquedaEtiquetas.id = -1;

                                                    //Etiqueta
                                                    if (mdl_GTD_PlantillasDocumentosLineas.idDocumentoTipoEtiqueta != null)
                                                    {
                                                        mdl_GTD_Documentos_BusquedaEtiquetas.idDocumentoTipoEtiqueta = mdl_GTD_PlantillasDocumentosLineas.idDocumentoTipoEtiqueta.Value;
                                                    }

                                                    mdl_GTD_Documentos_BusquedaEtiquetas.porPlantilla = true;

                                                    mdl_GTD_Documentos_BusquedaEtiquetas.valor = str_Valor_Devuelto;

                                                    //Añadir al listado
                                                    lst_GTD_Documentos_BusquedaEtiquetas.Add(mdl_GTD_Documentos_BusquedaEtiquetas);
                                                }
                                            }
                                        }
                                    }

                                    //Añadir al diccionario si no existiera
                                    if (lst_GTD_Documentos_BusquedaEtiquetas.Count > 0)
                                    {
                                        if (!g_dct_DocumentosEtiquetas.ContainsKey(g_lng_Identificador))
                                        {
                                            g_dct_DocumentosEtiquetas.Add(g_lng_Identificador, lst_GTD_Documentos_BusquedaEtiquetas);
                                        }
                                    }
                                }
                                #endregion

                                //Añadir al listado
                                g_lst_INTERNO_DatosDocumento_Modelo.Add(mdl_INTERNO_DatosDocumento_Modelo_Nueva);

                                //Aumentar el numero de copia
                                int_NumeroCopia += 1;

                                //Aumentar el orden
                                lng_Orden += 1;
                            }
                        }

                        //Separado el Documento Principal
                        mdl_INTERNO_DatosDocumento_Modelo.Separado = 1;
                        mdl_INTERNO_DatosDocumento_Modelo.Nombre_SinExtension = mdl_INTERNO_DatosDocumento_Modelo.Nombre_Real_SinExtension;
                        mdl_INTERNO_DatosDocumento_Modelo.Nombre_Fichero_Final = mdl_INTERNO_DatosDocumento_Modelo.Nombre_Real_SinExtension;
                    }
                    
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(TareaAsincrona_SepararDocumento_DoWork));
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(TareaAsincrona_SepararDocumento_DoWork));
            }
            finally
            {
                if (obj_PdfReader_Etiquetas != null)
                {
                    obj_PdfReader_Etiquetas.Close();
                }

                if (obj_PdfReader!=null)
                {
                    obj_PdfReader.Close();
                }

                
            }
        }
        private void TareaAsincrona_SepararDocumento_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            //Desbloquear el Formulario
            g_frm_P_AlmacenarDocumentos.Enabled = true;

            Rellenar_Listado("", false);

            if (g_bol_GrabarDespuesDeSeparar)
            {
                GrabarDatos();
            }
            
            
        }
        #endregion

        #region Quitar Separacion Documento
        public void QuitarSeparacion_Documento(long _lng_Identificador)
        {
            try
            {
                //Bloquear el formulario para que no se pueda hacer nada hasta que termine
                g_frm_P_AlmacenarDocumentos.Enabled = false;

                //Si la tarea asincrona esta en marcha la paro
                if (g_obj_TareaAsincrona_QuitarSeparacionDocumento != null)
                {
                    while (g_obj_TareaAsincrona_QuitarSeparacionDocumento.IsBusy)
                        System.Windows.Forms.Application.DoEvents();
                }
                else
                {
                    g_obj_TareaAsincrona_QuitarSeparacionDocumento = new BackgroundWorker();
                    g_obj_TareaAsincrona_QuitarSeparacionDocumento.DoWork += new DoWorkEventHandler(TareaAsincrona_QuitarSeparacionDocumento_DoWork);
                    g_obj_TareaAsincrona_QuitarSeparacionDocumento.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_QuitarSeparacionDocumento_Completed);
                    g_obj_TareaAsincrona_QuitarSeparacionDocumento.WorkerReportsProgress = false;
                }

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_obj_TareaAsincrona_QuitarSeparacionDocumento.RunWorkerAsync(_lng_Identificador);
                //#################################################################################################
            }
            catch (Exception ex)
            {
                g_frm_P_AlmacenarDocumentos.Enabled = true;

                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(QuitarSeparacion_Documento));
            }
        }

        private void TareaAsincrona_QuitarSeparacionDocumento_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                //Argumentos
                long lng_Identificador = (long)e.Argument;

                INTERNO_DatosDocumento_Modelo mdl_INTERNO_DatosDocumento_Modelo = g_lst_INTERNO_DatosDocumento_Modelo.Where(m => m.Indentificador == lng_Identificador).FirstOrDefault();

                if (mdl_INTERNO_DatosDocumento_Modelo != null)
                {
                    //Quitar del listado los documetnos hijos
                    g_lst_INTERNO_DatosDocumento_Modelo.RemoveAll(m => m.Indentificador_Padre == lng_Identificador);

                    //Separado el Documento Principal
                    mdl_INTERNO_DatosDocumento_Modelo.Separado = 0;

                    string str_NombreFichero = Funciones_GestionDocumental.Obtener_NombreFichero_Final(mdl_INTERNO_DatosDocumento_Modelo.Plantilla, mdl_INTERNO_DatosDocumento_Modelo);
                    mdl_INTERNO_DatosDocumento_Modelo.Nombre_SinExtension = str_NombreFichero;
                    mdl_INTERNO_DatosDocumento_Modelo.Nombre_Fichero_Final = str_NombreFichero;
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(TareaAsincrona_QuitarSeparacionDocumento_DoWork));
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(TareaAsincrona_QuitarSeparacionDocumento_DoWork));
            }
        }
        private void TareaAsincrona_QuitarSeparacionDocumento_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            //Desbloquear el Formulario
            g_frm_P_AlmacenarDocumentos.Enabled = true;

            Rellenar_Listado("", false);
        }
        #endregion

        #region Etiquetas

        #region Rellenar Listado Etiquetas Inicial
        public void RellenarListado_Etiquetas_Inicial(long _lng_idIdentificador)
        {
            try
            {
                // Si la tarea asincrona esta en marcha la paro
                if (g_obj_TareaAsincrona_RellenarListado_Etiquetas_Inicial != null)
                {
                    while (g_obj_TareaAsincrona_RellenarListado_Etiquetas_Inicial.IsBusy)
                        System.Windows.Forms.Application.DoEvents();
                }
                else
                {
                    g_obj_TareaAsincrona_RellenarListado_Etiquetas_Inicial = new BackgroundWorker();
                    g_obj_TareaAsincrona_RellenarListado_Etiquetas_Inicial.DoWork += new DoWorkEventHandler(TareaAsincrona_RellenarListado_Etiquetas_Inicial_DoWork);
                    g_obj_TareaAsincrona_RellenarListado_Etiquetas_Inicial.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_RellenarListado_Etiquetas_Inicial_ProgressChanged);
                    g_obj_TareaAsincrona_RellenarListado_Etiquetas_Inicial.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_RellenarListado_Etiquetas_Inicial_Completed);
                    g_obj_TareaAsincrona_RellenarListado_Etiquetas_Inicial.WorkerReportsProgress = true;
                }

                //Vaciar el listado
                g_frm_P_AlmacenarDocumentos.Exferia_Panel_Degradado_Etiquetas.Controls.Clear();
                g_int_Etiquetas_PosicionY = 5;
                g_int_NumeroLineas_Etiquetas = 0;
                g_lst_ListadoLineas_Etiquetas.Clear();

                //Argumentos
                List<object> lst_Argumentos = new List<object>();
                lst_Argumentos.Add(_lng_idIdentificador);

                //(Tarea Asincrona) ##################################################################
                g_obj_TareaAsincrona_RellenarListado_Etiquetas_Inicial.RunWorkerAsync(lst_Argumentos);
                //#################################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(RellenarListado_Etiquetas_Inicial));
            }
        }
        private void TareaAsincrona_RellenarListado_Etiquetas_Inicial_DoWork(object sender, DoWorkEventArgs e)
        {
            PdfReader obj_PdfReader = null;

            try
            {
                List<object> lst_Argumentos_Entrada = (List<object>)e.Argument;

                long lng_idIdentificador = (long)lst_Argumentos_Entrada[0];

                if (lng_idIdentificador > -1)
                {
                    bool bol_ErroresAlBuscarEnBD = false;

                    //Buscar  la linea
                    INTERNO_DatosDocumento_Modelo mdl_INTERNO_DatosDocumento_Modelo = g_lst_INTERNO_DatosDocumento_Modelo.Where(m => m.Indentificador == lng_idIdentificador).FirstOrDefault();
                    if (mdl_INTERNO_DatosDocumento_Modelo != null && mdl_INTERNO_DatosDocumento_Modelo.Separado != 1)
                    {
                        if (mdl_INTERNO_DatosDocumento_Modelo.Documento_PDF != null)
                        {
                            if (mdl_INTERNO_DatosDocumento_Modelo.TipoDocumento != null)
                            {
                                //Tipos Existentes
                                List<GTD_Documentos_BusquedaEtiquetas> lst_GTD_Documentos_BusquedaEtiquetas = null;
                                if (g_dct_DocumentosEtiquetas.ContainsKey(lng_idIdentificador))
                                {
                                    lst_GTD_Documentos_BusquedaEtiquetas = g_dct_DocumentosEtiquetas[lng_idIdentificador];
                                }
                                if (lst_GTD_Documentos_BusquedaEtiquetas == null)
                                {
                                    lst_GTD_Documentos_BusquedaEtiquetas = new List<GTD_Documentos_BusquedaEtiquetas>();
                                }

                                #region Etiquetas de Plantilla
                                List<long> lst_idDocumentoTipoEtiqueta = new List<long>();
                                if (mdl_INTERNO_DatosDocumento_Modelo.Plantilla != null)
                                {

                                    obj_PdfReader = new PdfReader(mdl_INTERNO_DatosDocumento_Modelo.Documento_PDF);

                                    #region Campos Relacionados
                                    
                                    List<AUX_EtiquetasCamposRelacionales_Modelo> lst_AUX_EtiquetasCamposRelacionales_Modelo_LISTADOFINAL = new List<AUX_EtiquetasCamposRelacionales_Modelo>();

                                    if (mdl_INTERNO_DatosDocumento_Modelo.Plantilla.GTD_PlantillasDocumentosLineas!=null && mdl_INTERNO_DatosDocumento_Modelo.Plantilla.GTD_PlantillasDocumentosLineas.Count > 0)
                                    {
                                        //Crear Consulta para obtener Valores
                                        string str_Tabla = "";
                                        string str_ServidorBaseDatosTabla_OLD = "";
                                        string str_ServidorBaseDatosTabla = "";

                                        GTD_ConexionBDExterna mdl_GTD_ConexionBDExterna = null;
                                        string str_ClavesPrimarias = "";
                                        Dictionary<GTD_DocumentosTipos_Etiquetas, AUX_CampoTipo_Modelo> dct_Etiqueta_Campo_CampoRelacionado = new Dictionary<GTD_DocumentosTipos_Etiquetas, AUX_CampoTipo_Modelo>();

                                        foreach (GTD_DocumentosTipos_CamposRelacionales mdl_GTD_DocumentosTipos_CamposRelacionales in mdl_INTERNO_DatosDocumento_Modelo.TipoDocumento.GTD_DocumentosTipos_CamposRelacionales.OrderBy(n => n.orden))
                                        {
                                            if (mdl_GTD_DocumentosTipos_CamposRelacionales.idConexionBDExterna != null)
                                            {
                                                str_ServidorBaseDatosTabla = mdl_GTD_DocumentosTipos_CamposRelacionales.GTD_ConexionBDExterna.servidor + "|" + mdl_GTD_DocumentosTipos_CamposRelacionales.GTD_ConexionBDExterna.baseDatos + "|" + mdl_GTD_DocumentosTipos_CamposRelacionales.tabla;
                                            }
                                            else
                                            {
                                                str_ServidorBaseDatosTabla = "ConexionInterna|" + mdl_GTD_DocumentosTipos_CamposRelacionales.tabla;
                                            }

                                            //Si cambio de Tabla
                                            if (str_ServidorBaseDatosTabla_OLD != "" && str_ServidorBaseDatosTabla != str_ServidorBaseDatosTabla_OLD)
                                            {
                                                str_ClavesPrimarias = str_ClavesPrimarias.Substring(0, str_ClavesPrimarias.Length - 4);
                                                AUX_EtiquetasCamposRelacionales_Valores_Modelo mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo = null;
                                                //Conexion Externa
                                                if (mdl_GTD_ConexionBDExterna != null)
                                                {
                                                    mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo = g_obj_ConexionExterna_Datos.Creador_Consultas(mdl_GTD_ConexionBDExterna.servidor, 
                                                                                                                                                        mdl_GTD_ConexionBDExterna.baseDatos, 
                                                                                                                                                        mdl_GTD_ConexionBDExterna.tieneUsuario, 
                                                                                                                                                        mdl_GTD_ConexionBDExterna.usuario,
                                                                                                                                                        g_obj_Encriptador.Desencriptar(mdl_GTD_ConexionBDExterna.clave), 
                                                                                                                                                        str_Tabla, 
                                                                                                                                                        dct_Etiqueta_Campo_CampoRelacionado, 
                                                                                                                                                        str_ClavesPrimarias);
                                                }
                                                //Conexion Interna
                                                else
                                                {
                                                    mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo = g_obj_ConexionExterna_Datos.Creador_Consultas(Variables.G_STR_CONEXION_SERVIDOR, Variables.G_STR_CONEXION_BASEDATOS, (Variables.G_STR_CONEXION_USUARIO != null && Variables.G_STR_CONEXION_USUARIO.Trim().Length > 0) ? true : false, Variables.G_STR_CONEXION_USUARIO, Variables.G_STR_CONEXION_CLAVE, str_Tabla, dct_Etiqueta_Campo_CampoRelacionado, str_ClavesPrimarias);
                                                }

                                                if (mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo != null)
                                                {
                                                    bool bol_TodosLosValoresNulos = true;

                                                    //Valores
                                                    for (int int_Contador = 1; int_Contador <= dct_Etiqueta_Campo_CampoRelacionado.Count; int_Contador++)
                                                    {
                                                        AUX_EtiquetasCamposRelacionales_Modelo mdl_AUX_EtiquetasCamposRelacionales_Modelo = new AUX_EtiquetasCamposRelacionales_Modelo();

                                                        //idDocumentoTipo_Etiqueta
                                                        mdl_AUX_EtiquetasCamposRelacionales_Modelo.idDocumentoTipo_Etiqueta = (long)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("DocumentoTipoEtiqueta_Id_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null);

                                                        //Codigo
                                                        mdl_AUX_EtiquetasCamposRelacionales_Modelo.Codigo = (string)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("DocumentoTipoEtiqueta_Codigo_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null);

                                                        //Descripcion
                                                        mdl_AUX_EtiquetasCamposRelacionales_Modelo.Descripcion = (string)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("DocumentoTipoEtiqueta_Descripcion_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null);

                                                        //Valor
                                                        mdl_AUX_EtiquetasCamposRelacionales_Modelo.Valor = (string)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("Valor_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null);
                                                        if (mdl_AUX_EtiquetasCamposRelacionales_Modelo.Valor != null && mdl_AUX_EtiquetasCamposRelacionales_Modelo.Valor.Trim().Length > 0)
                                                        {
                                                            bol_TodosLosValoresNulos = false;
                                                        }

                                                        //Añadir al listado
                                                        lst_AUX_EtiquetasCamposRelacionales_Modelo_LISTADOFINAL.Add(mdl_AUX_EtiquetasCamposRelacionales_Modelo);

                                                        //MODEO DE BUSQUEDA ETIQUETA
                                                        GTD_Documentos_BusquedaEtiquetas mdl_GTD_Documentos_BusquedaEtiquetas = new GTD_Documentos_BusquedaEtiquetas();
                                                        mdl_GTD_Documentos_BusquedaEtiquetas.id = -1;
                                                        mdl_GTD_Documentos_BusquedaEtiquetas.porPlantilla = true;
                                                        mdl_GTD_Documentos_BusquedaEtiquetas.idDocumentoTipoEtiqueta = (long)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("DocumentoTipoEtiqueta_Id_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null);
                                                        mdl_GTD_Documentos_BusquedaEtiquetas.valor = (string)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("Valor_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null);

                                                        //Añadir al listado
                                                        lst_GTD_Documentos_BusquedaEtiquetas.Add(mdl_GTD_Documentos_BusquedaEtiquetas);

                                                        //AÑADIR CONTROL
                                                        List<object> lst_Argumentos = new List<object>();
                                                        lst_Argumentos.Add((long)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("DocumentoTipoEtiqueta_Id_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null));
                                                        lst_Argumentos.Add((string)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("DocumentoTipoEtiqueta_Codigo_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null));
                                                        lst_Argumentos.Add((string)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("DocumentoTipoEtiqueta_Descripcion_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null));
                                                        lst_Argumentos.Add(mdl_GTD_Documentos_BusquedaEtiquetas);
                                                        ((BackgroundWorker)sender).ReportProgress(2, lst_Argumentos);

                                                        //Añadir al listado de la ya utilizdas
                                                        lst_idDocumentoTipoEtiqueta.Add((long)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("DocumentoTipoEtiqueta_Id_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null));

                                                        if (bol_TodosLosValoresNulos)
                                                        {
                                                            bol_ErroresAlBuscarEnBD = true;
                                                        }
                                                    }

                                                    //Vaciar
                                                    str_ClavesPrimarias = "";
                                                    dct_Etiqueta_Campo_CampoRelacionado.Clear();
                                                    mdl_GTD_ConexionBDExterna = null;
                                                }
                                                else
                                                {
                                                    bol_ErroresAlBuscarEnBD = true;
                                                }
                                            }

                                            //Clave Primaria
                                            if (mdl_GTD_DocumentosTipos_CamposRelacionales.tipo.ToString() == Variables_GestionDocumental.G_MDL_TIPOCAMPOBASEDATOSPARACONSULTA_CLAVEPRIMARIA.Codigo)
                                            {
                                                //1º Buscar primero en los Campos ya Almacenados
                                                bool bol_Entro = false;
                                                if (lst_AUX_EtiquetasCamposRelacionales_Modelo_LISTADOFINAL != null && lst_AUX_EtiquetasCamposRelacionales_Modelo_LISTADOFINAL.Count > 0)
                                                {
                                                    AUX_EtiquetasCamposRelacionales_Modelo mdl_AUX_EtiquetasCamposRelacionales_Modelo_BUSCADOPARACLAVEPRIMARIA = lst_AUX_EtiquetasCamposRelacionales_Modelo_LISTADOFINAL.Where(m => m.idDocumentoTipo_Etiqueta == mdl_GTD_DocumentosTipos_CamposRelacionales.idDocumentoTipo_Etiqueta).FirstOrDefault();
                                                    if (mdl_AUX_EtiquetasCamposRelacionales_Modelo_BUSCADOPARACLAVEPRIMARIA != null &&
                                                        mdl_AUX_EtiquetasCamposRelacionales_Modelo_BUSCADOPARACLAVEPRIMARIA.Valor != null)
                                                    {
                                                        str_ClavesPrimarias += mdl_GTD_DocumentosTipos_CamposRelacionales.tabla + "." + mdl_GTD_DocumentosTipos_CamposRelacionales.campo + "='" + mdl_AUX_EtiquetasCamposRelacionales_Modelo_BUSCADOPARACLAVEPRIMARIA.Valor + "' and ";
                                                        bol_Entro = true;
                                                    }
                                                }

                                                //2º Buscar el valor de la etiqueta para esta clave primaria ##############################################
                                                if (bol_Entro == false)
                                                {
                                                    //Buscar Primero si y a existe en el listado general
                                                    bool bol_Entro_ListadoGeneral = false;
                                                    if (g_dct_DocumentosEtiquetas!=null && g_dct_DocumentosEtiquetas.Count>0)
                                                    {
                                                        if (g_dct_DocumentosEtiquetas.ContainsKey(lng_idIdentificador))
                                                        {
                                                            List<GTD_Documentos_BusquedaEtiquetas> lst_GTD_Documentos_BusquedaEtiquetas_AUX = g_dct_DocumentosEtiquetas[lng_idIdentificador];
                                                            if (lst_GTD_Documentos_BusquedaEtiquetas_AUX != null && lst_GTD_Documentos_BusquedaEtiquetas_AUX.Count > 0)
                                                            {
                                                                GTD_Documentos_BusquedaEtiquetas mdl_GTD_Documentos_BusquedaEtiquetas_AUX = lst_GTD_Documentos_BusquedaEtiquetas_AUX.Where(m => m.idDocumentoTipoEtiqueta == mdl_GTD_DocumentosTipos_CamposRelacionales.idDocumentoTipo_Etiqueta).FirstOrDefault();
                                                                if (mdl_GTD_Documentos_BusquedaEtiquetas_AUX != null &&
                                                                    mdl_GTD_Documentos_BusquedaEtiquetas_AUX.valor != null &&
                                                                    mdl_GTD_Documentos_BusquedaEtiquetas_AUX.valor.Trim().Length > 0)
                                                                {
                                                                    str_ClavesPrimarias += mdl_GTD_DocumentosTipos_CamposRelacionales.tabla + "." + mdl_GTD_DocumentosTipos_CamposRelacionales.campo + "='" + mdl_GTD_Documentos_BusquedaEtiquetas_AUX.valor + "' and ";

                                                                    bol_Entro_ListadoGeneral = true;
                                                                }
                                                            }
                                                        }
                                                    }

                                                    if (bol_Entro_ListadoGeneral == false)
                                                    {
                                                        GTD_PlantillasDocumentosLineas mdl_GTD_PlantillasDocumentosLineas = mdl_INTERNO_DatosDocumento_Modelo.Plantilla.GTD_PlantillasDocumentosLineas.Where(m => m.idDocumentoTipoEtiqueta == mdl_GTD_DocumentosTipos_CamposRelacionales.idDocumentoTipo_Etiqueta).FirstOrDefault();
                                                        string str_Valor_Devuelto_CampoRelacionado = "";
                                                        if (mdl_GTD_PlantillasDocumentosLineas != null && mdl_GTD_PlantillasDocumentosLineas.posicionX_En_Documento != null)
                                                        {
                                                            //Obtener Valor
                                                            System.util.RectangleJ obj_RectangleJ_Elemento = new System.util.RectangleJ(float.Parse(mdl_GTD_PlantillasDocumentosLineas.posicionX_En_Documento), float.Parse(mdl_GTD_PlantillasDocumentosLineas.posicionY_En_Documento), float.Parse(mdl_GTD_PlantillasDocumentosLineas.ancho_En_Documento), float.Parse(mdl_GTD_PlantillasDocumentosLineas.alto_En_Documento));
                                                            RenderFilter[] arr_RenderFilter_Elemento = { new RegionTextRenderFilter(obj_RectangleJ_Elemento) };
                                                            ITextExtractionStrategy obj_ITextExtractionStrategy_Elemento = new FilteredTextRenderListener(new LocationTextExtractionStrategy(), arr_RenderFilter_Elemento);
                                                            str_Valor_Devuelto_CampoRelacionado = PdfTextExtractor.GetTextFromPage(obj_PdfReader, (mdl_GTD_PlantillasDocumentosLineas.posicionDocumento_CabeceraPieOtra == Variables_GestionDocumental.G_INT_POSICIONDOCUMENTO_PIE ? obj_PdfReader.NumberOfPages : 1), obj_ITextExtractionStrategy_Elemento);

                                                            //Ver si tengo que limpiar el valor
                                                            if (mdl_GTD_PlantillasDocumentosLineas.limpiar != null && mdl_GTD_PlantillasDocumentosLineas.limpiar.Value)
                                                            {
                                                                str_Valor_Devuelto_CampoRelacionado = Funciones_GestionDocumental.Limpiar_Valores_Etiquetas(str_Valor_Devuelto_CampoRelacionado);
                                                            }

                                                            //Ver si tengo que quitarEspaciosEnBlanco el valor
                                                            if (mdl_GTD_PlantillasDocumentosLineas.quitarEspaciosEnBlanco != null && mdl_GTD_PlantillasDocumentosLineas.quitarEspaciosEnBlanco.Value)
                                                            {
                                                                str_Valor_Devuelto_CampoRelacionado = Funciones_GestionDocumental.QuitarEspaciosEnBlanco_Valores_Etiquetas(str_Valor_Devuelto_CampoRelacionado);
                                                            }
                                                        }

                                                        str_ClavesPrimarias += mdl_GTD_DocumentosTipos_CamposRelacionales.tabla + "." + mdl_GTD_DocumentosTipos_CamposRelacionales.campo + "='" + str_Valor_Devuelto_CampoRelacionado + "' and ";
                                                    }
                                                }
                                            }
                                            //Consulta
                                            else if (mdl_GTD_DocumentosTipos_CamposRelacionales.tipo.ToString() == Variables_GestionDocumental.G_MDL_TIPOCAMPOBASEDATOSPARACONSULTA_CONSULTA.Codigo)
                                            {
                                                dct_Etiqueta_Campo_CampoRelacionado.Add(mdl_GTD_DocumentosTipos_CamposRelacionales.GTD_DocumentosTipos_Etiquetas, new AUX_CampoTipo_Modelo(mdl_GTD_DocumentosTipos_CamposRelacionales.tabla + "." + mdl_GTD_DocumentosTipos_CamposRelacionales.campo, mdl_GTD_DocumentosTipos_CamposRelacionales.tipoCampo));
                                            }

                                            //Almacenar para ver cuando cambia de tabla y se busca en BD ##############################################################
                                            if (mdl_GTD_DocumentosTipos_CamposRelacionales.idConexionBDExterna != null)
                                            {
                                                mdl_GTD_ConexionBDExterna = mdl_GTD_DocumentosTipos_CamposRelacionales.GTD_ConexionBDExterna;
                                                str_ServidorBaseDatosTabla_OLD = mdl_GTD_DocumentosTipos_CamposRelacionales.GTD_ConexionBDExterna.servidor + "|" + mdl_GTD_DocumentosTipos_CamposRelacionales.GTD_ConexionBDExterna.baseDatos + "|" + mdl_GTD_DocumentosTipos_CamposRelacionales.tabla;
                                            }
                                            else
                                            {
                                                mdl_GTD_ConexionBDExterna = null;
                                                str_ServidorBaseDatosTabla_OLD = "ConexionInterna|" + mdl_GTD_DocumentosTipos_CamposRelacionales.tabla;
                                            }

                                            str_Tabla = mdl_GTD_DocumentosTipos_CamposRelacionales.tabla;
                                        }


                                        //Si cambio de Tabla
                                        if (str_ServidorBaseDatosTabla_OLD != "")
                                        {
                                            str_ClavesPrimarias = str_ClavesPrimarias.Substring(0, str_ClavesPrimarias.Length - 4);
                                            AUX_EtiquetasCamposRelacionales_Valores_Modelo mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo = null;
                                            //Conexion Externa
                                            if (mdl_GTD_ConexionBDExterna != null)
                                            {
                                                mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo = g_obj_ConexionExterna_Datos.Creador_Consultas(mdl_GTD_ConexionBDExterna.servidor, 
                                                                                                                                                    mdl_GTD_ConexionBDExterna.baseDatos, 
                                                                                                                                                    mdl_GTD_ConexionBDExterna.tieneUsuario, 
                                                                                                                                                    mdl_GTD_ConexionBDExterna.usuario,
                                                                                                                                                    g_obj_Encriptador.Desencriptar(mdl_GTD_ConexionBDExterna.clave), 
                                                                                                                                                    str_Tabla, 
                                                                                                                                                    dct_Etiqueta_Campo_CampoRelacionado, 
                                                                                                                                                    str_ClavesPrimarias);
                                            }
                                            //Conexion Interna
                                            else
                                            {
                                                mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo = g_obj_ConexionExterna_Datos.Creador_Consultas(Variables.G_STR_CONEXION_SERVIDOR, 
                                                                                                                                                    Variables.G_STR_CONEXION_BASEDATOS,
                                                                                                                                                    (Variables.G_STR_CONEXION_USUARIO != null && Variables.G_STR_CONEXION_USUARIO.Trim().Length > 0) ? true : false,
                                                                                                                                                    Variables.G_STR_CONEXION_USUARIO, 
                                                                                                                                                    Variables.G_STR_CONEXION_CLAVE, 
                                                                                                                                                    str_Tabla, 
                                                                                                                                                    dct_Etiqueta_Campo_CampoRelacionado, 
                                                                                                                                                    str_ClavesPrimarias);
                                            }

                                            if (mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo != null)
                                            {
                                                bool bol_TodosLosValoresNulos = true;

                                                //Valores
                                                for (int int_Contador = 1; int_Contador <= dct_Etiqueta_Campo_CampoRelacionado.Count; int_Contador++)
                                                {
                                                    AUX_EtiquetasCamposRelacionales_Modelo mdl_AUX_EtiquetasCamposRelacionales_Modelo = new AUX_EtiquetasCamposRelacionales_Modelo();

                                                    //idDocumentoTipo_Etiqueta
                                                    mdl_AUX_EtiquetasCamposRelacionales_Modelo.idDocumentoTipo_Etiqueta = (long)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("DocumentoTipoEtiqueta_Id_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null);

                                                    //Codigo
                                                    mdl_AUX_EtiquetasCamposRelacionales_Modelo.Codigo = (string)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("DocumentoTipoEtiqueta_Codigo_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null);

                                                    //Descripcion
                                                    mdl_AUX_EtiquetasCamposRelacionales_Modelo.Descripcion = (string)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("DocumentoTipoEtiqueta_Descripcion_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null);

                                                    //Valor
                                                    mdl_AUX_EtiquetasCamposRelacionales_Modelo.Valor = (string)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("Valor_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null);
                                                    if (mdl_AUX_EtiquetasCamposRelacionales_Modelo.Valor!=null && mdl_AUX_EtiquetasCamposRelacionales_Modelo.Valor.Trim().Length>0)
                                                    {
                                                        bol_TodosLosValoresNulos = false;
                                                    }

                                                    //Añadir al listado
                                                    lst_AUX_EtiquetasCamposRelacionales_Modelo_LISTADOFINAL.Add(mdl_AUX_EtiquetasCamposRelacionales_Modelo);

                                                    //MODEO DE BUSQUEDA ETIQUETA
                                                    GTD_Documentos_BusquedaEtiquetas mdl_GTD_Documentos_BusquedaEtiquetas = new GTD_Documentos_BusquedaEtiquetas();
                                                    mdl_GTD_Documentos_BusquedaEtiquetas.id = -1;
                                                    mdl_GTD_Documentos_BusquedaEtiquetas.porPlantilla = true;
                                                    mdl_GTD_Documentos_BusquedaEtiquetas.idDocumentoTipoEtiqueta = (long)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("DocumentoTipoEtiqueta_Id_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null);
                                                    mdl_GTD_Documentos_BusquedaEtiquetas.valor = (string)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("Valor_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null);

                                                    //Añadir al listado
                                                    lst_GTD_Documentos_BusquedaEtiquetas.Add(mdl_GTD_Documentos_BusquedaEtiquetas);

                                                    //AÑADIR CONTROL
                                                    List<object> lst_Argumentos = new List<object>();
                                                    lst_Argumentos.Add((long)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("DocumentoTipoEtiqueta_Id_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null));
                                                    lst_Argumentos.Add((string)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("DocumentoTipoEtiqueta_Codigo_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null));
                                                    lst_Argumentos.Add((string)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("DocumentoTipoEtiqueta_Descripcion_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null));
                                                    lst_Argumentos.Add(mdl_GTD_Documentos_BusquedaEtiquetas);
                                                    ((BackgroundWorker)sender).ReportProgress(2, lst_Argumentos);

                                                    //Añadir al listado de la ya utilizdas
                                                    lst_idDocumentoTipoEtiqueta.Add((long)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("DocumentoTipoEtiqueta_Id_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null));
                                                }

                                                if (bol_TodosLosValoresNulos)
                                                {
                                                    bol_ErroresAlBuscarEnBD = true;
                                                }
                                            }
                                            else
                                            {
                                                bol_ErroresAlBuscarEnBD = true;
                                            }
                                        }
                                    }

                                    //Actualizar Columna y Campo
                                    if(bol_ErroresAlBuscarEnBD)
                                    {
                                        mdl_INTERNO_DatosDocumento_Modelo.ErrorBD = bol_ErroresAlBuscarEnBD;

                                        List<object> lst_Argumentos_ErroresBD = new List<object>();
                                        lst_Argumentos_ErroresBD.Add(lng_idIdentificador);
                                        lst_Argumentos_ErroresBD.Add(bol_ErroresAlBuscarEnBD);
                                        ((BackgroundWorker)sender).ReportProgress(1, lst_Argumentos_ErroresBD);
                                    }
                                    #endregion

                                    string str_Valor_Devuelto = "";
                                    foreach (GTD_PlantillasDocumentosLineas mdl_GTD_PlantillasDocumentosLineas in mdl_INTERNO_DatosDocumento_Modelo.Plantilla.GTD_PlantillasDocumentosLineas)
                                    {
                                        if (mdl_INTERNO_DatosDocumento_Modelo.TipoDocumento.GTD_DocumentosTipos_Etiquetas != null &&
                                            mdl_INTERNO_DatosDocumento_Modelo.TipoDocumento.GTD_DocumentosTipos_Etiquetas.Count > 0)
                                        {
                                            //Buscar el DocumentoTipoEtiqueta
                                            GTD_DocumentosTipos_Etiquetas mdl_GTD_DocumentosTipos_Etiquetas = mdl_INTERNO_DatosDocumento_Modelo.TipoDocumento.GTD_DocumentosTipos_Etiquetas.Where(m => m.id == mdl_GTD_PlantillasDocumentosLineas.idDocumentoTipoEtiqueta.Value).FirstOrDefault();
                                            if (mdl_GTD_DocumentosTipos_Etiquetas != null)
                                            {
                                                //Buscar por si ya existe
                                                GTD_Documentos_BusquedaEtiquetas mdl_GTD_Documentos_BusquedaEtiquetas = null;
                                                if (lst_GTD_Documentos_BusquedaEtiquetas != null &&
                                                    lst_GTD_Documentos_BusquedaEtiquetas.Count > 0)
                                                {
                                                    mdl_GTD_Documentos_BusquedaEtiquetas = lst_GTD_Documentos_BusquedaEtiquetas.Where(m => m.idDocumentoTipoEtiqueta != null && m.idDocumentoTipoEtiqueta.Value.Equals(mdl_GTD_DocumentosTipos_Etiquetas.id) && m.porPlantilla).FirstOrDefault();
                                                }

                                                //Si no existe lo creo nuevo
                                                if (mdl_GTD_Documentos_BusquedaEtiquetas == null)
                                                {
                                                    //Ver si esta en las Relacioandas
                                                    if (lst_AUX_EtiquetasCamposRelacionales_Modelo_LISTADOFINAL != null &&
                                                        lst_AUX_EtiquetasCamposRelacionales_Modelo_LISTADOFINAL.Count > 0 &&
                                                        lst_AUX_EtiquetasCamposRelacionales_Modelo_LISTADOFINAL.Exists(m => m.idDocumentoTipo_Etiqueta == mdl_GTD_DocumentosTipos_Etiquetas.id))
                                                    {
                                                        str_Valor_Devuelto = lst_AUX_EtiquetasCamposRelacionales_Modelo_LISTADOFINAL.Where(m => m.idDocumentoTipo_Etiqueta == mdl_GTD_DocumentosTipos_Etiquetas.id).FirstOrDefault().Valor;
                                                    }
                                                    else
                                                    {
                                                        System.util.RectangleJ obj_RectangleJ_Elemento = new System.util.RectangleJ(float.Parse(mdl_GTD_PlantillasDocumentosLineas.posicionX_En_Documento), float.Parse(mdl_GTD_PlantillasDocumentosLineas.posicionY_En_Documento), float.Parse(mdl_GTD_PlantillasDocumentosLineas.ancho_En_Documento), float.Parse(mdl_GTD_PlantillasDocumentosLineas.alto_En_Documento));
                                                        RenderFilter[] arr_RenderFilter_Elemento = { new RegionTextRenderFilter(obj_RectangleJ_Elemento) };
                                                        ITextExtractionStrategy obj_ITextExtractionStrategy_Elemento = new FilteredTextRenderListener(new LocationTextExtractionStrategy(), arr_RenderFilter_Elemento);
                                                        str_Valor_Devuelto = PdfTextExtractor.GetTextFromPage(obj_PdfReader, (mdl_GTD_PlantillasDocumentosLineas.posicionDocumento_CabeceraPieOtra == Variables_GestionDocumental.G_INT_POSICIONDOCUMENTO_PIE ? obj_PdfReader.NumberOfPages : 1), obj_ITextExtractionStrategy_Elemento);

                                                        //Ver si tengo que limpiar el valor
                                                        if (mdl_GTD_PlantillasDocumentosLineas.limpiar != null && mdl_GTD_PlantillasDocumentosLineas.limpiar.Value)
                                                        {
                                                            str_Valor_Devuelto = Funciones_GestionDocumental.Limpiar_Valores_Etiquetas(str_Valor_Devuelto);
                                                        }

                                                        //Ver si tengo que quitarEspaciosEnBlanco el valor
                                                        if (mdl_GTD_PlantillasDocumentosLineas.quitarEspaciosEnBlanco != null && mdl_GTD_PlantillasDocumentosLineas.quitarEspaciosEnBlanco.Value)
                                                        {
                                                            str_Valor_Devuelto = Funciones_GestionDocumental.QuitarEspaciosEnBlanco_Valores_Etiquetas(str_Valor_Devuelto);
                                                        }
                                                    }

                                                    //MODEO DE BUSQUEDA ETIQUETA
                                                    mdl_GTD_Documentos_BusquedaEtiquetas = new GTD_Documentos_BusquedaEtiquetas();
                                                    mdl_GTD_Documentos_BusquedaEtiquetas.id = -1;
                                                    mdl_GTD_Documentos_BusquedaEtiquetas.porPlantilla = true;
                                                    mdl_GTD_Documentos_BusquedaEtiquetas.idDocumentoTipoEtiqueta = mdl_GTD_PlantillasDocumentosLineas.idDocumentoTipoEtiqueta.Value;
                                                    mdl_GTD_Documentos_BusquedaEtiquetas.valor = str_Valor_Devuelto;

                                                    //Añadir al listado
                                                    lst_GTD_Documentos_BusquedaEtiquetas.Add(mdl_GTD_Documentos_BusquedaEtiquetas);


                                                    //AÑADIR CONTROL
                                                    List<object> lst_Argumentos = new List<object>();
                                                    lst_Argumentos.Add(mdl_GTD_PlantillasDocumentosLineas.idDocumentoTipoEtiqueta.Value);
                                                    lst_Argumentos.Add(mdl_GTD_PlantillasDocumentosLineas.GTD_DocumentosTipos_Etiquetas.codigo);
                                                    lst_Argumentos.Add(mdl_GTD_PlantillasDocumentosLineas.GTD_DocumentosTipos_Etiquetas.descripcion);
                                                    lst_Argumentos.Add(mdl_GTD_Documentos_BusquedaEtiquetas);
                                                    ((BackgroundWorker)sender).ReportProgress(2, lst_Argumentos);

                                                    //Añadir al listado de la ya utilizdas
                                                    lst_idDocumentoTipoEtiqueta.Add(mdl_GTD_DocumentosTipos_Etiquetas.id);

                                                }
                                            }
                                        }
                                    }
                                }
                                #endregion


                                #region Etiquetas Sin Plantilla

                                #region Etiquetas
                                List<GTD_DocumentosTipos_Etiquetas> lst_GTD_DocumentosTipos_Etiquetas_SINETIQUETASPLANTILLA = mdl_INTERNO_DatosDocumento_Modelo.TipoDocumento.GTD_DocumentosTipos_Etiquetas.ToList();
                                if (lst_GTD_DocumentosTipos_Etiquetas_SINETIQUETASPLANTILLA.Count > 0)
                                {
                                    lst_GTD_DocumentosTipos_Etiquetas_SINETIQUETASPLANTILLA = lst_GTD_DocumentosTipos_Etiquetas_SINETIQUETASPLANTILLA.Where(m => !lst_idDocumentoTipoEtiqueta.Contains(m.id)).ToList();
                                }

                                foreach (GTD_DocumentosTipos_Etiquetas mdl_GTD_DocumentosTipos_Etiquetas in lst_GTD_DocumentosTipos_Etiquetas_SINETIQUETASPLANTILLA)
                                {
                                    //Buscar si tuviera algun valor la etiqueta
                                    GTD_Documentos_BusquedaEtiquetas mdl_GTD_Documentos_BusquedaEtiquetas = null;
                                    if (lst_GTD_Documentos_BusquedaEtiquetas != null &&
                                        lst_GTD_Documentos_BusquedaEtiquetas.Count > 0)
                                    {
                                        mdl_GTD_Documentos_BusquedaEtiquetas = lst_GTD_Documentos_BusquedaEtiquetas.Where(m => m.idDocumentoTipoEtiqueta != null && m.idDocumentoTipoEtiqueta.Value.Equals(mdl_GTD_DocumentosTipos_Etiquetas.id)).FirstOrDefault();
                                    }

                                    //Listado de Argumentos
                                    List<object> lst_Argumentos = new List<object>();

                                    lst_Argumentos.Add(mdl_GTD_DocumentosTipos_Etiquetas.id);
                                    lst_Argumentos.Add(mdl_GTD_DocumentosTipos_Etiquetas.codigo);
                                    lst_Argumentos.Add(mdl_GTD_DocumentosTipos_Etiquetas.descripcion);
                                    lst_Argumentos.Add(mdl_GTD_Documentos_BusquedaEtiquetas);

                                    ((BackgroundWorker)sender).ReportProgress(2, lst_Argumentos);

                                }
                                #endregion
                                #endregion

                                //Añadir al diccionario si no existiera
                                if (lst_GTD_Documentos_BusquedaEtiquetas.Count > 0)
                                {
                                    if (!g_dct_DocumentosEtiquetas.ContainsKey(lng_idIdentificador))
                                    {
                                        g_dct_DocumentosEtiquetas.Add(lng_idIdentificador, lst_GTD_Documentos_BusquedaEtiquetas);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(TareaAsincrona_RellenarListado_Etiquetas_Inicial_DoWork));
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(TareaAsincrona_RellenarListado_Etiquetas_Inicial_DoWork));
            }
            finally
            {
                if (obj_PdfReader != null)
                {
                    obj_PdfReader.Close();
                }
            }
        }
        private void TareaAsincrona_RellenarListado_Etiquetas_Inicial_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                if (e.ProgressPercentage == 1)
                {
                    List<object> lst_Argumentos = (List<object>)e.UserState;

                    //Actualizar el DatagridView
                    DataGridViewRow dgvr_Actualizar = g_frm_P_AlmacenarDocumentos.Exferia_DataGridView_Documentos.Rows
                                     .Cast<DataGridViewRow>()
                                     .Where(r => r.Cells[g_int_PosicionColumna_Identificador].Value.Equals(lst_Argumentos[0])).FirstOrDefault();

                    if (dgvr_Actualizar != null)//Modificada
                    {
                        //Actualizar el Grid
                        if ((bool)lst_Argumentos[1])
                        {
                            dgvr_Actualizar.Cells[g_int_PosicionColumna_ErrorBD].Value = "X";
                        }
                        else
                        {
                            dgvr_Actualizar.Cells[g_int_PosicionColumna_ErrorBD].Value = "";
                        }
                    }
                }
                else
                {
                    List<object> lst_Argumentos = (List<object>)e.UserState;
                    Crear_Etiquetas_Linea((long)lst_Argumentos[0],
                                            (string)lst_Argumentos[1],
                                            (string)lst_Argumentos[2],
                                            (GTD_Documentos_BusquedaEtiquetas)lst_Argumentos[3]);
                }
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_RellenarListado_Etiquetas_Inicial_Completed(object sender, RunWorkerCompletedEventArgs e)
        { }
        #endregion

        #region Rellenar Listado
        public void RellenarListado_Etiquetas(long _lng_idIdentificador)
        {
            try
            {
                // Si la tarea asincrona esta en marcha la paro
                if (g_obj_TareaAsincrona_RellenarListadoEtiquetas != null)
                {
                    while (g_obj_TareaAsincrona_RellenarListadoEtiquetas.IsBusy)
                        System.Windows.Forms.Application.DoEvents();
                }
                else
                {
                    g_obj_TareaAsincrona_RellenarListadoEtiquetas = new BackgroundWorker();
                    g_obj_TareaAsincrona_RellenarListadoEtiquetas.DoWork += new DoWorkEventHandler(TareaAsincrona_RellenarListado_Etiquetas_DoWork);
                    g_obj_TareaAsincrona_RellenarListadoEtiquetas.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_RellenarListado_Etiquetas_ProgressChanged);
                    g_obj_TareaAsincrona_RellenarListadoEtiquetas.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_RellenarListado_Etiquetas_Completed);
                    g_obj_TareaAsincrona_RellenarListadoEtiquetas.WorkerReportsProgress = true;
                }

                //Vaciar el listado
                g_frm_P_AlmacenarDocumentos.Exferia_Panel_Degradado_Etiquetas.Controls.Clear();
                g_int_Etiquetas_PosicionY = 5;
                g_int_NumeroLineas_Etiquetas = 0;
                g_lst_ListadoLineas_Etiquetas.Clear();

                //Argumentos
                List<object> lst_Argumentos = new List<object>();
                lst_Argumentos.Add(_lng_idIdentificador);

                //(Tarea Asincrona) ##################################################################
                g_obj_TareaAsincrona_RellenarListadoEtiquetas.RunWorkerAsync(lst_Argumentos);
                //#################################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(RellenarListado_Etiquetas));
            }
        }
        private void TareaAsincrona_RellenarListado_Etiquetas_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                List<object> lst_Argumentos_Entrada = (List<object>)e.Argument;

                long lng_idIdentificador = (long)lst_Argumentos_Entrada[0];

                if (lng_idIdentificador > -1)
                {
                    //Buscar  la linea
                    INTERNO_DatosDocumento_Modelo mdl_INTERNO_DatosDocumento_Modelo = g_lst_INTERNO_DatosDocumento_Modelo.Where(m => m.Indentificador == lng_idIdentificador).FirstOrDefault();
                    if (mdl_INTERNO_DatosDocumento_Modelo != null && mdl_INTERNO_DatosDocumento_Modelo.Separado != 1)
                    {
                        if (mdl_INTERNO_DatosDocumento_Modelo.Documento_PDF != null)
                        {
                            if (mdl_INTERNO_DatosDocumento_Modelo.TipoDocumento != null)
                            {
                                //Tipos Existentes
                                List<GTD_Documentos_BusquedaEtiquetas> lst_GTD_Documentos_BusquedaEtiquetas = null;
                                if (g_dct_DocumentosEtiquetas.ContainsKey(lng_idIdentificador))
                                {
                                    lst_GTD_Documentos_BusquedaEtiquetas = g_dct_DocumentosEtiquetas[lng_idIdentificador];
                                }
                                if (lst_GTD_Documentos_BusquedaEtiquetas == null)
                                {
                                    lst_GTD_Documentos_BusquedaEtiquetas = new List<GTD_Documentos_BusquedaEtiquetas>();
                                }

                                List<long> lst_idDocumentoTipoEtiqueta = new List<long>();

                                #region Etiquetas de Plantilla
                                if (mdl_INTERNO_DatosDocumento_Modelo.Plantilla != null)
                                {                                   
                                    if (mdl_INTERNO_DatosDocumento_Modelo.TipoDocumento.GTD_DocumentosTipos_Etiquetas != null &&
                                        mdl_INTERNO_DatosDocumento_Modelo.TipoDocumento.GTD_DocumentosTipos_Etiquetas.Count > 0)
                                    {
                                        foreach (GTD_DocumentosTipos_Etiquetas mdl_GTD_DocumentosTipos_Etiquetas in mdl_INTERNO_DatosDocumento_Modelo.TipoDocumento.GTD_DocumentosTipos_Etiquetas)
                                        {
                                            //Buscar por si ya existe
                                            GTD_Documentos_BusquedaEtiquetas mdl_GTD_Documentos_BusquedaEtiquetas = null;
                                            if (lst_GTD_Documentos_BusquedaEtiquetas != null &&
                                                lst_GTD_Documentos_BusquedaEtiquetas.Count > 0)
                                            {
                                                mdl_GTD_Documentos_BusquedaEtiquetas = lst_GTD_Documentos_BusquedaEtiquetas.Where(m => m.idDocumentoTipoEtiqueta != null && m.idDocumentoTipoEtiqueta.Value.Equals(mdl_GTD_DocumentosTipos_Etiquetas.id) && m.porPlantilla).FirstOrDefault();
                                            }

                                            //Si no existe lo creo nuevo
                                            if (mdl_GTD_Documentos_BusquedaEtiquetas != null)
                                            {
                                                    
                                                //AÑADIR CONTROL
                                                List<object> lst_Argumentos = new List<object>();
                                                lst_Argumentos.Add(mdl_GTD_DocumentosTipos_Etiquetas.id);
                                                lst_Argumentos.Add(mdl_GTD_DocumentosTipos_Etiquetas.codigo);
                                                lst_Argumentos.Add(mdl_GTD_DocumentosTipos_Etiquetas.descripcion);
                                                lst_Argumentos.Add(mdl_GTD_Documentos_BusquedaEtiquetas);
                                                ((BackgroundWorker)sender).ReportProgress(2, lst_Argumentos);

                                                //Ya utilizada
                                                lst_idDocumentoTipoEtiqueta.Add(mdl_GTD_DocumentosTipos_Etiquetas.id);

                                            }
                                        }
                                    }
                                }
                                #endregion


                                #region Etiquetas Sin Plantilla
                                List<GTD_DocumentosTipos_Etiquetas> lst_GTD_DocumentosTipos_Etiquetas_SINETIQUETASPLANTILLA = mdl_INTERNO_DatosDocumento_Modelo.TipoDocumento.GTD_DocumentosTipos_Etiquetas.ToList();
                                if (lst_GTD_DocumentosTipos_Etiquetas_SINETIQUETASPLANTILLA.Count > 0)
                                {
                                    lst_GTD_DocumentosTipos_Etiquetas_SINETIQUETASPLANTILLA = lst_GTD_DocumentosTipos_Etiquetas_SINETIQUETASPLANTILLA.Where(m => !lst_idDocumentoTipoEtiqueta.Contains(m.id)).ToList();
                                }

                                foreach (GTD_DocumentosTipos_Etiquetas mdl_GTD_DocumentosTipos_Etiquetas in lst_GTD_DocumentosTipos_Etiquetas_SINETIQUETASPLANTILLA)
                                {
                                    //Buscar si tuviera algun valor la etiqueta
                                    GTD_Documentos_BusquedaEtiquetas mdl_GTD_Documentos_BusquedaEtiquetas = null;
                                    if (lst_GTD_Documentos_BusquedaEtiquetas != null &&
                                        lst_GTD_Documentos_BusquedaEtiquetas.Count > 0)
                                    {
                                        mdl_GTD_Documentos_BusquedaEtiquetas = lst_GTD_Documentos_BusquedaEtiquetas.Where(m => m.idDocumentoTipoEtiqueta != null && m.idDocumentoTipoEtiqueta.Value.Equals(mdl_GTD_DocumentosTipos_Etiquetas.id)).FirstOrDefault();
                                    }

                                    //Listado de Argumentos
                                    List<object> lst_Argumentos = new List<object>();
                                    lst_Argumentos.Add(mdl_GTD_DocumentosTipos_Etiquetas.id);
                                    lst_Argumentos.Add(mdl_GTD_DocumentosTipos_Etiquetas.codigo);
                                    lst_Argumentos.Add(mdl_GTD_DocumentosTipos_Etiquetas.descripcion);
                                    lst_Argumentos.Add(mdl_GTD_Documentos_BusquedaEtiquetas);

                                    ((BackgroundWorker)sender).ReportProgress(2, lst_Argumentos);

                                }
                                #endregion
                            }
                        }
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(TareaAsincrona_RellenarListado_Etiquetas_DoWork));
            }
            catch (Control_Errores)
            {}
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(TareaAsincrona_RellenarListado_Etiquetas_DoWork));
            }
        }
        private void TareaAsincrona_RellenarListado_Etiquetas_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                if (e.ProgressPercentage==1)
                {
                    List<object> lst_Argumentos = (List<object>)e.UserState;

                    //Actualizar el DatagridView
                    DataGridViewRow dgvr_Actualizar = g_frm_P_AlmacenarDocumentos.Exferia_DataGridView_Documentos.Rows
                                     .Cast<DataGridViewRow>()
                                     .Where(r => r.Cells[g_int_PosicionColumna_Identificador].Value.Equals(lst_Argumentos[0])).FirstOrDefault();

                    if (dgvr_Actualizar != null)//Modificada
                    {
                        //Actualizar el Grid
                        if ((bool)lst_Argumentos[1])
                        {
                            dgvr_Actualizar.Cells[g_int_PosicionColumna_ErrorBD].Value = "X";
                        }
                        else
                        {
                            dgvr_Actualizar.Cells[g_int_PosicionColumna_ErrorBD].Value = "";
                        }
                    }
                }
                else
                {
                    List<object> lst_Argumentos = (List<object>)e.UserState; 
                    Crear_Etiquetas_Linea((long)lst_Argumentos[0],
                                            (string)lst_Argumentos[1],
                                            (string)lst_Argumentos[2],
                                            (GTD_Documentos_BusquedaEtiquetas)lst_Argumentos[3]);
                }
               
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_RellenarListado_Etiquetas_Completed(object sender, RunWorkerCompletedEventArgs e)
        { }
        #endregion

        public void Crear_Etiquetas_Linea(long _lng_idDocumentoTipoEtiqueta,string _str_Codigo,string _str_Descripcion, GTD_Documentos_BusquedaEtiquetas _mdl_GTD_Documentos_BusquedaEtiquetas)
        {
            try
            {
                //Añadir control creado en subproceso en el hilo principal ........................
                if (g_frm_P_AlmacenarDocumentos.InvokeRequired)
                {
                    g_frm_P_AlmacenarDocumentos.Invoke((MethodInvoker)delegate
                    {
                        Crear_Etiquetas_Linea(_lng_idDocumentoTipoEtiqueta, _str_Codigo, _str_Descripcion,_mdl_GTD_Documentos_BusquedaEtiquetas);
                    });
                    return;
                }


                g_int_NumeroLineas_Etiquetas += 1;

                //Calcular tamaño del panel ##########################
                int int_AnchopanelPrincipal = (422 * g_frm_P_AlmacenarDocumentos.Exferia_Panel_Degradado_Etiquetas.Width) / 428;
                if (g_frm_P_AlmacenarDocumentos.Exferia_Panel_Degradado_Etiquetas.Controls != null && g_frm_P_AlmacenarDocumentos.Exferia_Panel_Degradado_Etiquetas.Controls.Count > 0 && g_lst_ListadoLineas_Etiquetas.Count > 0)
                {
                    int_AnchopanelPrincipal = g_frm_P_AlmacenarDocumentos.Exferia_Panel_Degradado_Etiquetas.Controls.Find("controlusuario_CTU_P_AlmacenarDocumentos_Etiquetas" + g_lst_ListadoLineas_Etiquetas[0], false).FirstOrDefault().Width;
                }


                //Objeto Personalizado ....................................................................................
                int int_posicionRelativa = g_int_Etiquetas_PosicionY + g_frm_P_AlmacenarDocumentos.Exferia_Panel_Degradado_Etiquetas.DisplayRectangle.Y;
                CTU_P_AlmacenarDocumentos_Etiquetas controlusuario_CTU_P_AlmacenarDocumentos_Etiquetas = new CTU_P_AlmacenarDocumentos_Etiquetas(g_frm_P_AlmacenarDocumentos, _lng_idDocumentoTipoEtiqueta,_str_Codigo, _str_Descripcion, _mdl_GTD_Documentos_BusquedaEtiquetas);
                controlusuario_CTU_P_AlmacenarDocumentos_Etiquetas.Name = "controlusuario_CTU_P_AlmacenarDocumentos_Etiquetas" + g_int_NumeroLineas_Etiquetas;
                controlusuario_CTU_P_AlmacenarDocumentos_Etiquetas.Size = new Size(int_AnchopanelPrincipal, 28);
                controlusuario_CTU_P_AlmacenarDocumentos_Etiquetas.Location = new System.Drawing.Point(5, int_posicionRelativa);
                controlusuario_CTU_P_AlmacenarDocumentos_Etiquetas.Anchor = (AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Left);
                controlusuario_CTU_P_AlmacenarDocumentos_Etiquetas.CTU_P_AlmacenarDocumentos_Etiquetas_ValorActualizado += new System.EventHandler<INTERNO_EventArgs_CuatroValores>(Etiquetas_ValorActualizado_Desde_ControlUsuario);
                //...........................................................................................

                //Añadir al panel Principal
                g_int_Etiquetas_PosicionY += 28 + 5;
                g_frm_P_AlmacenarDocumentos.Exferia_Panel_Degradado_Etiquetas.Controls.Add(controlusuario_CTU_P_AlmacenarDocumentos_Etiquetas);

                g_lst_ListadoLineas_Etiquetas.Add(g_int_NumeroLineas_Etiquetas);
                
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(Crear_Etiquetas_Linea));
            }
        }

        private void Etiquetas_ValorActualizado_Desde_ControlUsuario(object sender, INTERNO_EventArgs_CuatroValores _mdl_INTERNO_EventArgs_CuatroValores)
        {
            try
            {
                if (g_lng_Identificador_Seleccionado>-1)
                {
                    List<GTD_Documentos_BusquedaEtiquetas> lst_GTD_Documentos_BusquedaEtiquetas = null;
                    if (g_dct_DocumentosEtiquetas.ContainsKey(g_lng_Identificador_Seleccionado))
                    {
                        lst_GTD_Documentos_BusquedaEtiquetas = g_dct_DocumentosEtiquetas[g_lng_Identificador_Seleccionado];
                    }
                    if (lst_GTD_Documentos_BusquedaEtiquetas == null)
                    {
                        lst_GTD_Documentos_BusquedaEtiquetas = new List<GTD_Documentos_BusquedaEtiquetas>();
                    }

                    //Etiqueta 
                    
                    //Almacenar si no lo estuviera ya
                    if (lst_GTD_Documentos_BusquedaEtiquetas.Exists(m => m.idDocumentoTipoEtiqueta!=null && m.idDocumentoTipoEtiqueta.Value == long.Parse(_mdl_INTERNO_EventArgs_CuatroValores.AUX_1)))
                    {
                        //Borrar registro
                        if (_mdl_INTERNO_EventArgs_CuatroValores.AUX_3.Trim().Length == 0)
                        {
                            lst_GTD_Documentos_BusquedaEtiquetas.RemoveAll(m => m.idDocumentoTipoEtiqueta == long.Parse(_mdl_INTERNO_EventArgs_CuatroValores.AUX_1));
                        }
                        //Actualizar valor
                        else
                        {
                            lst_GTD_Documentos_BusquedaEtiquetas[lst_GTD_Documentos_BusquedaEtiquetas.IndexOf(lst_GTD_Documentos_BusquedaEtiquetas.Where(m => m.idDocumentoTipoEtiqueta!=null && m.idDocumentoTipoEtiqueta == long.Parse(_mdl_INTERNO_EventArgs_CuatroValores.AUX_1)).FirstOrDefault())].valor = _mdl_INTERNO_EventArgs_CuatroValores.AUX_3;
                        }
                    }
                    //Añadir
                    else
                    {
                        GTD_Documentos_BusquedaEtiquetas mdl_GTD_Documentos_BusquedaEtiquetas = new GTD_Documentos_BusquedaEtiquetas();
                        mdl_GTD_Documentos_BusquedaEtiquetas.id = -1;
                        mdl_GTD_Documentos_BusquedaEtiquetas.idDocumentoTipoEtiqueta = long.Parse(_mdl_INTERNO_EventArgs_CuatroValores.AUX_1);
                        mdl_GTD_Documentos_BusquedaEtiquetas.valor = _mdl_INTERNO_EventArgs_CuatroValores.AUX_3;
                        mdl_GTD_Documentos_BusquedaEtiquetas.porPlantilla = bool.Parse(_mdl_INTERNO_EventArgs_CuatroValores.AUX_4);

                        //Añadir al listado
                        lst_GTD_Documentos_BusquedaEtiquetas.Add(mdl_GTD_Documentos_BusquedaEtiquetas);
                    }
                    

                    // Si el listado esta vacio,borro el Diccionario
                    if (lst_GTD_Documentos_BusquedaEtiquetas.Count == 0)
                    {
                        g_dct_DocumentosEtiquetas.Remove(g_lng_Identificador_Seleccionado);
                    }
                    else
                    {
                        //Actualizo
                        if (g_dct_DocumentosEtiquetas.ContainsKey(g_lng_Identificador_Seleccionado))
                        {
                            g_dct_DocumentosEtiquetas[g_lng_Identificador_Seleccionado]= lst_GTD_Documentos_BusquedaEtiquetas;
                        }
                        //Inserto
                        else
                        {
                            g_dct_DocumentosEtiquetas.Add(g_lng_Identificador_Seleccionado, lst_GTD_Documentos_BusquedaEtiquetas);
                        }
                    }

                    //Saber si el documento tiene todos los datos necesarios rellenos
                    Listado_Actualizar_FaltanDatos(g_lng_Identificador_Seleccionado);
                }
            }
            catch(Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(Etiquetas_ValorActualizado_Desde_ControlUsuario));
            }
        }

        #region Recargar Listado Etiquetas
        public void RecargarListado_Etiquetas(long _lng_idIdentificador)
        {
            try
            {
                // Si la tarea asincrona esta en marcha la paro
                if (g_obj_TareaAsincrona_RecargarListadoEtiquetas != null)
                {
                    while (g_obj_TareaAsincrona_RecargarListadoEtiquetas.IsBusy)
                        System.Windows.Forms.Application.DoEvents();
                }
                else
                {
                    g_obj_TareaAsincrona_RecargarListadoEtiquetas = new BackgroundWorker();
                    g_obj_TareaAsincrona_RecargarListadoEtiquetas.DoWork += new DoWorkEventHandler(TareaAsincrona_RecargarListado_Etiquetas_DoWork);
                    g_obj_TareaAsincrona_RecargarListadoEtiquetas.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_RecargarListado_Etiquetas_Completed);
                    g_obj_TareaAsincrona_RecargarListadoEtiquetas.WorkerReportsProgress = true;
                }

                //Argumentos
                List<object> lst_Argumentos = new List<object>();
                lst_Argumentos.Add(_lng_idIdentificador);

                //(Tarea Asincrona) ##################################################################
                g_obj_TareaAsincrona_RecargarListadoEtiquetas.RunWorkerAsync(lst_Argumentos);
                //#################################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(RecargarListado_Etiquetas));
            }
        }
        private void TareaAsincrona_RecargarListado_Etiquetas_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                List<object> lst_Argumentos_Entrada = (List<object>)e.Argument;

                long lng_idIdentificador = (long)lst_Argumentos_Entrada[0];

                if (lng_idIdentificador > -1)
                {
                    //Buscar  la linea
                    INTERNO_DatosDocumento_Modelo mdl_INTERNO_DatosDocumento_Modelo = g_lst_INTERNO_DatosDocumento_Modelo.Where(m => m.Indentificador == lng_idIdentificador).FirstOrDefault();
                    if (mdl_INTERNO_DatosDocumento_Modelo != null && mdl_INTERNO_DatosDocumento_Modelo.Separado != 1)
                    {
                        if (mdl_INTERNO_DatosDocumento_Modelo.Documento_PDF != null)
                        {
                            if (mdl_INTERNO_DatosDocumento_Modelo.TipoDocumento != null)
                            {
                                if (mdl_INTERNO_DatosDocumento_Modelo.Plantilla != null)
                                {
                                    bool bol_ErroresAlBuscarEnBD = false;

                                    #region Campos Relacionados
                                    List<AUX_EtiquetasCamposRelacionales_Modelo> lst_AUX_EtiquetasCamposRelacionales_Modelo_LISTADOFINAL = new List<AUX_EtiquetasCamposRelacionales_Modelo>();

                                    if (mdl_INTERNO_DatosDocumento_Modelo.Plantilla.GTD_PlantillasDocumentosLineas != null && mdl_INTERNO_DatosDocumento_Modelo.Plantilla.GTD_PlantillasDocumentosLineas.Count > 0)
                                    {
                                        //Crear Consulta para obtener Valores
                                        string str_Tabla = "";
                                        string str_ServidorBaseDatosTabla_OLD = "";
                                        string str_ServidorBaseDatosTabla = "";

                                        GTD_ConexionBDExterna mdl_GTD_ConexionBDExterna = null;
                                        string str_ClavesPrimarias = "";
                                        long lng_idDocumentoTipo_Etiqueta = -1;
                                        Dictionary<GTD_DocumentosTipos_Etiquetas, AUX_CampoTipo_Modelo> dct_Etiqueta_Campo_CampoRelacionado = new Dictionary<GTD_DocumentosTipos_Etiquetas, AUX_CampoTipo_Modelo>();

                                        foreach (GTD_DocumentosTipos_CamposRelacionales mdl_GTD_DocumentosTipos_CamposRelacionales in mdl_INTERNO_DatosDocumento_Modelo.TipoDocumento.GTD_DocumentosTipos_CamposRelacionales.OrderBy(n => n.orden))
                                        {
                                            lng_idDocumentoTipo_Etiqueta = mdl_GTD_DocumentosTipos_CamposRelacionales.idDocumentoTipo_Etiqueta;

                                            if (mdl_GTD_DocumentosTipos_CamposRelacionales.idConexionBDExterna != null)
                                            {
                                                str_ServidorBaseDatosTabla = mdl_GTD_DocumentosTipos_CamposRelacionales.GTD_ConexionBDExterna.servidor + "|" + mdl_GTD_DocumentosTipos_CamposRelacionales.GTD_ConexionBDExterna.baseDatos + "|" + mdl_GTD_DocumentosTipos_CamposRelacionales.tabla;
                                            }
                                            else
                                            {
                                                str_ServidorBaseDatosTabla = "ConexionInterna|" + mdl_GTD_DocumentosTipos_CamposRelacionales.tabla;
                                            }

                                            //Si cambio de Tabla
                                            if (str_ServidorBaseDatosTabla_OLD != "" && str_ServidorBaseDatosTabla != str_ServidorBaseDatosTabla_OLD)
                                            {
                                                str_ClavesPrimarias = str_ClavesPrimarias.Substring(0, str_ClavesPrimarias.Length - 4);
                                                AUX_EtiquetasCamposRelacionales_Valores_Modelo mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo = null;
                                                //Conexion Externa
                                                if (mdl_GTD_ConexionBDExterna != null)
                                                {
                                                    mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo = g_obj_ConexionExterna_Datos.Creador_Consultas(mdl_GTD_ConexionBDExterna.servidor,
                                                                                                                                                        mdl_GTD_ConexionBDExterna.baseDatos,
                                                                                                                                                        mdl_GTD_ConexionBDExterna.tieneUsuario,
                                                                                                                                                        mdl_GTD_ConexionBDExterna.usuario,
                                                                                                                                                        g_obj_Encriptador.Desencriptar(mdl_GTD_ConexionBDExterna.clave),
                                                                                                                                                        str_Tabla,
                                                                                                                                                        dct_Etiqueta_Campo_CampoRelacionado,
                                                                                                                                                        str_ClavesPrimarias);
                                                }
                                                //Conexion Interna
                                                else
                                                {
                                                    mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo = g_obj_ConexionExterna_Datos.Creador_Consultas(Variables.G_STR_CONEXION_SERVIDOR, Variables.G_STR_CONEXION_BASEDATOS, (Variables.G_STR_CONEXION_USUARIO != null && Variables.G_STR_CONEXION_USUARIO.Trim().Length > 0) ? true : false, Variables.G_STR_CONEXION_USUARIO, Variables.G_STR_CONEXION_CLAVE, str_Tabla, dct_Etiqueta_Campo_CampoRelacionado, str_ClavesPrimarias);
                                                }

                                                if (mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo != null)
                                                {
                                                    //Valores
                                                    List<GTD_Documentos_BusquedaEtiquetas> lst_GTD_Documentos_BusquedaEtiquetas = g_dct_DocumentosEtiquetas[lng_idIdentificador];
                                                    if (lst_GTD_Documentos_BusquedaEtiquetas != null && lst_GTD_Documentos_BusquedaEtiquetas.Count > 0)
                                                    {
                                                        //Valores
                                                        long lng_idDocumentoTipo_Etiqueta_AUX = -1;
                                                        string str_Valor = "";
                                                        bool bol_TodosLosValoresNulos = true;

                                                        for (int int_Contador = 1; int_Contador <= dct_Etiqueta_Campo_CampoRelacionado.Count; int_Contador++)
                                                        {
                                                            lng_idDocumentoTipo_Etiqueta_AUX = (long)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("DocumentoTipoEtiqueta_Id_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null);
                                                            str_Valor = (string)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("Valor_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null);
                                                            if (str_Valor != null && str_Valor.Trim().Length > 0)
                                                            {
                                                                bol_TodosLosValoresNulos = false;
                                                            }

                                                            //ACTUALIZAR LISTADO EN MEMORIA
                                                            foreach (GTD_Documentos_BusquedaEtiquetas mdl_GTD_Documentos_BusquedaEtiquetas in lst_GTD_Documentos_BusquedaEtiquetas)
                                                            {
                                                                if (lng_idDocumentoTipo_Etiqueta_AUX == mdl_GTD_Documentos_BusquedaEtiquetas.idDocumentoTipoEtiqueta)
                                                                {
                                                                    //Valor
                                                                    mdl_GTD_Documentos_BusquedaEtiquetas.valor = str_Valor;

                                                                    break;
                                                                }
                                                            }

                                                            //ACTUALIAZR ETIQUETA
                                                            CTU_P_AlmacenarDocumentos_Etiquetas controlsuario_CTU_P_AlmacenarDocumentos_Etiquetas = null;
                                                            foreach (int int_Etiquetas in g_lst_ListadoLineas_Etiquetas)
                                                            {
                                                                controlsuario_CTU_P_AlmacenarDocumentos_Etiquetas = (CTU_P_AlmacenarDocumentos_Etiquetas)g_frm_P_AlmacenarDocumentos.Exferia_Panel_Degradado_Etiquetas.Controls.Find("controlusuario_CTU_P_AlmacenarDocumentos_Etiquetas" + int_Etiquetas, false).FirstOrDefault();
                                                                if (controlsuario_CTU_P_AlmacenarDocumentos_Etiquetas != null &&
                                                                    controlsuario_CTU_P_AlmacenarDocumentos_Etiquetas.g_lng_idDocumentoTipoEtiqueta == lng_idDocumentoTipo_Etiqueta_AUX)
                                                                {
                                                                    controlsuario_CTU_P_AlmacenarDocumentos_Etiquetas.Actualizar_Valor(str_Valor, true);
                                                                    break;
                                                                }
                                                            }
                                                        }

                                                        if (bol_TodosLosValoresNulos)
                                                        {
                                                            bol_ErroresAlBuscarEnBD = true;
                                                        }
                                                    }

                                                    //Vaciar
                                                    str_ClavesPrimarias = "";
                                                    dct_Etiqueta_Campo_CampoRelacionado.Clear();
                                                    mdl_GTD_ConexionBDExterna = null;
                                                }
                                                else
                                                {
                                                    bol_ErroresAlBuscarEnBD = true;
                                                }
                                            }

                                            //Clave Primaria
                                            if (mdl_GTD_DocumentosTipos_CamposRelacionales.tipo.ToString() == Variables_GestionDocumental.G_MDL_TIPOCAMPOBASEDATOSPARACONSULTA_CLAVEPRIMARIA.Codigo)
                                            {
                                                if (g_lst_ListadoLineas_Etiquetas != null && g_lst_ListadoLineas_Etiquetas.Count > 0)
                                                {
                                                    CTU_P_AlmacenarDocumentos_Etiquetas controlsuario_CTU_P_AlmacenarDocumentos_Etiquetas = null;
                                                    foreach (int int_Etiquetas in g_lst_ListadoLineas_Etiquetas)
                                                    {
                                                        controlsuario_CTU_P_AlmacenarDocumentos_Etiquetas = (CTU_P_AlmacenarDocumentos_Etiquetas)g_frm_P_AlmacenarDocumentos.Exferia_Panel_Degradado_Etiquetas.Controls.Find("controlusuario_CTU_P_AlmacenarDocumentos_Etiquetas" + int_Etiquetas, false).FirstOrDefault();
                                                        if (controlsuario_CTU_P_AlmacenarDocumentos_Etiquetas != null &&
                                                            controlsuario_CTU_P_AlmacenarDocumentos_Etiquetas.g_lng_idDocumentoTipoEtiqueta == lng_idDocumentoTipo_Etiqueta &&
                                                            controlsuario_CTU_P_AlmacenarDocumentos_Etiquetas.CTU_P_AlmacenarDocumentos_Etiquetas_Valor.Trim().Length > 0)
                                                        {
                                                            str_ClavesPrimarias += mdl_GTD_DocumentosTipos_CamposRelacionales.tabla + "." + mdl_GTD_DocumentosTipos_CamposRelacionales.campo + "='" + controlsuario_CTU_P_AlmacenarDocumentos_Etiquetas.CTU_P_AlmacenarDocumentos_Etiquetas_Valor.Trim() + "' and ";
                                                            break;
                                                        }
                                                    }
                                                }
                                            }
                                            //Consulta
                                            else if (mdl_GTD_DocumentosTipos_CamposRelacionales.tipo.ToString() == Variables_GestionDocumental.G_MDL_TIPOCAMPOBASEDATOSPARACONSULTA_CONSULTA.Codigo)
                                            {
                                                dct_Etiqueta_Campo_CampoRelacionado.Add(mdl_GTD_DocumentosTipos_CamposRelacionales.GTD_DocumentosTipos_Etiquetas, new AUX_CampoTipo_Modelo(mdl_GTD_DocumentosTipos_CamposRelacionales.tabla + "." + mdl_GTD_DocumentosTipos_CamposRelacionales.campo, mdl_GTD_DocumentosTipos_CamposRelacionales.tipoCampo));
                                            }

                                            //Almacenar para ver cuando cambia de tabla y se busca en BD ##############################################################
                                            if (mdl_GTD_DocumentosTipos_CamposRelacionales.idConexionBDExterna != null)
                                            {
                                                mdl_GTD_ConexionBDExterna = mdl_GTD_DocumentosTipos_CamposRelacionales.GTD_ConexionBDExterna;
                                                str_ServidorBaseDatosTabla_OLD = mdl_GTD_DocumentosTipos_CamposRelacionales.GTD_ConexionBDExterna.servidor + "|" + mdl_GTD_DocumentosTipos_CamposRelacionales.GTD_ConexionBDExterna.baseDatos + "|" + mdl_GTD_DocumentosTipos_CamposRelacionales.tabla;
                                            }
                                            else
                                            {
                                                mdl_GTD_ConexionBDExterna = null;
                                                str_ServidorBaseDatosTabla_OLD = "ConexionInterna|" + mdl_GTD_DocumentosTipos_CamposRelacionales.tabla;
                                            }

                                            str_Tabla = mdl_GTD_DocumentosTipos_CamposRelacionales.tabla;
                                        }


                                        #region Si cambio de Tabla
                                        if (str_ServidorBaseDatosTabla_OLD != "")
                                        {
                                            str_ClavesPrimarias = str_ClavesPrimarias.Substring(0, str_ClavesPrimarias.Length - 4);
                                            AUX_EtiquetasCamposRelacionales_Valores_Modelo mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo = null;
                                            //Conexion Externa
                                            if (mdl_GTD_ConexionBDExterna != null)
                                            {
                                                mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo = g_obj_ConexionExterna_Datos.Creador_Consultas(mdl_GTD_ConexionBDExterna.servidor,
                                                                                                                                                    mdl_GTD_ConexionBDExterna.baseDatos,
                                                                                                                                                    mdl_GTD_ConexionBDExterna.tieneUsuario,
                                                                                                                                                    mdl_GTD_ConexionBDExterna.usuario,
                                                                                                                                                    g_obj_Encriptador.Desencriptar(mdl_GTD_ConexionBDExterna.clave),
                                                                                                                                                    str_Tabla,
                                                                                                                                                    dct_Etiqueta_Campo_CampoRelacionado,
                                                                                                                                                    str_ClavesPrimarias);
                                            }
                                            //Conexion Interna
                                            else
                                            {
                                                mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo = g_obj_ConexionExterna_Datos.Creador_Consultas(Variables.G_STR_CONEXION_SERVIDOR,
                                                                                                                                                    Variables.G_STR_CONEXION_BASEDATOS,
                                                                                                                                                    (Variables.G_STR_CONEXION_USUARIO != null && Variables.G_STR_CONEXION_USUARIO.Trim().Length > 0) ? true : false,
                                                                                                                                                    Variables.G_STR_CONEXION_USUARIO,
                                                                                                                                                    Variables.G_STR_CONEXION_CLAVE,
                                                                                                                                                    str_Tabla,
                                                                                                                                                    dct_Etiqueta_Campo_CampoRelacionado,
                                                                                                                                                    str_ClavesPrimarias);
                                            }

                                            if (mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo != null)
                                            {
                                                //Valores
                                                List<GTD_Documentos_BusquedaEtiquetas> lst_GTD_Documentos_BusquedaEtiquetas = g_dct_DocumentosEtiquetas[lng_idIdentificador];
                                                if (lst_GTD_Documentos_BusquedaEtiquetas != null && lst_GTD_Documentos_BusquedaEtiquetas.Count > 0)
                                                {
                                                    //Valores
                                                    long lng_idDocumentoTipo_Etiqueta_AUX = -1;
                                                    string str_Valor = "";
                                                    bool bol_TodosLosValoresNulos = true;

                                                    for (int int_Contador = 1; int_Contador <= dct_Etiqueta_Campo_CampoRelacionado.Count; int_Contador++)
                                                    {
                                                        lng_idDocumentoTipo_Etiqueta_AUX = (long)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("DocumentoTipoEtiqueta_Id_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null);
                                                        str_Valor = (string)mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo.GetType().GetProperty("Valor_" + int_Contador).GetValue(mdl_AUX_EtiquetasCamposRelacionales_Valores_Modelo, null);
                                                        if (str_Valor != null && str_Valor.Trim().Length > 0)
                                                        {
                                                            bol_TodosLosValoresNulos = false;
                                                        }

                                                        //ACTUALIZAR LISTADO EN MEMORIA
                                                        foreach (GTD_Documentos_BusquedaEtiquetas mdl_GTD_Documentos_BusquedaEtiquetas in lst_GTD_Documentos_BusquedaEtiquetas)
                                                        {
                                                            if (lng_idDocumentoTipo_Etiqueta_AUX == mdl_GTD_Documentos_BusquedaEtiquetas.idDocumentoTipoEtiqueta)
                                                            {
                                                                //Valor
                                                                mdl_GTD_Documentos_BusquedaEtiquetas.valor = str_Valor;

                                                                break;
                                                            }
                                                        }

                                                        //ACTUALIAZR ETIQUETA
                                                        CTU_P_AlmacenarDocumentos_Etiquetas controlsuario_CTU_P_AlmacenarDocumentos_Etiquetas = null;
                                                        foreach (int int_Etiquetas in g_lst_ListadoLineas_Etiquetas)
                                                        {
                                                            controlsuario_CTU_P_AlmacenarDocumentos_Etiquetas = (CTU_P_AlmacenarDocumentos_Etiquetas)g_frm_P_AlmacenarDocumentos.Exferia_Panel_Degradado_Etiquetas.Controls.Find("controlusuario_CTU_P_AlmacenarDocumentos_Etiquetas" + int_Etiquetas, false).FirstOrDefault();
                                                            if (controlsuario_CTU_P_AlmacenarDocumentos_Etiquetas != null &&
                                                                controlsuario_CTU_P_AlmacenarDocumentos_Etiquetas.g_lng_idDocumentoTipoEtiqueta == lng_idDocumentoTipo_Etiqueta_AUX)
                                                            {
                                                                controlsuario_CTU_P_AlmacenarDocumentos_Etiquetas.Actualizar_Valor(str_Valor, true);
                                                                break;
                                                            }
                                                        }
                                                    }

                                                    if (bol_TodosLosValoresNulos)
                                                    {
                                                        bol_ErroresAlBuscarEnBD = true;
                                                    }
                                                }     
                                            }
                                            else
                                            {
                                                bol_ErroresAlBuscarEnBD = true;
                                            }
                                        }
                                        #endregion
                                    }

                                    //Actualizar Columna y Campo
                                    mdl_INTERNO_DatosDocumento_Modelo.ErrorBD = bol_ErroresAlBuscarEnBD;
                                    #endregion
                                }
                            }
                        }
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(TareaAsincrona_RecargarListado_Etiquetas_DoWork));
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(TareaAsincrona_RecargarListado_Etiquetas_DoWork));
            }
        }
        private void TareaAsincrona_RecargarListado_Etiquetas_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            Rellenar_Listado("", false);
        }
        #endregion
        #endregion

        #region Etiquetas Auxiliares
        public void Crear_EtiquetasAuxiliares_Linea(string _str_Etiqueta,int _int_NumeroLinea_Etiqueta)
        {
            try
            {
                //Añadir control creado en subproceso en el hilo principal ........................
                if (g_frm_P_AlmacenarDocumentos.InvokeRequired)
                {
                    g_frm_P_AlmacenarDocumentos.Invoke((MethodInvoker)delegate
                    {
                        Crear_EtiquetasAuxiliares_Linea(_str_Etiqueta, _int_NumeroLinea_Etiqueta);
                    });
                    return;
                }

                if (_int_NumeroLinea_Etiqueta==-1)
                {
                    g_int_NumeroLineas_EtiquetaAuxiliar += 1;
                    _int_NumeroLinea_Etiqueta = g_int_NumeroLineas_EtiquetaAuxiliar;
                }

                //Calcular tamaño del panel ##########################
                int int_AnchopanelPrincipal = (422 * g_frm_P_AlmacenarDocumentos.Exferia_Panel_Degradado_EtiquetasAuxiliares.Width) / 426;
                if (g_frm_P_AlmacenarDocumentos.Exferia_Panel_Degradado_EtiquetasAuxiliares.Controls != null && 
                    g_frm_P_AlmacenarDocumentos.Exferia_Panel_Degradado_EtiquetasAuxiliares.Controls.Count > 0 &&
                    g_dct_DocumentosEtiquetasAuxiliar.ContainsKey(g_lng_Identificador_Seleccionado) &&
                    g_dct_DocumentosEtiquetasAuxiliar[g_lng_Identificador_Seleccionado]!=null && 
                    g_dct_DocumentosEtiquetasAuxiliar[g_lng_Identificador_Seleccionado].Keys.Count > 0)
                {
                    CTU_P_AlmacenarDocumentos_EtiquetasAuxiliares obj_CTU_P_AlmacenarDocumentos_Etiquetas_AUX=(CTU_P_AlmacenarDocumentos_EtiquetasAuxiliares)g_frm_P_AlmacenarDocumentos.Exferia_Panel_Degradado_EtiquetasAuxiliares.Controls.Find("controlusuario_CTU_P_AlmacenarDocumentos_EtiquetasAuxiliares" + g_dct_DocumentosEtiquetasAuxiliar[g_lng_Identificador_Seleccionado].Keys.ToList()[0], false).FirstOrDefault();
                    if (obj_CTU_P_AlmacenarDocumentos_Etiquetas_AUX != null)
                    {
                        int_AnchopanelPrincipal = obj_CTU_P_AlmacenarDocumentos_Etiquetas_AUX.Width;
                    }
                }

                //Objeto Personalizado .....................................................................
                int int_posicionRelativa = g_int_EtiquetaAuxiliar_PosicionY + (g_frm_P_AlmacenarDocumentos.Exferia_Panel_Degradado_EtiquetasAuxiliares.DisplayRectangle.Y + 5);
                CTU_P_AlmacenarDocumentos_EtiquetasAuxiliares controlusuario_CTU_P_AlmacenarDocumentos_EtiquetasAuxiliares = new CTU_P_AlmacenarDocumentos_EtiquetasAuxiliares(g_frm_P_AlmacenarDocumentos, _int_NumeroLinea_Etiqueta, _str_Etiqueta);
                controlusuario_CTU_P_AlmacenarDocumentos_EtiquetasAuxiliares.Name = "controlusuario_CTU_P_AlmacenarDocumentos_EtiquetasAuxiliares" + _int_NumeroLinea_Etiqueta;
                controlusuario_CTU_P_AlmacenarDocumentos_EtiquetasAuxiliares.Size = new Size(int_AnchopanelPrincipal, 28);
                controlusuario_CTU_P_AlmacenarDocumentos_EtiquetasAuxiliares.Location = new System.Drawing.Point(5, int_posicionRelativa);
                controlusuario_CTU_P_AlmacenarDocumentos_EtiquetasAuxiliares.Anchor = (AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Left);
                controlusuario_CTU_P_AlmacenarDocumentos_EtiquetasAuxiliares.CTU_P_AlmacenarDocumentos_EtiquetasAuxiliares_Delete_Click += new EventHandler<INTERNO_EventArgs>(Boton_CTU_P_AlmacenarDocumentos_EtiquetasAuxiliares_Delete_Click);
                controlusuario_CTU_P_AlmacenarDocumentos_EtiquetasAuxiliares.CTU_P_AlmacenarDocumentos_EtiquetasAuxiliares_ValorActualizado += new System.EventHandler<INTERNO_EventArgs_TresValores>(EtiquetasAuxiliares_ValorActualizado_Desde_ControlUsuario);
                //...........................................................................................

                //Añadir al panel Principal
                g_int_EtiquetaAuxiliar_PosicionY += 28 + 5;
                g_frm_P_AlmacenarDocumentos.Exferia_Panel_Degradado_EtiquetasAuxiliares.Controls.Add(controlusuario_CTU_P_AlmacenarDocumentos_EtiquetasAuxiliares);

                //Actualizo el listado del diccionario
                if (g_dct_DocumentosEtiquetasAuxiliar.Count!=0 && g_dct_DocumentosEtiquetasAuxiliar.ContainsKey(g_lng_Identificador_Seleccionado))
                {
                    Dictionary<int,string> dct_NumeroLineas = g_dct_DocumentosEtiquetasAuxiliar[g_lng_Identificador_Seleccionado];

                    if (dct_NumeroLineas != null && dct_NumeroLineas.ContainsKey(_int_NumeroLinea_Etiqueta))
                    {
                        dct_NumeroLineas[_int_NumeroLinea_Etiqueta] = _str_Etiqueta;
                    }
                    else
                    {
                        if (dct_NumeroLineas==null)
                        {
                            dct_NumeroLineas = new Dictionary<int, string>();
                        }
                        dct_NumeroLineas.Add(_int_NumeroLinea_Etiqueta, _str_Etiqueta);
                    }
                   
                    //Añadir al diccionario final
                    g_dct_DocumentosEtiquetasAuxiliar[g_lng_Identificador_Seleccionado] = dct_NumeroLineas;
                }
                //Añado un nuevo registro al diccionario
                else
                {
                    Dictionary<int, string> dct_NumeroLineas = new Dictionary<int, string>();
                    dct_NumeroLineas.Add(_int_NumeroLinea_Etiqueta, _str_Etiqueta);
                    g_dct_DocumentosEtiquetasAuxiliar.Add(g_lng_Identificador_Seleccionado, dct_NumeroLineas);
                }
               
            }
            catch(Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(Crear_EtiquetasAuxiliares_Linea));
            }
        }
        private void Boton_CTU_P_AlmacenarDocumentos_EtiquetasAuxiliares_Delete_Click(object sender, INTERNO_EventArgs e)
        {
            try
            {
                //Control Etiqueta
                CTU_P_AlmacenarDocumentos_EtiquetasAuxiliares obj_CTU_P_AlmacenarDocumentos_EtiquetasAuxiliares = (CTU_P_AlmacenarDocumentos_EtiquetasAuxiliares)g_frm_P_AlmacenarDocumentos.Exferia_Panel_Degradado_EtiquetasAuxiliares.Controls.Find("controlusuario_CTU_P_AlmacenarDocumentos_EtiquetasAuxiliares" + e.NumeroObjeto, false).FirstOrDefault();
                obj_CTU_P_AlmacenarDocumentos_EtiquetasAuxiliares.Dispose();

                //Borrar del Diccionario
                Dictionary<int, string> dct_NumeroLineas= g_dct_DocumentosEtiquetasAuxiliar[g_lng_Identificador_Seleccionado];
                if (dct_NumeroLineas!=null && 
                    dct_NumeroLineas.Count>0 &&
                    dct_NumeroLineas.ContainsKey(e.NumeroObjeto))
                {
                    dct_NumeroLineas.Remove(e.NumeroObjeto);
                }

                if (dct_NumeroLineas == null || dct_NumeroLineas.Count == 0)
                {
                    g_dct_DocumentosEtiquetasAuxiliar.Remove(g_lng_Identificador_Seleccionado);
                }

                //Mover el Resto de las etiquetas
                g_int_EtiquetaAuxiliar_PosicionY -= (28 + 5);
                if (dct_NumeroLineas!=null && dct_NumeroLineas.Count>0)
                {
                    CTU_P_AlmacenarDocumentos_EtiquetasAuxiliares obj_aCambiar;
                    foreach (int valoresModificarPosicion in dct_NumeroLineas.Keys.Where(m=>m>e.NumeroObjeto))
                    {
                        obj_aCambiar = (CTU_P_AlmacenarDocumentos_EtiquetasAuxiliares)g_frm_P_AlmacenarDocumentos.Exferia_Panel_Degradado_EtiquetasAuxiliares.Controls.Find("controlusuario_CTU_P_AlmacenarDocumentos_EtiquetasAuxiliares" + valoresModificarPosicion, false).FirstOrDefault();
                        obj_aCambiar.Location = new System.Drawing.Point(obj_aCambiar.Location.X, obj_aCambiar.Location.Y - (28 + 5));
                    }
                }

                //Saber si el documento tiene todos los datos necesarios rellenos
                Listado_Actualizar_FaltanDatos(g_lng_Identificador_Seleccionado);
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(Boton_CTU_P_AlmacenarDocumentos_EtiquetasAuxiliares_Delete_Click));
            }
        }
        private void EtiquetasAuxiliares_ValorActualizado_Desde_ControlUsuario(object sender, INTERNO_EventArgs_TresValores e)
        {
            try
            {
                if (g_lng_Identificador_Seleccionado > -1)
                {
                    Dictionary<int, string> dct_NumeroLineas = null;
                    if (g_dct_DocumentosEtiquetasAuxiliar.ContainsKey(g_lng_Identificador_Seleccionado))
                    {
                        dct_NumeroLineas = g_dct_DocumentosEtiquetasAuxiliar[g_lng_Identificador_Seleccionado];
                    }
                    if (dct_NumeroLineas == null)
                    {
                        dct_NumeroLineas = new Dictionary<int, string>();
                    }

                    //Almacenar si no lo estuviera ya
                    if (dct_NumeroLineas.ContainsKey(int.Parse(e.AUX_1)))
                    {
                        dct_NumeroLineas[int.Parse(e.AUX_1)] = e.AUX_2;
                    }
                    //Añadir
                    else
                    {
                        //Añadir al listado
                        dct_NumeroLineas.Add(int.Parse(e.AUX_1),e.AUX_2);
                    }

                    //Actualizo
                    if (g_dct_DocumentosEtiquetasAuxiliar.ContainsKey(g_lng_Identificador_Seleccionado))
                    {
                        g_dct_DocumentosEtiquetasAuxiliar[g_lng_Identificador_Seleccionado] = dct_NumeroLineas;
                    }
                    //Inserto
                    else
                    {
                        g_dct_DocumentosEtiquetasAuxiliar.Add(g_lng_Identificador_Seleccionado, dct_NumeroLineas);
                    }

                    //Saber si el documento tiene todos los datos necesarios rellenos
                    Listado_Actualizar_FaltanDatos(g_lng_Identificador_Seleccionado);

                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(EtiquetasAuxiliares_ValorActualizado_Desde_ControlUsuario));
            }
        }


        #endregion

        #region Grabar Datos
        public void GrabarDatos()
        {
            try
            {
                #region Validaciones iniciales
                //Tiene que tener bandeja de Entrada
                if (g_frm_P_AlmacenarDocumentos.Exferia_TextBox_BandejaEntrada.Text.Trim().Length == 0)
                {
                    Mensajes.MostrarMensaje(Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_AlmacenarDocumentos.Exferia_Label_BandejaEntrada.Text));
                    return;
                }

                //Tiene que tener bandeja de Salida
                if (g_frm_P_AlmacenarDocumentos.Exferia_TextBox_BandejaSalida.Text.Trim().Length == 0)
                {
                    Mensajes.MostrarMensaje(Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_AlmacenarDocumentos.Exferia_Label_BandejaSalida.Text));
                    return;
                }
                #endregion

                g_frm_P_AlmacenarDocumentos.Enabled = false;
                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_GRABANDODATOS());

                BackgroundWorker obj_TareaAsincrona_GrabarDatos = new BackgroundWorker();
                obj_TareaAsincrona_GrabarDatos.DoWork += new DoWorkEventHandler(TareaAsincrona_GrabarDatos_DoWork);
                obj_TareaAsincrona_GrabarDatos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_GrabarDatos_Completed);
                obj_TareaAsincrona_GrabarDatos.RunWorkerAsync();

                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }
                g_frm_P_AlmacenarDocumentos.Enabled = true;

                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(GrabarDatos));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA());
            }
        }
        private void TareaAsincrona_GrabarDatos_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;
            try
            {

                if (g_lst_INTERNO_DatosDocumento_Modelo!=null && g_lst_INTERNO_DatosDocumento_Modelo.Count>0)
                {
                    string str_Errores = "";
                    string str_NombreDocumento = "";
                    bool bol_TraspasarBandejaSalida = true;

                    #region Primero los Documentos que fueron Separados
                    List<INTERNO_DatosDocumento_Modelo> lst_INTERNO_DatosDocumento_Modelo_SEPARADOS = g_lst_INTERNO_DatosDocumento_Modelo.Where(m => m.Separado == 1).ToList();
                    if (lst_INTERNO_DatosDocumento_Modelo_SEPARADOS != null && lst_INTERNO_DatosDocumento_Modelo_SEPARADOS.Count>0)
                    {
                        bool bol_TraspasoTodosLosHijos = true;

                        foreach (INTERNO_DatosDocumento_Modelo mdl_INTERNO_DatosDocumento_Modelo_SEPARADOS in lst_INTERNO_DatosDocumento_Modelo_SEPARADOS)
                        {
                            //Buscar hijos
                            List<INTERNO_DatosDocumento_Modelo> lst_INTERNO_DatosDocumento_Modelo_HIJOS = g_lst_INTERNO_DatosDocumento_Modelo.Where(m => m.Indentificador_Padre == mdl_INTERNO_DatosDocumento_Modelo_SEPARADOS.Indentificador).ToList();

                            if (lst_INTERNO_DatosDocumento_Modelo_HIJOS != null && lst_INTERNO_DatosDocumento_Modelo_HIJOS.Count > 0)
                            {
                                long lng_idDocumento = -1;
                                foreach (INTERNO_DatosDocumento_Modelo mdl_INTERNO_DatosDocumento_Modelo in lst_INTERNO_DatosDocumento_Modelo_HIJOS)
                                {
                                    lng_idDocumento = -1;
          
                                    //Nombre
                                    str_NombreDocumento = mdl_INTERNO_DatosDocumento_Modelo.Nombre_Real_SinExtension + mdl_INTERNO_DatosDocumento_Modelo.Extension;
                                    if (mdl_INTERNO_DatosDocumento_Modelo.Nombre_SinExtension.Trim().Length > 0)
                                    {
                                        str_NombreDocumento += "(" + mdl_INTERNO_DatosDocumento_Modelo.Nombre_SinExtension.Trim() + mdl_INTERNO_DatosDocumento_Modelo.Extension + ")";
                                    }

                                    try
                                    {
                                        
                                        bol_TraspasarBandejaSalida = true;
                                        //Si no tiene todos los datos obligatorios, no se puede traspasar
                                        if (mdl_INTERNO_DatosDocumento_Modelo.FaltanDatos==false)
                                        {
                                            //Grabar
                                            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_GRABAR = GrabarDatos_Final(mdl_INTERNO_DatosDocumento_Modelo, str_NombreDocumento);

                                        
                                            if (mdl_INTERNO_ValorDevuelto_Modelo_GRABAR.TodoCorrecto == false)
                                            {
                                                str_Errores += mdl_INTERNO_ValorDevuelto_Modelo_GRABAR.Mensaje + System.Environment.NewLine;
                                                bol_TraspasarBandejaSalida = false;
                                                bol_TraspasoTodosLosHijos = false;
                                            }
                                            else
                                            {
                                                lng_idDocumento = mdl_INTERNO_ValorDevuelto_Modelo_GRABAR.Id;
                                            }
                                            
                                        }
                                        else
                                        {
                                            str_Errores += (Mensajes.G_STR_ALMACENARDOCUMENTO_FALTANDATOS(str_NombreDocumento) + System.Environment.NewLine);
                                            bol_TraspasarBandejaSalida = false;
                                            bol_TraspasoTodosLosHijos = false;
                                        }
                                    
                                        //Traspasar a la bandeja de salida
                                        if (bol_TraspasarBandejaSalida)
                                        {
                                            try
                                            {
                                               
                                                #region Grabar el Documento a la bandeja de salida
                                                string str_RutaFinal_Original = g_frm_P_AlmacenarDocumentos.Exferia_TextBox_BandejaSalida.Text + @"\" + mdl_INTERNO_DatosDocumento_Modelo.Nombre_Fichero_Final ;
                                                bool bol_Grabado = false;
                                                int int_Contador = 1;
                                                string str_RutaFinal = str_RutaFinal_Original;
                                                while (bol_Grabado==false)
                                                {
                                                  
                                                    if (!File.Exists(str_RutaFinal + mdl_INTERNO_DatosDocumento_Modelo.Extension))
                                                    {
                                                        File.WriteAllBytes(str_RutaFinal + ".pdf", mdl_INTERNO_DatosDocumento_Modelo.Documento_PDF);
                                                        bol_Grabado = true;
                                                    }
                                                    else
                                                    {
                                                        str_RutaFinal = str_RutaFinal_Original + "_" + int_Contador;
                                                        int_Contador += 1;
                                                    }
                                                   
                                                }
                                                #endregion

                                               
                                                #region Quitar el Documento del listado en memoria 
                                                g_lst_INTERNO_DatosDocumento_Modelo.RemoveAll(m => m.Indentificador == mdl_INTERNO_DatosDocumento_Modelo.Indentificador);

                                               

                                                g_dct_DocumentosEtiquetas.Remove(mdl_INTERNO_DatosDocumento_Modelo.Indentificador);
                                                g_dct_DocumentosEtiquetasAuxiliar.Remove(mdl_INTERNO_DatosDocumento_Modelo.Indentificador);
                                              
                                                //Actualizar el Documento Cono validado con exito
                                                g_obj_GTD_Documentos_Datos.Actualizar_ValidadoConExito(lng_idDocumento);
                                               
                                                #endregion

                                            }
                                            catch (Exception ex)
                                            {
                                                str_Errores += (Mensajes.G_STR_ALMACENARDOCUMENTO_ERROR_TRASPASARDOCUMENTO(str_NombreDocumento) + System.Environment.NewLine);
                                                bol_TraspasarBandejaSalida = false;
                                                bol_TraspasoTodosLosHijos = false;

                                                //Grabar Error
                                                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(TareaAsincrona_GrabarDatos_DoWork));

                                                //Borrar el Documento 
                                                g_obj_GTD_Documentos_Datos.Borrar(lng_idDocumento);
                                            }
                                        }
                                    }
                                    catch (Control_Errores)
                                    { }
                                    catch (Exception)
                                    { }
                                }
                            }

                            //Si traspaso todos los hijos correctamente, traspaso el padre
                            if (bol_TraspasoTodosLosHijos)
                            {
                                try
                                {
                                    
                                    #region Grabar el Documento a la bandeja de salida
                                    File.WriteAllBytes(g_frm_P_AlmacenarDocumentos.Exferia_TextBox_BandejaSalida.Text + @"\" + mdl_INTERNO_DatosDocumento_Modelo_SEPARADOS.Nombre_Fichero_Final + mdl_INTERNO_DatosDocumento_Modelo_SEPARADOS.Extension, mdl_INTERNO_DatosDocumento_Modelo_SEPARADOS.Documento_PDF);
                                    #endregion
                                   
                                    #region Quitar el Documento del listado en memoria y de la bandeja de entrada
                                    g_lst_INTERNO_DatosDocumento_Modelo.RemoveAll(m => m.Indentificador == mdl_INTERNO_DatosDocumento_Modelo_SEPARADOS.Indentificador);
                                    
                                    g_dct_DocumentosEtiquetas.Remove(mdl_INTERNO_DatosDocumento_Modelo_SEPARADOS.Indentificador);
                                    g_dct_DocumentosEtiquetasAuxiliar.Remove(mdl_INTERNO_DatosDocumento_Modelo_SEPARADOS.Indentificador);
                                   
                                    string str_Ruta_BandejaEntrada = g_frm_P_AlmacenarDocumentos.Exferia_TextBox_BandejaEntrada.Text + @"\" + mdl_INTERNO_DatosDocumento_Modelo_SEPARADOS.Nombre_Real_SinExtension + mdl_INTERNO_DatosDocumento_Modelo_SEPARADOS.Extension;
                                    if (File.Exists(str_Ruta_BandejaEntrada))
                                    {
                                          File.Delete(str_Ruta_BandejaEntrada);
                                    }
                                    
                                    #endregion
                                }
                                catch (Exception ex)
                                {
                                    str_Errores +=  (Mensajes.G_STR_ALMACENARDOCUMENTO_ERROR_TRASPASARDOCUMENTO(str_NombreDocumento) + System.Environment.NewLine);
                                    bol_TraspasarBandejaSalida = false;
                                    bol_TraspasoTodosLosHijos = false;

                                    //Grabar Error
                                    Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(TareaAsincrona_GrabarDatos_DoWork));

                                }
                            }
                        }


                    }
                    #endregion

                    #region Segundo el resto los Documentos 
                    List<INTERNO_DatosDocumento_Modelo> lst_INTERNO_DatosDocumento_Modelo_RESTODOCUMENTOS = g_lst_INTERNO_DatosDocumento_Modelo.Where(m => m.Separado == 0).ToList();
                    if (lst_INTERNO_DatosDocumento_Modelo_RESTODOCUMENTOS != null && lst_INTERNO_DatosDocumento_Modelo_RESTODOCUMENTOS.Count > 0)
                    {
                        long lng_idDocumento = -1;
                        foreach (INTERNO_DatosDocumento_Modelo mdl_INTERNO_DatosDocumento_Modelo in lst_INTERNO_DatosDocumento_Modelo_RESTODOCUMENTOS)
                        {
                            lng_idDocumento = -1;

                            //Nombre
                            str_NombreDocumento = mdl_INTERNO_DatosDocumento_Modelo.Nombre_Real_SinExtension + mdl_INTERNO_DatosDocumento_Modelo.Extension;
                            if (mdl_INTERNO_DatosDocumento_Modelo.Nombre_SinExtension.Trim().Length > 0)
                            {
                                str_NombreDocumento += "(" + mdl_INTERNO_DatosDocumento_Modelo.Nombre_SinExtension.Trim() + mdl_INTERNO_DatosDocumento_Modelo.Extension + ")";
                            }

                            try
                            {
                                bol_TraspasarBandejaSalida = true;
                                //Si no tiene todos los datos obligatorios, no se puede traspasar
                                if (mdl_INTERNO_DatosDocumento_Modelo.FaltanDatos==false)
                                {
                                    //Grabar
                                    INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_GRABAR = GrabarDatos_Final(mdl_INTERNO_DatosDocumento_Modelo, str_NombreDocumento);

                                    if (mdl_INTERNO_ValorDevuelto_Modelo_GRABAR.TodoCorrecto == false)
                                    {
                                        str_Errores += mdl_INTERNO_ValorDevuelto_Modelo_GRABAR.Mensaje + System.Environment.NewLine;
                                        bol_TraspasarBandejaSalida = false;
                                    }
                                    else
                                    {
                                        lng_idDocumento = mdl_INTERNO_ValorDevuelto_Modelo_GRABAR.Id;
                                    }
                                }
                                else
                                {
                                    str_Errores += (Mensajes.G_STR_ALMACENARDOCUMENTO_FALTANDATOS(str_NombreDocumento) + System.Environment.NewLine);
                                    bol_TraspasarBandejaSalida = false;
                                }
                              
                                //Traspasar a la bandeja de salida
                                if (bol_TraspasarBandejaSalida)
                                {
                                    try
                                    {
                                        #region Grabar el Documento a la bandeja de salida
                                        string str_RutaFinal_Original = g_frm_P_AlmacenarDocumentos.Exferia_TextBox_BandejaSalida.Text + @"\" + mdl_INTERNO_DatosDocumento_Modelo.Nombre_Fichero_Final;
                                        bool bol_Grabado = false;
                                        int int_Contador = 1;
                                        string str_RutaFinal = str_RutaFinal_Original;
                                        while (bol_Grabado == false)
                                        {
                                            if (!File.Exists(str_RutaFinal + mdl_INTERNO_DatosDocumento_Modelo.Extension))
                                            {
                                                File.WriteAllBytes(str_RutaFinal + ".pdf", mdl_INTERNO_DatosDocumento_Modelo.Documento_PDF);
                                                bol_Grabado = true;
                                            }
                                            else
                                            {
                                                str_RutaFinal = str_RutaFinal_Original + "_" + int_Contador;
                                                int_Contador += 1;
                                            }
                                        }
                                        #endregion
                                       
                                        #region Quitar el Documento del listado en memoria y de la bandea de entrada
                                        g_lst_INTERNO_DatosDocumento_Modelo.RemoveAll(m => m.Indentificador == mdl_INTERNO_DatosDocumento_Modelo.Indentificador);

                                        g_dct_DocumentosEtiquetas.Remove(mdl_INTERNO_DatosDocumento_Modelo.Indentificador);
                                        g_dct_DocumentosEtiquetasAuxiliar.Remove(mdl_INTERNO_DatosDocumento_Modelo.Indentificador);

                                        string str_Ruta_BandejaEntrada = g_frm_P_AlmacenarDocumentos.Exferia_TextBox_BandejaEntrada.Text + @"\" + mdl_INTERNO_DatosDocumento_Modelo.Nombre_Real_SinExtension + mdl_INTERNO_DatosDocumento_Modelo.Extension;
                                        if (File.Exists(str_Ruta_BandejaEntrada))
                                        {
                                            File.Delete(str_Ruta_BandejaEntrada);
                                        }
                                        #endregion
                                        
                                        //Actualizar el Documento Cono validado con exito
                                        g_obj_GTD_Documentos_Datos.Actualizar_ValidadoConExito(lng_idDocumento);
                                        
                                    }
                                    catch (Exception ex)
                                    {
                                        str_Errores += (Mensajes.G_STR_ALMACENARDOCUMENTO_ERROR_TRASPASARDOCUMENTO(str_NombreDocumento) + System.Environment.NewLine);
                                        bol_TraspasarBandejaSalida = false;

                                        //Borrar el Documento 
                                        g_obj_GTD_Documentos_Datos.Borrar(lng_idDocumento);

                                        //Grabar Error
                                        Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(TareaAsincrona_GrabarDatos_DoWork));
                                    }
                                }
                            }
                            catch (Control_Errores)
                            {}
                            catch (Exception)
                            {}
                        }
                    }
                    #endregion

                    if (str_Errores.Trim().Length>0)
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = str_Errores;
                    }
                }
                //No existe ningun documento en el listado
                else
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_ALMACENARDOCUMENTO_NOHAYDOCUMENTOS();
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(TareaAsincrona_GrabarDatos_DoWork));

                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(TareaAsincrona_GrabarDatos_DoWork));

                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_INTERNO_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_GrabarDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_AlmacenarDocumentos.Enabled = true;

            try
            {
                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_Resultado = (INTERNO_ValorDevuelto_Modelo)e.Result;

                //Mostrar si tuviera algun mensaje
                if (mdl_ValorDevuelto_Modelo_Resultado.Mensaje!=null && mdl_ValorDevuelto_Modelo_Resultado.Mensaje.Trim().Length > 0)
                {
                    Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);
                }

                g_frm_P_AlmacenarDocumentos.P_Base_SeModificoDatosPantalla = false;

                Rellenar_Listado("", false);


            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(TareaAsincrona_GrabarDatos_Completed));
            }
        }

        private INTERNO_ValorDevuelto_Modelo GrabarDatos_Final(INTERNO_DatosDocumento_Modelo _mdl_INTERNO_DatosDocumento_Modelo, string _str_NombreDocumento)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            PdfReader obj_PdfReader = null;
            long lng_idDocumento = -1;
            long? lng_Nulo = null;
            string str_Documento_EnTexto = "";

            try
            {
                #region GTD_Documentos
                GTD_Documentos mdl_GTD_Documentos = new GTD_Documentos();

                //id
                mdl_GTD_Documentos.id = -1;

                //idEmpresa
                mdl_GTD_Documentos.idEmpresa = Datos_Generales.GEN_Empresas_Devolver_IdEmpresa_AGrabar(g_frm_P_AlmacenarDocumentos.P_Base_ValoresGenerales.lng_idEmpresa, nameof(GTD_Documentos));
                
                //nombreRealSinExtension
                mdl_GTD_Documentos.nombreRealSinExtension = _mdl_INTERNO_DatosDocumento_Modelo.Nombre_Real_SinExtension;

                //nombreSinExtension
                mdl_GTD_Documentos.nombreSinExtension = _mdl_INTERNO_DatosDocumento_Modelo.Nombre_SinExtension;

                //extension
                mdl_GTD_Documentos.extension = ".pdf";

                //separado
                mdl_GTD_Documentos.separado = _mdl_INTERNO_DatosDocumento_Modelo.Separado == 2 ? true: false;

                //tamano
                string str_Size = "0 KB";
                if (_mdl_INTERNO_DatosDocumento_Modelo.Size > 0)
                {
                    str_Size = Math.Round((decimal)_mdl_INTERNO_DatosDocumento_Modelo.Size / 1024).ToString() + " KB";
                }
                mdl_GTD_Documentos.tamano = str_Size;

                //idDocumentoTipo
                mdl_GTD_Documentos.idDocumentoTipo = _mdl_INTERNO_DatosDocumento_Modelo.TipoDocumento.id;

                //idPlantillaDocumentoCabecera
                mdl_GTD_Documentos.idPlantillaDocumentoCabecera = _mdl_INTERNO_DatosDocumento_Modelo.Plantilla!=null ? _mdl_INTERNO_DatosDocumento_Modelo.Plantilla.id : lng_Nulo;

                //validadoConExito
                mdl_GTD_Documentos.validadoConExito = false;

                //Insertar
                INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_DOCUMENTOS = g_obj_GTD_Documentos_Datos.Insertar(mdl_GTD_Documentos);
                if (mdl_INTERNO_ValorDevuelto_Modelo_DOCUMENTOS.TodoCorrecto==false)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_ALMACENARDOCUMENTO_ERROR_GRABAR(_str_NombreDocumento);

                    return mdl_INTERNO_ValorDevuelto_Modelo;
                }
                else
                {
                    lng_idDocumento = mdl_INTERNO_ValorDevuelto_Modelo_DOCUMENTOS.Id;
                }
                #endregion

                #region GTD_Documentos_Archivos
                GTD_Documentos_Archivos mdl_GTD_Documentos_Archivos = new GTD_Documentos_Archivos();

                //id
                mdl_GTD_Documentos_Archivos.id = -1;

                //documento
                mdl_GTD_Documentos_Archivos.documento = _mdl_INTERNO_DatosDocumento_Modelo.Documento_PDF;

                //idDocumento
                mdl_GTD_Documentos_Archivos.idDocumento = lng_idDocumento;

                //Insertar
                INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_DOCUMENTOSARCHIVO = g_obj_GTD_Documentos_Archivos_Datos.Insertar(mdl_GTD_Documentos_Archivos);
                if (mdl_INTERNO_ValorDevuelto_Modelo_DOCUMENTOSARCHIVO.TodoCorrecto == false)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_ALMACENARDOCUMENTO_ERROR_GRABAR(_str_NombreDocumento);

                    return mdl_INTERNO_ValorDevuelto_Modelo;
                }
                #endregion

                #region GTD_Documentos_EnTexto
                GTD_Documentos_EnTexto mdl_GTD_Documentos_EnTexto = new GTD_Documentos_EnTexto();

                //id
                mdl_GTD_Documentos_EnTexto.id = -1;


                #region Documento
                if (_mdl_INTERNO_DatosDocumento_Modelo.Documento_PDF != null)
                {
                    obj_PdfReader = new PdfReader(_mdl_INTERNO_DatosDocumento_Modelo.Documento_PDF);
                    StringBuilder obj_StringBuilder = new StringBuilder();
                    string str_PDF_EnTexto = "";

                    for (int int_Paginas = 1; int_Paginas <= obj_PdfReader.NumberOfPages; int_Paginas++)
                    {

                        ITextExtractionStrategy obj_ITextExtractionStrategy = new SimpleTextExtractionStrategy();
                        str_PDF_EnTexto = PdfTextExtractor.GetTextFromPage(obj_PdfReader, int_Paginas, obj_ITextExtractionStrategy);


                        str_PDF_EnTexto = Encoding.UTF8.GetString(ASCIIEncoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(str_PDF_EnTexto)));

                        //Concatenear
                        obj_StringBuilder.Append(str_PDF_EnTexto);
                    }

                    str_Documento_EnTexto = obj_StringBuilder.ToString();
                }
                
                mdl_GTD_Documentos_EnTexto.documento = str_Documento_EnTexto;
               
                #endregion
                
                //idDocumento
                mdl_GTD_Documentos_EnTexto.idDocumento = lng_idDocumento;

                //Insertar
                INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_DOCUMENTOSENTEXTO = g_obj_GTD_Documentos_EnTexto_Datos.Insertar(mdl_GTD_Documentos_EnTexto);
                if (mdl_INTERNO_ValorDevuelto_Modelo_DOCUMENTOSENTEXTO.TodoCorrecto == false)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_ALMACENARDOCUMENTO_ERROR_GRABAR(_str_NombreDocumento);

                    return mdl_INTERNO_ValorDevuelto_Modelo;
                }
                #endregion

               /* POR AHORA NO HACE FALTA QUE LO GRABE
                #region GTD_Documentos_Palabras
                INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_DOCUMENTOSPALABRAS = g_obj_GTD_Documentos_Palabras_Datos.Insertar(lng_idDocumento, str_Documento_EnTexto);
                if (mdl_INTERNO_ValorDevuelto_Modelo_DOCUMENTOSPALABRAS.TodoCorrecto == false)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_ALMACENARDOCUMENTO_ERROR_GRABAR(_str_NombreDocumento);

                    return mdl_INTERNO_ValorDevuelto_Modelo;
                }
                #endregion*/

                #region GTD_Documentos_BusquedaEtiquetasAuxiliar

                if (g_dct_DocumentosEtiquetasAuxiliar!=null && 
                    g_dct_DocumentosEtiquetasAuxiliar.Count>0 &&
                    g_dct_DocumentosEtiquetasAuxiliar.ContainsKey(_mdl_INTERNO_DatosDocumento_Modelo.Indentificador))
                {
                    Dictionary<int, string>  dct_Etiquetas_Valores=g_dct_DocumentosEtiquetasAuxiliar[_mdl_INTERNO_DatosDocumento_Modelo.Indentificador];

                    if (dct_Etiquetas_Valores != null &&
                        dct_Etiquetas_Valores.Count > 0)
                    {
                        foreach (string str_Etiqueta in dct_Etiquetas_Valores.Values.Where(m=>m!=null && m.Trim().Length>0).ToList())
                        {
                            GTD_Documentos_BusquedaEtiquetasAuxiliar mdl_GTD_Documentos_BusquedaEtiquetasAuxiliar = new GTD_Documentos_BusquedaEtiquetasAuxiliar();

                            //id
                            mdl_GTD_Documentos_BusquedaEtiquetasAuxiliar.id = -1;

                            //valor
                            mdl_GTD_Documentos_BusquedaEtiquetasAuxiliar.valor = str_Etiqueta;

                            //idDocumento
                            mdl_GTD_Documentos_BusquedaEtiquetasAuxiliar.idDocumento = lng_idDocumento;

                            //Insertar
                            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_DOCUMENTOSETIQUETAS = g_obj_GTD_Documentos_BusquedaEtiquetasAuxiliar_Datos.Insertar(mdl_GTD_Documentos_BusquedaEtiquetasAuxiliar);
                            if (mdl_INTERNO_ValorDevuelto_Modelo_DOCUMENTOSETIQUETAS.TodoCorrecto == false)
                            {
                                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_ALMACENARDOCUMENTO_ERROR_GRABAR(_str_NombreDocumento);

                                return mdl_INTERNO_ValorDevuelto_Modelo;
                            }
                        }
                    }
                }
                #endregion

                #region GTD_Documentos_BusquedaEtiquetas

                if (g_dct_DocumentosEtiquetas!=null &&
                    g_dct_DocumentosEtiquetas.Count>0 &&
                    g_dct_DocumentosEtiquetas.ContainsKey(_mdl_INTERNO_DatosDocumento_Modelo.Indentificador))
                {
                    List<GTD_Documentos_BusquedaEtiquetas> lst_GTD_Documentos_BusquedaEtiquetas = g_dct_DocumentosEtiquetas[_mdl_INTERNO_DatosDocumento_Modelo.Indentificador];

                    if (lst_GTD_Documentos_BusquedaEtiquetas!=null && lst_GTD_Documentos_BusquedaEtiquetas.Count>0)
                    {
                        foreach (GTD_Documentos_BusquedaEtiquetas mdl_GTD_Documentos_BusquedaEtiquetas in lst_GTD_Documentos_BusquedaEtiquetas)
                        {
                            //idDocumento
                            mdl_GTD_Documentos_BusquedaEtiquetas.idDocumento = lng_idDocumento;

                            //Insertar
                            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_ETIQUETAS = g_obj_GTD_Documentos_BusquedaEtiquetas_Datos.Insertar(mdl_GTD_Documentos_BusquedaEtiquetas);
                            if (mdl_INTERNO_ValorDevuelto_Modelo_ETIQUETAS.TodoCorrecto == false)
                            {
                                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_ALMACENARDOCUMENTO_ERROR_GRABAR(_str_NombreDocumento);

                                return mdl_INTERNO_ValorDevuelto_Modelo;
                            }
                        }
                    }
                }
                #endregion

                //devolver el idDocumento
                mdl_INTERNO_ValorDevuelto_Modelo.Id= lng_idDocumento;

            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_ALMACENARDOCUMENTO_ERROR_GRABAR(_str_NombreDocumento);

                //Borrar el Documento 
                g_obj_GTD_Documentos_Datos.Borrar(lng_idDocumento);
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(GrabarDatos_Final));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_ALMACENARDOCUMENTO_ERROR_GRABAR(_str_NombreDocumento);

                //Borrar el Documento 
                g_obj_GTD_Documentos_Datos.Borrar(lng_idDocumento);
            }
            finally
            {
                if (obj_PdfReader!=null)
                {
                    obj_PdfReader.Close();
                }
            }
            
            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion

        #region Convertir a PDFA
        private async Task<bool> Convertidor_PDF4ME_PDF_A_PDFA(string _str_NombreFichero_PDFA,INTERNO_DatosDocumento_Modelo _mdl_INTERNO_DatosDocumento_Modelo)
        {
            string str_Ruta = "";

            try
            {
                #region Convertir A PDF-A
                try
                {
                    #region Convertir a PDFA
                    bool bol_TerminoCorrectamente = await PDF4ME_Funciones.Convertir_A_PDFA_Asincrono(_mdl_INTERNO_DatosDocumento_Modelo.Documento_Original, _mdl_INTERNO_DatosDocumento_Modelo.Nombre_Fichero_Final + _mdl_INTERNO_DatosDocumento_Modelo.Extension, _str_NombreFichero_PDFA);
                    #endregion

                    if (bol_TerminoCorrectamente)
                    {
                        str_Ruta = _str_NombreFichero_PDFA;
                    }
                }
                catch (Control_Errores)
                {
                    str_Ruta = "";
                }
                catch (Exception ex)
                {
                    str_Ruta = "";
                    Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(Convertidor_PDF4ME_PDF_A_PDFA));
                }
                #endregion


                Actualizar_Modelo_Documento_ConvertidoPDFA(str_Ruta);
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(Convertidor_PDF4ME_PDF_A_PDFA));
            }

            return true;
        }
        private async Task<bool> Convertidor_PDF4ME_DOCEXLSPNG_A_PDFA(string _str_NombreFichero_PDFA, string _str_NombreFichero_PDFA_Final, INTERNO_DatosDocumento_Modelo _mdl_INTERNO_DatosDocumento_Modelo)
        {
            string str_Ruta = "";

            try
            {
                #region Convertir A PDF-A
                try
                {
                    

                    #region Convertir a PDF
                    bool bol_TerminoCorrectamente = await PDF4ME_Funciones.Convertir_DocsExcelImage_A_PDFA_Asincrono(_mdl_INTERNO_DatosDocumento_Modelo.Documento_Original, _mdl_INTERNO_DatosDocumento_Modelo.Nombre_Fichero_Final + _mdl_INTERNO_DatosDocumento_Modelo.Extension, _str_NombreFichero_PDFA);
                    #endregion

                    if (bol_TerminoCorrectamente)
                    {
                        #region Convertir de PDF a PDFA
                        bol_TerminoCorrectamente = await PDF4ME_Funciones.Convertir_A_PDFA_Asincrono(_str_NombreFichero_PDFA, _mdl_INTERNO_DatosDocumento_Modelo.Nombre_Fichero_Final + _mdl_INTERNO_DatosDocumento_Modelo.Extension, _str_NombreFichero_PDFA_Final);
                        #endregion

                        //Borrar el Anterior
                        File.Delete(_str_NombreFichero_PDFA);

                        if (bol_TerminoCorrectamente)
                        {
                            str_Ruta = _str_NombreFichero_PDFA_Final;
                        }
                    }
                }
                catch (Control_Errores)
                {
                    str_Ruta = "";
                }
                catch (Exception ex)
                {
                    str_Ruta = "";
                    Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(Convertidor_PDF4ME_DOCEXLSPNG_A_PDFA));
                }
                #endregion

                Actualizar_Modelo_Documento_ConvertidoPDFA(str_Ruta);
            }
            catch (Exception ex)
            {
                str_Ruta = "";
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(Convertidor_PDF4ME_DOCEXLSPNG_A_PDFA));
            }

            return true;
        }

        private void Convertidor_PDF24_PDF_A_PDFA(string _str_NombreFichero_PDFA, INTERNO_DatosDocumento_Modelo _mdl_INTERNO_DatosDocumento_Modelo)
        {
            try
            {
                PDF24.Convertir_A_PDFA(_mdl_INTERNO_DatosDocumento_Modelo.Documento_Original, _str_NombreFichero_PDFA,true);

                Actualizar_Modelo_Documento_ConvertidoPDFA(_str_NombreFichero_PDFA);
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(Convertidor_PDF24_PDF_A_PDFA));
            }
        }
        private void Convertidor_PDF24_DOCEXLSPNG_A_PDFA(string _str_NombreFichero_PDFA, string _str_NombreFichero_PDFA_Final, INTERNO_DatosDocumento_Modelo _mdl_INTERNO_DatosDocumento_Modelo)
        {
            string str_Ruta = "";

            try
            {
                #region Convertir A PDF-A
                try
                {


                    PDF24.Convertir_A_PDF(_mdl_INTERNO_DatosDocumento_Modelo.Documento_Original, _mdl_INTERNO_DatosDocumento_Modelo.Extension, _str_NombreFichero_PDFA);

                    
                    PDF24.Convertir_A_PDFA_Asincrono(_str_NombreFichero_PDFA, _str_NombreFichero_PDFA_Final, false);

                    //Borrar el Anterior
                    File.Delete(_str_NombreFichero_PDFA);

                    str_Ruta = _str_NombreFichero_PDFA_Final;                    
                }
                catch (Control_Errores)
                {
                    str_Ruta = "";
                }
                catch (Exception ex)
                {
                    str_Ruta = "";
                    Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(Convertidor_PDF24_DOCEXLSPNG_A_PDFA));
                }
                #endregion

                Actualizar_Modelo_Documento_ConvertidoPDFA(str_Ruta);
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(Convertidor_PDF24_DOCEXLSPNG_A_PDFA));
            }
        }

        private void Actualizar_Modelo_Documento_ConvertidoPDFA(string _str_Ruta)
        {
            try
            {
                //Convertir Documento PDFA a BYTE[]
                if (_str_Ruta.Trim().Length > 0)
                {
                    byte[] arr_Documento_Convertido_PDF = File.ReadAllBytes(_str_Ruta);
                    Thread.Sleep(500);
                    g_lst_INTERNO_DatosDocumento_Modelo[g_lst_INTERNO_DatosDocumento_Modelo.IndexOf(g_lst_INTERNO_DatosDocumento_Modelo.Where(m => m.Indentificador.Equals(g_lng_Identificador_Seleccionado)).FirstOrDefault())].Documento_PDF = arr_Documento_Convertido_PDF;

                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_AlmacenarDocumentos_Controladora) + "/" + nameof(Actualizar_Modelo_Documento_ConvertidoPDFA));
            }
        }
        #endregion


    }
}
