vb.net - 必须嵌入所有字体。这个不是 : Helvetica

标签 vb.net itextsharp itext

我想用 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/

相关文章:

c# - vb.net 中的 Asp 标签不捕获在 javascript 中修改的标签文本

java - 在 Struts-2 中使用 iText 生成 PDF : result type stream not working

android - 想要创建一个 pdf,其表单具有矩形作为页眉和页脚中的段落以及正文中的部分

c# - iTextSharp - 如何获取单词在页面上的位置

java - 如何在 java 中读取波斯语 pdf 文件

javascript - Javascript 中的撇号和双引号问题

vb.net - 为枚举值添加前缀有什么好处吗?

vb.net - 代码无响应

pdf - 如何找到以编程方式生成的 PDF 的问题?

c# - itextsharp 测量 block 宽度/高度