Azhar Iqbal SE Ответов: 4

Проблема со шрифтом при экспорте в PDF из кода позади без ReportView в Crystal Report 11


Я использую crystal reports 11 с visual studio 2008. У меня есть требование экспортировать отчет непосредственно в PDF(v9) из кода позади. Я использую windows 7 и установил необходимые шрифты Unicode (урду/арабский).
Когда я экспортирую отчет из средства просмотра отчетов в PDF, то все шрифты урду отображаются в правильном порядке, но когда я обхожу средство просмотра отчетов, то у меня есть проблема со шрифтами и они не отображаются в правильном порядке.
Я использовал следующий код для экспорта в PDF из кода позади.

        //getReportDocument(); this function will return ReportDocument  object
        ReportDocument repDoc = getReportDocument();
        Response.Buffer = false;
        Response.ClearContent();
        Response.ClearHeaders();
        try
        {
repDoc.ExportToHttpResponse(ExportFormatType.PortableDocFormat, Response, true, "Customers");
            
        }  

Я тоже попробовал ExportToDisk, но тщетно.

Мой вопрос заключается в том, что я хочу встроить правильный шрифт в PDF для правильного отображения данных.

Мы будем признательны за любую немедленную помощь.

С уважением

Ажар Икбал

ShaikhM

