3

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

如果你有问题,就问我。我希望你能帮助我。

问候

纳迪克斯。

4

1 回答 1

1

简短的回答是您已经知道,所有字体都必须嵌入,即使是“核心 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"))
于 2013-10-11T13:25:42.150 回答