Search code examples
c#itextpdf-generationxpsdocumentspire.doc

Value of a string for file's location is nil but a stored value says it isn't


I'm trying to convert secured PDFs to XPS and back to PDF using FreeSpire and then combine them using iTextSharp. Below is my code snippet for converting various files.

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

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

The issue is I get a Value cannot be null error in doc.LoadFromFile(samplelist[f]);.I have the string path = sampleList[f]; to check if samplelist[f] was empty but it was not. I tried to replace the samplelist[f] parameter with the variable named path but it also does not go though. I tested the PDF conversion on a smaller scale it it worked (see below)

string PDFDoc = @"C:\Users\****\Desktop\Test\Test\Test.PDF";
string XPSDoc = @"C:\Users\****\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();

I would like to understand why I am getting this error and how to fix it.


Solution

  • There would be 2 solutions for the problem you are facing.

    1. Get the Document in the Document Object not in PDFDocument. And then probably try to SaveToFile Something like this

      Document document = new Document();
      //Load a Document in document Object
      document.SaveToFile("Sample.pdf", FileFormat.PDF);
      
    2. You can use Stream for the same something like this

      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);
      

    Second approach is the easy one, but I would recommend you to use the first one as for obvious reasons like document will give better convertability than stream. Since the document have section, paragraph, page setup, text, fonts everything which need to be required to do a better or exact formatting required.