2009-06-22 42 views
5

Estamos actualizando/convirtiendo varias bases de datos antiguas de Access a MS-SQL. Muchas de estas bases de datos tienen campos OLE Object que almacenan archivos PDF. Estoy buscando una forma de extraer estos archivos y almacenarlos en nuestra base de datos SQL. He visto preguntas similares que explican cómo se puede hacer esto con los archivos de imagen (jpg, bmp, gif, etc.), pero no he encontrado una manera que funcione con PDF.Extraiga Objeto OLE (pdf) de Access DB

Respuesta

4

Finalmente obtuve un código que funciona para lo que quiero que haga. El truco consiste en determinar qué parte es el encabezado OLE y eliminarlo. Aquí está lo que funciona para mí (sobre la base de código que se encuentra here)

public static byte[] StripOleHeader(byte[] fileData) 
    { 
     const string START_BLOCK = "%PDF-1.3"; 
     int startPos = -1; 

     Encoding u8 = Encoding.UTF7; 
     string strEncoding = u8.GetString(fileData); 

     if (strEncoding.IndexOf(START_BLOCK) != -1) 
     { 
      startPos = strEncoding.IndexOf(START_BLOCK); 
     } 

     if (startPos == -1) 
     { 
      throw new Exception("Could not find PDF Header"); 
     } 

     byte[] retByte = new byte[fileData.LongLength - startPos]; 

     Array.Copy(fileData, startPos, retByte, 0, fileData.LongLength - startPos); 

     return retByte; 
    } 

Tenga en cuenta que esto sólo funciona para archivos PDF.

+1

Dado que esta es una respuesta anterior, este código funcionó para mí, solo tuve que actualizar el "% PDF-1.3" a "% PDF-1.7" y fue capaz de eliminar correctamente el encabezado. Curiosamente, funcionó tan bien solo buscando "% PDF" ... – Arthurdent510

1

OLEtoDisk

"Esta versión guarda todo el contenido de una tabla que contiene los objetos OLE en el disco. No requiere la aplicación original que sirvió como el servidor OLE para insertar el objeto. Soporta todos los documentos de MS Office, PDF, Todas las imágenes insertadas por MS Photo Editor, MS Paint y Paint Shop Pro. También admite la extracción de la clase PACKAGE, incluido el nombre de archivo original. Contiene la función para producir un inventario completo del campo OLE, incluidos LINKED path y Filenames. Utiliza las API de almacenamiento estructurado para leer contenido real del campo "

http://lebans.com/oletodisk.htm

+0

He visto (e intenté) eso. Funciona para extraer los archivos PDF, pero estoy tratando de encontrar algo que pueda integrar en mi propio código (C#). Algunos de estos DB de acceso tienen más de 4 columnas que almacenan archivos PDF y, en última instancia, solo quiero copiar el archivo en una tabla en nuestro servidor SQL con todos los demás datos. – Nate

+0

Ah, nunca dijiste que estabas buscando el código C#. –

Cuestiones relacionadas