我想用 iText 创建一个 PDF/A-1A 文件,但我无法解决经典的 Helvetica 错误,但我不知道如何修复它。 这是代码:
Imports iTextSharp.text.pdf
Imports iTextSharp.text
Imports System.IO
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim document As Document = New Document(PageSize.A4)
Dim writer As PdfAWriter = PdfAWriter.GetInstance(document, New FileStream("./Test.pdf", FileMode.Create), PdfAConformanceLevel.PDF_A_1A)
writer.CreateXmpMetadata()
document.Open()
'The sRGB File is located in my Resources.'
Dim icc = ICC_Profile.GetInstance(My.Resources.sRGB)
writer.SetOutputIntents("Custom", "", "http://www.color.org", "sRGB IEC61966-2.1", icc)
Dim fonts As Font = FontFactory.GetFont("./FreeSansBold.ttf", BaseFont.WINANSI, BaseFont.EMBEDDED, 10)
Dim normal9 As Font = FontFactory.GetFont("./FreeSans.ttf", BaseFont.WINANSI, BaseFont.EMBEDDED, 9)
Dim bold9 As Font = FontFactory.GetFont("./FreeSansBold.ttf", BaseFont.WINANSI, BaseFont.EMBEDDED, 9)
Dim normal8 As Font = FontFactory.GetFont("./FreeSans.ttf", BaseFont.WINANSI, BaseFont.EMBEDDED, 8)
document.Add(New Paragraph("Hello world"))
writer.Close()
document.Close()
End Sub
End Class
有问题可以问我。我希望你能帮助我。
问候
纳迪克斯。
最佳答案
简短的回答是你已经知道的,所有字体都必须嵌入,即使是“核心 PDF 字体”。
较长的答案是 iText 不是 PDF 渲染器,因此不需要核心 PDF 字体,至少不需要。根据标准,所有符合标准的渲染器都必须提供这些字体(或适当的替换),因此 iText 没有理由包含它们。 (更不用说任何潜在的许可问题。)它确实附带了 AFM 文件,其中包含字体指标,但这只是为了弄清楚如何布局文本。
解决方案是始终声明、嵌入和使用您自己的字体。您可以购买嵌入式 Helvetica 的许可证,并在需要时使用它。目前无法设置文档范围的默认字体,因此您要么需要始终指定字体,要么想出一个包装器。一种方法是只使用辅助方法:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
''//Register our font
FontFactory.Register(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "ARIALUNI.TTF"), "Arial Unicode MS")
End Sub
Public Shared Function CreateParagraph(text As String) As Paragraph
Static ArialUnicode = FontFactory.GetFont("Arial Unicode MS", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 20)
Return New Paragraph(text, ArialUnicode)
End Function
另一种方法是继承 Paragraph
Public Class ParagraphArial
Inherits iTextSharp.text.Paragraph
Public Shared ReadOnly Property ThisFont As Font
Get
Return FontFactory.GetFont("Arial Unicode MS", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 20)
End Get
End Property
Public Sub New(text As String)
MyBase.New(text, ThisFont)
End Sub
End Class
两者都可以这样使用:
document.Add(CreateParagraph("Hello world"))
document.Add(New ParagraphArial("Second Test"))
关于vb.net - 必须嵌入所有字体。这个不是 : Helvetica,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19315917/