2013-10-11 36 views
2

我想用iText創建一個PDF/A-1A文件,但我無法繞過經典的Helvetica錯誤,但我無法弄清楚如何解決它。 下面的代碼:必須嵌入所有字體。這一個不是: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 

如果您有任何問題,只是問我。我希望你能幫助我。

Regards

Nadix。

回答

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")) 
+0

你會這麼好心並解釋或發送每個電子郵件的整個代碼? – Nadix

+0

我不知道你還需要什麼。如果您希望符合PDF/A-1A標準,則基本上需要始終使用'New Paragraph()'和您之前嵌入的字體。本身,'document.Add(New Paragraph(「Hello world」))'使用未嵌入的系統默認值。 –

+0

好吧,我現在已經把所有東西都拿到了,它正在工作。非常感謝你的幫助! :) – Nadix

相關問題