Estrarre l'oggetto OLE (pdf) dal DB di accesso
Domanda
Stiamo aggiornando / convertendo diversi vecchi database di Access in MS-SQL. Molti di questi database hanno campi OLE Object che memorizzano file PDF. Sto cercando un modo per estrarre questi file e archiviarli nel nostro database SQL. Ho visto domande simili che rispondono a come potresti farlo con i file di immagine (jpg, bmp, gif, ecc.) Ma non ho trovato un modo che funzioni con PDF.
Soluzione
Finalmente ho ottenuto del codice funzionante per quello che voglio che faccia. Il trucco è determinare quale parte è l'intestazione OLE e rimuoverlo. Ecco cosa funziona per me (basato sul codice trovato qui )
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;
}
Nota che funziona solo con file PDF.
Altri suggerimenti
OLEtoDisk
" Questa versione salva l'intero disco di una tabella contenente oggetti OLE. NON richiede l'applicazione originale che fungeva da server OLE per inserire l'oggetto. Supporta tutti i documenti MS Office, PDF, Tutte le immagini inserite da MS Photo Editor, MS Paint e Paint Shop Pro. Supporta anche l'estrazione della classe PACKAGE incluso il nome file originale. Contiene la funzione per produrre un inventario completo del campo OLE, inclusi percorso LINKED e nomi dei file. Utilizza le API di archiviazione strutturata per leggere il contenuto effettivo del campo "