Насколько я знаю, crystal reports поддерживает только шрифты True Type.
Проверьте ссылку, чтобы понять разницу между обоими шрифтами
( http://answers.yahoo.com/question/index?qid=20080621145425AAuKtgk ).
Шрифт, который вы используете, может быть шрифтом открытого типа, который CR не поддерживает. Просто для тестирования попробуйте использовать шрифт True type и посмотрите, печатается ли PDF, если это не так, то проблема может быть не в шрифтах, а в чем-то другом.

4 Ответов

Рейтинг:
22

Azhar Iqbal SE

Я добавляю два ключа в реестр и моя проблема решена

HKCR\Software\Business Objects\Suite 11.5\Crystal Reports\Export\PDF\ForceLargerFonts
Type: DWORD
Recognized Values: 0,1
Default Value: 1
Creation Method: manual

HKLM\Software\Business Objects\Suite 11.5\Crystal Reports\Export\PDF\ForceLargerFonts
Type: DWORD
Recognized Values: 0,1
Default Value: 1
Creation Method: manual


Спасибо за помощь.


Рейтинг:
2

Member 9140850

я думаю, что вы должны создать путь для pdf-шрифтов в ur crystal reports tool..и установить pdf-шрифт, тогда, возможно, проблема ur будет решена..


Рейтинг:
1

Ron Schuler

Если вам нужно использовать TTF-версию шрифта для экспорта PDF и вы не хотите, чтобы он был установлен на коробке (возможно, бизнес использует версию OTF для всего остального), вы можете программно добавить шрифт TTF в память вашего процесса (только область применения) и удалить конфликтующие шрифты OTF. Он будет работать только на экспорт. Команды просмотра и печати не используют шрифты, установленные в памяти процесса.

1. Добавить TTF файлы в проект в качестве ресурсов (добавления ресурсов --&ГТ; добавить существующий файл)
2. Добавьте методы и классы ниже, чтобы проверить наличие необходимых имен шрифтов и установить/удалить шрифты перед экспортом объекта Crystal Report в PDF

Dim RequiredFontNames As New List(Of String)
Dim RequiredFontFileNames As New List(Of String)
Dim ConflictingFontFileNames As New List(Of String)

RequiredFontNames.Add("Gotham-Book")
RequiredFontNames.Add("Gotham-Medium")
RequiredFontFileNames.Add("GOTHMBOK.TTF")
RequiredFontFileNames.Add("GOTHMLIG.TTF")
RequiredFontFileNames.Add("GOTHMLIT.TTF")
RequiredFontFileNames.Add("GOTHMMED.TTF")
RequiredFontFileNames.Add("GOTHMMIT.TTF")
RequiredFontFileNames.Add("GOTHMZIT.TTF")
ConflictingFontFileNames.Add("Gotham-Book.otf")
ConflictingFontFileNames.Add("Gotham-BookItalic.otf")
ConflictingFontFileNames.Add("Gotham-Light.otf")
ConflictingFontFileNames.Add("Gotham-LightItalic.otf")
ConflictingFontFileNames.Add("Gotham-Medium.otf")
ConflictingFontFileNames.Add("Gotham-MediumItalic.otf")

  Private Function CheckForRequiredFonts(Optional ByVal manageFonts As Boolean = False) As Boolean
    Dim hasRequiredFonts As Boolean = True
    If manageFonts Then
      FontUtil.RemoveFontFiles(ConflictingFontFileNames)
    End If

    For Each item As String In RequiredFontNames
      If FontUtil.FontExists(item) = False Then
        mReasonForFailure = String.Format("The font '{0}' is not installed on your system.", item)
        hasRequiredFonts = False
        Exit For
      End If
    Next
    If Not hasRequiredFonts And manageFonts Then
      Try
        FontUtil.InstallFontFiles(RequiredFontFileNames)
        hasRequiredFonts = True
        mReasonForFailure = ""
      Catch ex As Exception
        mReasonForFailure &= vbCrLf & "Required font files failed to install."
      End Try
    End If
    Return hasRequiredFonts
  End Function


Imports System.Drawing.Text
Imports System.Drawing
Imports System.Runtime.InteropServices

Public Class FontUtil

  <DllImport("gdi32.dll")>
  Private Shared Function RemoveFontResource(lpFileName As String) As Boolean
  End Function

  <DllImport("gdi32.dll")>
  Private Shared Function AddFontMemResourceEx(pbFont As IntPtr, cbFont As UInteger, pdv As IntPtr, <[In]> ByRef pcFonts As UInteger) As IntPtr
  End Function

  Public Shared Function FontExists(fontName As String) As Boolean
    Dim ifc As New InstalledFontCollection()
    For Each item As FontFamily In ifc.Families
      If item.Name = fontName Then
        Return True
      End If
    Next
    Return False
  End Function

  Public Sub AddFontResource(ByVal resourceName As String)
    Dim fontStream As IO.Stream = Me.GetType().Assembly.GetManifestResourceStream(resourceName)

    'create an unsafe memory block for the data
    Dim data As System.IntPtr = Marshal.AllocCoTaskMem(CInt(fontStream.Length))
    'create a buffer to read in to
    Dim fontData As [Byte]() = New [Byte](fontStream.Length - 1) {}
    'fetch the font program from the resource
    fontStream.Read(fontData, 0, CInt(fontStream.Length))
    'copy the bytes to the unsafe memory block
    Marshal.Copy(fontData, 0, data, CInt(fontStream.Length))

    ' We HAVE to do this to register the font to the system 
    Dim cFonts As UInteger = 0
    AddFontMemResourceEx(data, CUInt(fontData.Length), IntPtr.Zero, cFonts)

    'close the resource stream
    fontStream.Close()
    'free the unsafe memory
    Marshal.FreeCoTaskMem(data)
  End Sub

  Public Shared Sub InstallFontFiles(ByVal fontFileNameList As List(Of String))
    Dim assemblyName As String = "MyAssembly.ReportLib." 'This need to be the namespace of your assembly with trailing period
    Dim myFontUtil As New FontUtil
    For Each fileName In fontFileNameList
      myFontUtil.AddFontResource(assemblyName & fileName) 'All resource stream names start with the assembly namespace 
    Next
  End Sub

  Public Shared Sub RemoveFontFiles(ByVal fontFileNameList As List(Of String))
    For Each fileName In fontFileNameList
      Dim isDeleted As Boolean = RemoveFontResource(fileName)
    Next
  End Sub

End Class


Рейтинг:
0

ShaikhM

Я уверен, что это связано с шрифтами открытого типа и шрифтами истинного типа.
Как я уже упоминал в комментарии выше, попробуйте использовать шрифт True type и посмотрите, печатается ли PDF.

Проверьте следующую ссылку потока из самого SAP.

http://scn.sap.com/thread/2076266#10817872[^]

Вы должны быть в состоянии преобразовать шрифт в TrueType, а затем запустить его снова.


[no name]

Спасибо за вашу помощь.
У меня есть шрифты ttf.
Я даю шрифт "Jameel Noori Nastaleeq 2.ttf" в поле во время разработки в crystal report, и он генерирует правильный шрифт для меня, но его размер уменьшается.
Что я должен сделать, чтобы иметь правильный размер?
Спасибо снова.

ShaikhM

Хорошо. Так что, по крайней мере, вы знаете, что ваш шрифт работает. Что касается размера, я бы посоветовал вам попробовать разные размеры, а также попытаться включить достаточно места в текстовое поле, чтобы текст поместился в нем. Поиграй с ним еще немного, потому что именно так я бы и поступил.