10

我正在尝试使用 FreeSpire 将受保护的 PDF 转换为 XPS 并返回为 PDF,然后使用 iTextSharp 将它们组合起来。下面是我用于转换各种文件的代码片段。

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

问题是我得到了一个Value cannot be null errordoc.LoadFromFile(Loan_list[f]);我必须string path = Loan_list[f];检查 Loan_list[f] 是否为空,但事实并非如此。我试图Loan_list[f]用命名的变量替换参数,path但它也没有。我以较小的规模测试了它的 PDF 转换(见下文)

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

我想了解为什么我会收到此错误以及如何修复它。

4

1 回答 1

4

您面临的问题将有两种解决方案。

  1. Document获取不在对象中的文档PDFDocument。然后可能会尝试这样的SaveToFile事情

    Document document = new Document();
    //Load a Document in document Object
    document.SaveToFile("Sample.pdf", FileFormat.PDF);
    
  2. 你可以使用 Stream 来做同样的事情

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

第二种方法很简单,但我建议您使用第一种方法,因为显而易见的原因,比如 document 会比流提供更好的可转换性。由于文档具有部分、段落、页面设置、文本、字体,因此需要进行更好或更精确的格式设置。

于 2015-08-24T03:05:19.167 回答