2009-06-22 6 views
5

Nous mettons à niveau/convertissons plusieurs anciennes bases de données Access en MS-SQL. La plupart de ces bases de données possèdent des champs Objet OLE qui stockent des fichiers PDF. Je cherche un moyen d'extraire ces fichiers et de les stocker dans notre base de données SQL. J'ai vu des questions similaires qui répondent à la façon dont vous pouvez le faire avec des fichiers image (jpg, bmp, gif, etc) mais je n'ai pas trouvé un moyen qui fonctionne avec PDF.Extrait OLE Object (pdf) d'Access DB

Répondre

4

J'ai finalement obtenu du code de travail pour ce que je veux qu'il fasse. L'astuce consiste à déterminer quelle partie est l'en-tête OLE et à le supprimer. Voici ce qui fonctionne pour moi (basé sur le code trouvé 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; 
    } 

Notez que cela ne fonctionne que pour les fichiers PDF.

+1

Comme il s'agit d'une réponse plus ancienne, ce code a fonctionné pour moi, je devais seulement mettre à jour le "% PDF-1.3" à "% PDF-1.7" et il était capable de supprimer correctement l'en-tête. Assez curieusement, cela a fonctionné aussi juste en cherchant "% PDF" ... – Arthurdent510

1

OLEtoDisk

« Cette version enregistre le contenu entier d'une table contenant des objets OLE sur le disque. Ne nécessite pas l'application originale qui a servi le serveur OLE pour insérer l'objet. Supporte tous les documents MS Office, PDF, Toutes les images insérées par MS Photo Editor, MS Paint et Paint Shop Pro.Supporte également l'extraction de la classe PACKAGE, y compris le nom de fichier original.Contient la fonction pour produire un inventaire complet du champ OLE, y compris le chemin et les noms de fichier LINKED. contenu réel du champ "

http://lebans.com/oletodisk.htm

+0

J'ai vu (et essayé) ça. Cela fonctionne pour retirer les fichiers PDF mais j'essaie de trouver quelque chose que je peux intégrer dans mon propre code (C#). Certains de ces DB d'accès ont 4+ colonnes qui stockent des fichiers PDF et, finalement, je veux juste copier le fichier dans une table sur notre serveur SQL avec toutes les autres données. – Nate

+0

Ah, vous n'avez jamais dit que vous cherchiez du code C#. –

Questions connexes