2015-08-13 27 views
10

Sto cercando di convertire i PDF protetti in XPS e di nuovo in PDF utilizzando FreeSpire e quindi combinarli utilizzando iTextSharp. Di seguito è riportato il mio snippet di codice per la conversione di vari file.Errore: il valore non può essere nullo

char[] delimiter = { '\\' }; 
string WorkDir = @"C:\Users\rwong\Desktop\PDF\Test"; 
Directory.SetCurrentDirectory(WorkDir); 
string[] SubWorkDir = Directory.GetDirectories(WorkDir); 
//convert items to PDF 
foreach (string subdir in SubWorkDir) 
{ 
    string[] Loan_list = Directory.GetFiles(subdir); 
    for (int f = 0; f < Loan_list.Length - 1; f++) 
    { 
     if (Loan_list[f].EndsWith(".doc") || Loan_list[f].EndsWith(".DOC")) 
     { 
      Spire.Pdf.PdfDocument doc = new Spire.Pdf.PdfDocument(); 
      doc.LoadFromFile(Loan_list[f], FileFormat.DOC); 
      doc.SaveToFile((Path.ChangeExtension(Loan_list[f],".pdf")), FileFormat.PDF); 
      doc.Close(); 
     } 
     . //other extension cases 
     . 
     . 
     else if (Loan_list[f].EndsWith(".pdf") || Loan_list[f].EndsWith(".PDF")) 
     { 
      PdfReader reader = new PdfReader(Loan_list[f]); 
      bool PDFCheck = reader.IsOpenedWithFullPermissions; 
      reader.Close(); 
      if (PDFCheck) 
      { 
       Console.WriteLine("{0}\\Full Permisions", Loan_list[f]); 
       reader.Close(); 
      } 
      else 
      { 
       Console.WriteLine("{0}\\Secured", Loan_list[f]); 
       Spire.Pdf.PdfDocument doc = new Spire.Pdf.PdfDocument(); 
       string path = Loan_List[f]; 
       doc.LoadFromFile(Loan_list[f]); 
       doc.SaveToFile((Path.ChangeExtension(Loan_list[f], ".xps")), FileFormat.XPS); 
       doc.Close(); 

       Spire.Pdf.PdfDocument doc2 = new Spire.Pdf.PdfDocument(); 
       doc2.LoadFromFile((Path.ChangeExtension(Loan_list[f], ".xps")), FileFormat.XPS); 
       doc2.SaveToFile(Loan_list[f], FileFormat.PDF); 
       doc2.Close(); 
       } 

Il problema è che ottenere un Value cannot be null error in doc.LoadFromFile(Loan_list[f]); .I avere la string path = Loan_list[f]; per verificare se Loan_list [f] era vuota, ma non lo era. Ho provato a sostituire il parametro Loan_list[f] con la variabile denominata path ma non viene comunque eseguito. Ho provato la conversione PDF su una scala più piccola ha funzionato (vedi sotto)

string PDFDoc = @"C:\Users\rwong\Desktop\Test\Test\Test.PDF"; 
string XPSDoc = @"C:\Users\rwong\Desktop\Test\Test\Test.xps"; 

//Convert PDF file to XPS file 
PdfDocument doc = new PdfDocument(); 
doc.LoadFromFile(PDFDoc); 
doc.SaveToFile(XPSDoc, FileFormat.XPS); 
doc.Close(); 

//Convert XPS file to PDF 
PdfDocument doc2 = new PdfDocument(); 
doc2.LoadFromFile(XPSDoc, FileFormat.XPS); 
doc2.SaveToFile(PDFDoc, FileFormat.PDF); 
doc2.Close(); 

Vorrei capire perché sto ottenendo questo errore e come risolverlo.

+0

in questa riga 'stringa WorkDir = @" C: \ Users \ rwong \ Desktop \ PDF \ Test ";' provare a modificare il codice nel seguente 'string WorkDir = @" C: \ Users \ rwong \ Desktop \ PDF \ Test \ ";' e vedere se questo corregge il problema – MethodMan

+0

No, non ha fatto la differenza. Ho anche provato ad aggiungere l'altro parametro in LoadFromFile (Loan_list [f], FileFormat.PDF) ma non ho preso i dadi – LampPost

+0

Lo hai provato senza il parametro 'FileFormat.DOC'? Hai provato a inserire il percorso letterale all'interno del primo parametro? Funziona se hai fatto una di quelle cose? –

risposta

4

Ci sarebbero 2 soluzioni per il problema che si sta affrontando.

  1. ottenere il documento in oggetto non Document in PDFDocument. E allora probabilmente cerco di SaveToFile Qualcosa di simile

    Document document = new Document(); 
    //Load a Document in document Object 
    document.SaveToFile("Sample.pdf", FileFormat.PDF); 
    
  2. È possibile utilizzare flusso per lo stesso qualcosa di simile

    PdfDocument doc = new PdfDocument(); 
    //Load PDF file from stream. 
    FileStream from_stream = File.OpenRead(Loan_list[f]); 
    //Make sure the Loan_list[f] is the complete path of the file with extension. 
    doc.LoadFromStream(from_stream); 
    //Save the PDF document. 
    doc.SaveToFile(Loan_list[f] + ".pdf",FileFormat.PDF); 
    

secondo approccio è quello facile, ma vi consiglierei di usa il primo per ovvi motivi, ad esempio il documento offrirà una migliore convertibilità rispetto al flusso. Poiché il documento ha sezioni, paragrafi, impostazioni di pagina, testo, caratteri, tutto ciò che deve essere richiesto per eseguire una formattazione migliore o esatta.

+0

Grazie per il tuo contributo! Quando provo ad usare la tua prima soluzione, non ho 'SaveToFile' come opzione. Sapresti perché? – LampPost

+0

Sono sicuro che questo [link] (http://www.e-iceblue.com/Knowledgebase/Spire.Doc/Spire.Doc-Program-Guide/Conversion.html) ti aiuterà –