Aspose.Pdf.Net,Pdf文件转换成word出现异常:未将对象引用设置到对象的实例

        Try
            Dim document = New Aspose.Pdf.Document("123.pdf")
            ‘Dim ex As Integer = Aspose.Pdf.SaveFormat.DocX
            ’document.Save("output.docx", ex)
            document.Save("output.docx", 6)
        Catch ex As Exception
            Console.WriteLine("发生异常: " & ex.Message)
            Console.WriteLine("异常类型: " & ex.GetType().Name)
            Console.WriteLine("异常堆栈: " & ex.StackTrace)
        End Try
    End Sub

VS2022,试了很多版本包括最新的Aspose.Pdf.Net,PDF文件应该也没有问题,试了多个PDF文件,在线转换是可以的,运行时都是同样的问题:System.NullReferenceException:“未将对象引用设置到对象的实例
“aspose test1.exe”(CLR v4.0.30319: aspose test1.exe): 已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\mscorlib.resources\v4.0_4.0.0.0_zh-Hans_b77a5c561934e089\mscorlib.resources.dll”。模块已生成,不包含符号。
引发的异常:“System.IO.EndOfStreamException”(位于 Aspose.Pdf.dll 中)
引发的异常:“System.IO.EndOfStreamException”(位于 Aspose.Pdf.dll 中)
引发的异常:“System.ArgumentException”(位于 mscorlib.dll 中)
发生异常: 路径中具有非法字符。
异常类型: ArgumentException
异常堆栈: 在 System.IO.Path.CheckInvalidPathChars(String path, Boolean checkAdditional)
在 System.IO.Path.IsPathRooted(String path)
在 ???.(IDictionary )
在 ???.()
在 ???.()
在 ???.???(String , FontStyle )
在 ???.(String , FontStyle , String )
在 ???.(String , Single , FontStyle )
在 ???..ctor(??? , String , ???[] , UInt32[] , Boolean , Double , Dictionary`2 , Double ?, ??? ?, Double ?, ??? ?, Boolean ?, Boolean ?, ??? ?)
在 ???.(??? , String , ??? , Double )
在 ???.()
在 ???..ctor(??? , ??? )
在 ???.(??? , ??? )
在 ???..ctor(??? , ??? , ??? )
在 ???.(Document , Page , UnifiedSaveOptions )
在 ???.(Document , ???& , UnifiedSaveOptions , Int32& )
在 ???.(Document , Stream , DocSaveOptions )
在 Aspose.Pdf.Document.Save(Stream outputStream, SaveOptions options)
在 Aspose.Pdf.Document.Save(Stream outputStream, SaveFormat format)
在 Aspose.Pdf.Document.Save(String outputFileName, SaveFormat format)
在 aspose_test1.SingleDocument_Render.PdfTest.ConvertPdfToDocx() 位置 C:\Users\yzswk\source\repos\aspose test1\aspose test1\pdftest.vb:行号 15
调用堆栈:

Aspose.PDF.dll!#=z6RalRduJVQKd5EZuNVMJuKliYjK8PHg7Gw==.#=z1Dicw3U=(#=zWt4uWkCCK51P5HAIfAcVlTs= #=z69G5rGc=) 未知
Aspose.PDF.dll!#=z8WnpAvoiU_Cv_Q_f$3K9j$Q=.#=z2EQJYISJgkQ1S_bjLQ==(Aspose.Pdf.Document #=z4XpokXA=, Aspose.Pdf.DocSaveOptions #=zBlNOmoM=, System.Collections.Generic.Queue<#=zWt4uWkCCK51P5HAIfAcVlTs=> #=zxBgv$hjnrTNS, System.IO.Stream #=zSAgbP_j_tILz, int #=zrm3CX6$Cv8SD) 未知
Aspose.PDF.dll!#=z8WnpAvoiU_Cv_Q_f$3K9j$Q=.#=zmLgy15M=(Aspose.Pdf.Document #=z4XpokXA=, System.IO.Stream #=zSAgbP_j_tILz, Aspose.Pdf.DocSaveOptions #=zBlNOmoM=) 未知
Aspose.PDF.dll!Aspose.Pdf.Document.#=zBKlhKvxXl_iS(System.IO.Stream #=zSAgbP_j_tILz, Aspose.Pdf.SaveOptions #=zBlNOmoM=) 未知
Aspose.PDF.dll!Aspose.Pdf.Document.#=zBKlhKvxXl_iS(System.IO.Stream #=zSAgbP_j_tILz, Aspose.Pdf.SaveFormat #=zl86l120=) 未知
Aspose.PDF.dll!Aspose.Pdf.Document.#=zBKlhKvxXl_iS(string #=zDE6n1kXilShd, Aspose.Pdf.SaveFormat #=zl86l120=) 未知
Aspose.PDF.dll!Aspose.Pdf.Document.Save(string outputFileName, Aspose.Pdf.SaveFormat format) 未知

123.pdf (46.4 KB)

@yzswk

我们在 23.11 版本的 API 中使用了以下代码片段,但我们没有注意到任何问题:

Dim pdfDocument As New Document(dataDir & "123.pdf")
Dim saveOptions As New DocSaveOptions()
saveOptions.Format = DocSaveOptions.DocFormat.DocX
saveOptions.Mode = DocSaveOptions.RecognitionMode.Flow
pdfDocument.Save(dataDir & "123.docx", saveOptions)

123.docx (11.5 KB)

您能否确保您使用的是最新版本的 API?如果问题仍然存在,请告知我们您的环境的详细信息。

我怀疑和fonts目录里面的文件名有关,将编译好的程序在另一个干净的系统(win11)中是可以正常运行的。

“aspose test1.exe”(CLR v4.0.30319: aspose test1.exe): 已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\mscorlib.resources\v4.0_4.0.0.0_zh-Hans_b77a5c561934e089\mscorlib.resources.dll”。模块已生成,不包含符号。
引发的异常:“System.ArgumentException”(位于 mscorlib.dll 中)
发生异常: 路径中具有非法字符。
异常类型: ArgumentException
异常堆栈:    在 System.IO.Path.CheckInvalidPathChars(String path, Boolean checkAdditional)
   在 System.IO.Path.IsPathRooted(String path)
   在 Aspose.Pal.PalSystem.GetFontFileNamesFromRegistry(IDictionary fileNames)
   在 Aspose.TrueType.ExternalFontCache.CreateFontCache()
   在 Aspose.TrueType.ExternalFontCache.get_FontCache()
   在 Aspose.TrueType.ExternalFontCache.GetFont(String familyName, FontStyle style)
   在 Aspose.TrueType.FontCacheBase.FetchTTFont(String familyName, FontStyle style, String altFamilyName)
   在 Aspose.TrueType.FontCacheBase.FetchDrFont(String familyName, Single sizePoints, FontStyle style)
   在 a.a..ctor(? , String , ?[] , Byte[] , Int32 , Double , Hashtable , Double ,  , Double ,  , Boolean , Boolean ,  )
   在 ..e(? , String ,  , Double )
   在 .?.?()
   在 .?..ctor(? ,  )
   在 ..e(? ,  )
   在 ?.?..ctor(? ,  , ? )
   在 .?.e(? ,  , ? )
   在 ..e(Document , Stream , DocSaveOptions )
   在 Aspose.Pdf.Document.Save(Stream outputStream, SaveOptions options)
   在 Aspose.Pdf.Document.Save(Stream outputStream, SaveFormat format)
   在 Aspose.Pdf.Document.Save(String outputFileName, SaveFormat format)
   在 aspose_test1.SingleDocument_Render.PdfTest.ConvertPdfToDocx() 位置 C:\Users\yzswk\source\repos\aspose test1\aspose test1\pdftest.vb:行号 30
win10fonts是有问题的系统里面fonts的文件名,win11fonts是正常的系统里面fonts的文件名。
另外,在python里面和netcore编译的程序里都是正常的,只是在.Net FrameWork应用中出现问题,当前是4.7.2的目标框架。
最新版23.11的API也试过了,都是同一个问题。下面是23.11.1的错误调用堆栈。
“aspose test1.exe”(CLR v4.0.30319: aspose test1.exe): 已加载“zx_a21df2cf3c4d453efc4dd9bc6b7a1b8b”。模块已生成,不包含符号。
“aspose test1.exe”(CLR v4.0.30319: aspose test1.exe): 已加载“C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\mscorlib.resources\v4.0_4.0.0.0_zh-Hans_b77a5c561934e089\mscorlib.resources.dll”。模块已生成,不包含符号。
引发的异常:“System.IO.EndOfStreamException”(位于 Aspose.PDF.dll 中)
“aspose test1.exe”(CLR v4.0.30319: aspose test1.exe): 已加载“zx_fa45d6a0baa34297a882a9cede8fce63”。模块已生成,不包含符号。
“aspose test1.exe”(CLR v4.0.30319: aspose test1.exe): 已加载“zx_cedb746dff7a4eb618e4f9df573ef82d”。模块已生成,不包含符号。
“aspose test1.exe”(CLR v4.0.30319: aspose test1.exe): 已加载“Aspose.Imaging”。模块已生成,不包含符号。
引发的异常:“System.ArgumentException”(位于 mscorlib.dll 中)
引发的异常:“System.TypeInitializationException”(位于 Aspose.PDF.dll 中)
引发的异常:“System.NullReferenceException”(位于 Aspose.PDF.dll 中)
未将对象引用设置到对象的实例。

“aspose test1.exe”(CLR v4.0.30319: aspose test1.exe): 已加载“d:\program files\microsoft visual studio\2022\enterprise\common7\ide\extensions\bcwrtxld.ijf\OzCode.Debugger.Probe.dll”。
发生异常: 未将对象引用设置到对象的实例。
异常类型: NullReferenceException
异常堆栈:    在 #=z6RalRduJVQKd5EZuNVMJuKliYjK8PHg7Gw==.#=z1Dicw3U=(#=zWt4uWkCCK51P5HAIfAcVlTs= #=z69G5rGc=)
   在 #=z8WnpAvoiU_Cv_Q_f$3K9j$Q=.#=z2EQJYISJgkQ1S_bjLQ==(Document #=z4XpokXA=, DocSaveOptions #=zBlNOmoM=, Queue`1 #=zxBgv$hjnrTNS, Stream #=zSAgbP_j_tILz, Int32 #=zrm3CX6$Cv8SD)
   在 #=z8WnpAvoiU_Cv_Q_f$3K9j$Q=.#=zmLgy15M=(Document #=z4XpokXA=, Stream #=zSAgbP_j_tILz, DocSaveOptions #=zBlNOmoM=)
   在 Aspose.Pdf.Document.#=zBKlhKvxXl_iS(Stream #=zSAgbP_j_tILz, SaveOptions #=zBlNOmoM=)
   在 Aspose.Pdf.Document.#=zBKlhKvxXl_iS(Stream #=zSAgbP_j_tILz, SaveFormat #=zl86l120=)
   在 Aspose.Pdf.Document.#=zBKlhKvxXl_iS(String #=zDE6n1kXilShd, SaveFormat #=zl86l120=)
   在 Aspose.Pdf.Document.Save(String outputFileName, SaveFormat format)
   在 aspose_test1.SingleDocument_Render.PdfTest.ConvertPdfToDocx() 位置 C:\Users\yzswk\source\repos\aspose test1\aspose test1\pdftest.vb:行号 30

fonts.zip (5.0 KB)

@yzswk

您能分享一下发生此异常的系统类型吗?操作系统名称和版本等。此外,请确保发生此异常的系统中所有字体均已正确安装。您可以从干净的系统中复制所有字体并将其粘贴到其他系统中。

Microsoft Windows版本22H2(操作系统内部版本19045.3693)Windows10专业版

@yzswk

您使用的是最新版本的 API 吗?另外,您是否正在运行应用程序的 .exe?您能否分享 .zip 格式的 .exe 以及运行它的说明。

就是一个最简单的测试
Public Shared Sub ConvertPdfToDocx()

        Try
            Dim document = New Aspose.Pdf.Document("temp.pdf")
            document.Save("output.doc", 1)
        Catch ex As Exception
            Console.WriteLine("发生异常: " & ex.Message)
            Console.WriteLine("异常类型: " & ex.GetType().Name)
            Console.WriteLine("异常堆栈: " & ex.StackTrace)
        End Try
    End Sub

WindowsApp2.zip (6.5 KB)
API用的是23.11.1的版本
在.Net 6.0下面,21.11.0修复了该问题.附上有问题的21.10.1和正常的21.11.0程序
pdf py21.10.1.zip (70.7 KB)

pdf py21.11.0.zip (78.9 KB)

@yzswk

我们担心这些信息不足以让我们重现该问题。

您能否确认出现异常的系统中是否正在运行.exe文件?

其次,您是否尝试在发生问题的系统上的 Visual Studio 中运行该程序?它会更改错误和异常文本吗?

通过查看异常,它看起来像是与配置相关的问题。发生此错误的系统上可能缺少某些运行时和配置。

我们担心,如果不将其复制到我们的环境中,就无法解决该问题。我们在 Windows 11 和 10 中测试了代码片段,并且没有重现错误。

您能否分享一些可以帮助我们重现该问题的更多信息?

image.png (86.8 KB)
在调用IsPathRooted,当path为"calibri.ttf\0\0\0\0\0偓?O\u0003\0€"时发生错误,应该是路径中的异常字符导致出错。calibri.ttf字体受系统保护,无法删除,无法进行下一步测试。calibri.ttf版本见下图
image.png (8.4 KB)
字体文件
calibri.zip (755.5 KB)

@yzswk

我们正在检查您提供的信息,并将尽快回复您。

@yzswk

我们为您准备了一个示例控制台应用程序,附在此处。它使用您在此处共享的示例文件,并使用最新版本的 API 将其转换为 Word 文档。请在您的环境中运行它,如果您遇到任何问题或异常,请告诉我们。请分享屏幕截图和错误描述,以便我们更好地理解此问题并相应解决。

如果您正在使用可执行文件,请与我们分享您如何创建它们的过程。抛出错误的系统中很可能缺少某些配置或依赖项。

我们已准备好调查并解决该问题,但需要首先确认该问题是否与 API 有关或与特定环境有关。对于由此可能造成的麻烦,请接受我们的歉意。

前面我已经说过:“在python里面和netcore编译的程序里都是正常的,只是在.Net FrameWork应用中出现问题,当前是4.7.2的目标框架。”,“在.Net 6.0下面,21.11.0修复了该问题”
您给出的示例程序是.Net 6.0框架的,因此您提供的示例程序运行是正常的。能不能提供.Net FrameWork 4.72的示例程序?

@yzswk

对于疏忽,我们深表歉意。请检查随附的示例应用程序 (.NET Framework 4.7.2) 并在您端使用它。我们删除了 NuGet 包以减小文件大小。您可以在最后恢复 NuGet 包并测试应用程序。
ConsoleApp1.zip (64.4 KB)

23.11.1 版API结果如下:
System.NullReferenceException
HResult=0x80004003
Message=未将对象引用设置到对象的实例。
Source=Aspose.PDF
StackTrace:
at #=z6RalRduJVQKd5EZuNVMJuKliYjK8PHg7Gw==.#=z1Dicw3U=(#=zWt4uWkCCK51P5HAIfAcVlTs= #=z69G5rGc=)
屏幕截图 2023-12-15 114904.png (86.7 KB)

17.12.0 版API结果如下:
System.ArgumentException
HResult=0x80070057
Message=路径中具有非法字符。
Source=mscorlib
StackTrace:
at System.IO.Path.CheckInvalidPathChars(String path, Boolean checkAdditional) in System.IO\Path.cs:line 1068
at System.IO.Path.IsPathRooted(String path) in System.IO\Path.cs:line 883
at  .(IDictionary )
at  .()
at  .()
at  . ​(String , FontStyle )
at  .(String , FontStyle , String )
at  . ​(String , Single , FontStyle , String )
at  .(String , Single , FontStyle )
at  ​ …ctor( ​ , String ,  [] , UInt32[] , Boolean , Double , Dictionary`2 , Double  ,   , Double  ,  ​  , Boolean  , Boolean  ,   )
at  .(​ , String ,  , Double )
at  ​ .()
at  ​ …ctor( ​ ,  ​ )
at  .( ​ ,  ​ )
at  …ctor( ,  ,  ​ )
at  .(Document , Page , UnifiedSaveOptions )
at  .(Document ,  & , UnifiedSaveOptions , Int32& )
at  .(Document , Stream , DocSaveOptions )
at Aspose.Pdf.Document.Save(Stream outputStream, SaveOptions options)
at Aspose.Pdf.Document.Save(String outputFileName, SaveOptions options)
at ConsoleApp1.Program.Main(String[] args) in C:\Users\yzswk\Downloads\ConsoleApp1\ConsoleApp1\Program.cs:line 19

image.png (81.2 KB)

image.png (98.4 KB)

@yzswk

感谢您分享反馈和请求的信息。程序在访问特定字体文件时似乎出现问题。请尝试以下两个建议:

1-尝试以管理员身份运行该程序
2-清除API访问的默认字体源,并将字体文件放在不受系统保护的目录中,并在加载PDF文档之前添加以下代码。

FontRepository.Sources.Clear();
FontRepository.Sources.Add(new FolderFontSource("{新字体目录的路径}"));

请让我们知道您按照上述建议得到的结果。

1.以管理员身份运行该程序是同样的结果。
屏幕截图 2023-12-17 101336.png (9.7 KB)

2-清除API访问的默认字体源,并将字体文件放在不受系统保护的目录E:\fonts中,并在加载PDF文档之前添加以下代码。
FontRepository.Sources.Clear();
FontRepository.Sources.Add(new FolderFontSource(“E://fonts//”));
//FontRepository.Sources.Add(new FolderFontSource(“E:\fonts\”));
Document pdfDocument = new Document(“123.pdf”);
DocSaveOptions saveOptions = new DocSaveOptions();
saveOptions.Format = DocSaveOptions.DocFormat.DocX;
saveOptions.Mode = DocSaveOptions.RecognitionMode.Flow;
pdfDocument.Save(“123.docx”, saveOptions);
程序似乎并没有用新的字体目录,仍然读取的windows目录的fonts文件,结果还与以前一样出错。将E:\fonts中的出错字体文件删除,结果仍然显示出错的文件导致的错误"calibri.ttf\0\0\0\0\0偓?O\u0003\0€"。
程序是在 pdfDocument.Save(“123.docx”, saveOptions);才读取字体目录的,并没有到读取e:\fonts目录的环节便出错了。
屏幕截图 2023-12-17 111014.png (59.6 KB)

@yzswk

感谢您分享结果。该问题看起来与字体和特定系统配置有关。不过,我们已在内部问题跟踪系统中打开以下新票证,并将根据 Free Support Policies 中提到的条款提供修复。

问题 ID:PDFNET-56169

如果您需要优先支持,以及直接联系我们的付费支持管理团队,您可以获取 Paid Support Services