2013-03-25 16 views
6

Il metodo My web crea un file pdf nella mia cartella% temp% e funziona. Poi voglio aggiungere alcuni campi personalizzati (meta) a quel file usando il codice qui sotto.Impossibile accedere al file perché è utilizzato da un altro processo

La classe PdfStamper genera un IOException, se uso il suo metodo .Close() o il blocco using appena termina. Il processo che è ancora in attesa sull'handle del file è il server web di webdev stesso (sto eseguendo il debug in VS2010 SP1).

private string AddCustomMetaData(string guid, int companyID, string filePath) 
{ 
    try 
    { 
     PdfReader reader = new PdfReader(filePath); 

     using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)) 
     { 
      PdfStamper st = new PdfStamper(reader, fs); 
      Dictionary<string, string> info = reader.Info; 
      info.Add("Guid", guid); 
      info.Add("CompanyID", companyID.ToString()); 

      st.MoreInfo = info; 
      st.Close(); 
     } 

     reader.Close(); 

     return guid; 
    } 
    catch (Exception e) 
    { 
     return e.Message; 
    } 
} 

Non importa quello che provo, che mantiene gettando l'eccezione in st.Close();, per essere più precisi:

Il processo non può accedere al file 'C: \ Users [mia nome utente] \ AppData \ Local \ Temp \ 53b96eaf-74a6-49d7-a715-6c2e866a63c3.pdf ' perché è utilizzato da un altro processo.

O sto trascurando qualcosa di ovvio o c'è un problema con la classe PdfStamper di cui sono ancora inconsapevole. Le versioni di itextsharp utilizzate sono 5.3.3.0 e 5.4.0.0, il problema è lo stesso.

Qualsiasi intuizione sarebbe molto apprezzata.

EDIT: Attualmente sto "codificando" il problema, ma non ho trovato alcuna soluzione.

+1

sei sicuro che il file non sia in uso prima che il lettore di PDF lo apra? (come in quello che stai facendo con questo file prima di questo) – Sayse

+0

meglio ancora, prova a cambiare l'ordine di apertura del file ('filestream' prima di 'pdf reader') – Sayse

risposta

15

Il problema è che si sta scrivendo su un file mentre si sta leggendo anche da esso. A differenza di alcuni tipi di file (JPG, PNG, ecc.) Che "caricano" tutti i dati in memoria, iTextSharp legge i dati come uno stream. È necessario utilizzare due file e scambiarli alla fine o forzare iTextSharp a "caricare" il primo file legando lo PdfReader a un array di byte del file.

PdfReader reader = new PdfReader(System.IO.File.ReadAllBytes(filePath)); 
+1

Ho cercato questa soluzione per ore. Funziona perfettamente! – Baxter

0

Provare a .Dispose() il vostro lettore di PDF (o qualsiasi altra cosa che si utilizza per la creazione di esso) quando si salva il file per la prima volta

+0

Questo è fuori dalla mia portata. Il servizio Web chiama una DLL ActiveX che accetta un percorso file. La prima operazione di scrittura è fuori dal mio controllo. –

1

suggerisco di utilizzare il FileShare enumerator quando si apre il file, in modo da provare per aprire un file con None sharing

File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.None); 
+0

Provato già, il problema esiste ancora. –

+0

ok ma è strano –

0

Provare questa soluzione se si pensa che la sua fattibile per voi - una volta che il WebMethod crea file nella cartella Temp, è necessario copiare il file e incollarlo in un'altra posizione o stessa posizione con diversi nominare e passare il percorso del file appena copiato al lettore PDF.

+0

Sì, ma questo non spiega quale sia la ragione di questo problema –

Problemi correlati