解决 使用Winform使用iText7创建PDF

LabProARW

成员
已加入
2019年11月4日
留言内容
22
编程经验
1-3
这太逼我了":-(在FrmCreatePDF上是Btn_GeneratePDF。下面从CodeGuru稍作修改后的代码片段会抛出一个"NULL REFERENCE对象引用未设置为对象的实例"。错误被抛出"document.Add(header);"。那么“文档”是一个新对象吧?另外,“标头”是新的Paragraph对象吗?那么为什么这段代码对我不起作用?

提前致谢。

Create PDF:
        private void Btn_GeneratePDF_Click(object sender, EventArgs e)
        {
            String pdfDestination = "C:/users/rickw/source/repos/QC-Base/PDFs/example.pdf";
            PdfWriter myPDFwriter = new PdfWriter(pdfDestination);
            PdfDocument pdfDoc = new PdfDocument(myPDFwriter);
            Document document = new Document(pdfDoc);
            Paragraph header = new Paragraph("HEADER")
            .SetTextAlignment(TextAlignment.CENTER)
            .SetFontSize(20);
            document.Add(header);
            document.Close();
        }
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,536
地点
弗吉尼亚州切萨皮克
编程经验
10+
The only true way to find out is to use your debugger. When the exception is thrown, use the debugger to see if 文档 or if header is null.
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,536
地点
弗吉尼亚州切萨皮克
编程经验
10+
另外,“标头”是新的Paragraph对象吗?
不必要。该行的完整代码为:
C#:
Paragraph header = new Paragraph("HEADER").SetTextAlignment(TextAlignment.CENTER).SetFontSize(20);

By the fluent interfaces convention, SetFont() should return the this reference, but bugs and typos do happen. Someone could have goofed.
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,536
地点
弗吉尼亚州切萨皮克
编程经验
10+
我不明白你的意思"is what is grayed".

请单击Visual Studio引发的异常详细信息,然后复制并粘贴异常的完整调用堆栈(以文本形式,而不是屏幕截图)
 

LabProARW

成员
已加入
2019年11月4日
留言内容
22
编程经验
1-3
我不明白你的意思"is what is grayed".

请单击Visual Studio引发的异常详细信息,然后复制并粘贴异常的完整调用堆栈(以文本形式,而不是屏幕截图)
VS 2019 IDE选择灰色来突出显示“文档”一词。以下是“复制详细信息”提供的内容。我不知道如何粘贴完整的调用堆栈。我所能做的就是对细节进行截屏,这是您不想要的。

System.NullReferenceException
HResult=0x80004003
Message =对象引用未设置为对象的实例。
Source=itext.io
StackTrace:
在iText.IO.Font.FontCache..cctor()

下面是箭头指向调用堆栈的位置。
itext.io.dll!iText.IO.Font.FontCache.FontCache()
 

LabProARW

成员
已加入
2019年11月4日
留言内容
22
编程经验
1-3
VS Options >调试,常规和检查"Enable Just My Code"-并尝试再次运行。
我不明白这一点,但是它确实允许代码运行并看起来可以工作。那么,我只想启用我的代码又会牺牲什么呢?为什么这样做可以创建PDF?
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,050
地点
挪威
编程经验
10+
这是默认设置,请参阅 使用Just My Code调试用户代码-Visual Studio
在这种情况下(尝试调试非用户代码时),该行将突出显示为绿色(在链接的文章中有解释),这意味着这是在外部库中处理的常见机会(常见)。 VS调试器在此处停止的原因是,启用CLR异常NullRefenceException可以在抛出“异常”设置时引发中断。
换句话说,这不是问题,您应该使用默认设置仅调试您自己的用户代码。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,536
地点
弗吉尼亚州切萨皮克
编程经验
10+
*叹**发生了什么事,您已经在Visual Studio中停止了设置 全部 异常-甚至可能由您引入的代码处理的异常。

当您切换到"Just My Code",调试器现在将忽略其他人代码中的异常,除非未处理。显然,在上述情况下,您要引入的库可以处理该异常。

通常,编写良好的代码不会将异常用作流控制的手段,因此这应该不是问题。异常仅应用于真正的异常错误情况,而不是可以处理的错误。

不幸的是,有些代码不是用这种原理编写的。相反,他们使用异常来传达错误。看起来与上面的情况类似,并且正在引发异常以指示内部数据结构称为"FontCache"无法创建。
 

LabProARW

成员
已加入
2019年11月4日
留言内容
22
编程经验
1-3
*叹**发生了什么事,您已经在Visual Studio中停止了设置 全部 异常-甚至可能由您引入的代码处理的异常。

当您切换到"Just My Code",调试器现在将忽略其他人代码中的异常,除非未处理。显然,在上述情况下,您要引入的库可以处理该异常。

通常,编写良好的代码不会将异常用作流控制的手段,因此这应该不是问题。异常仅应用于真正的异常错误情况,而不是可以处理的错误。

不幸的是,有些代码不是用这种原理编写的。相反,他们使用异常来传达错误。看起来与上面的情况类似,并且正在引发异常以指示内部数据结构称为"FontCache"无法创建。
非常感谢您的合理解释!我将发表一篇有关在PDF上放置元素的新文章。
 
最佳 底部