2010-06-14 14 views
6

que estoy tratando de hacer que el contenido del PDF a un contexto de dispositivo GDI (un mapa de bits de 24 bits para ser exactos). Analizar el flujo de PDF en objetos PDF y renderizar los comandos PDF del diccionario de contenido funciona bien, incluida la representación de fuentes.alterar una fuente TrueType incrustada por lo que será usado por Windows GDI

fuentes incrustadas se descomprimen sus corrientes fontfile y "cargado" usando AddFontMemResourceEx. Ahora, algunas fuentes incrustadas eliminan algunas tablas TrueType que necesita GDI, como la tabla 'nombre'. Debido a esto, traté de modificar la fuente analizando la fuente del subconjunto TrueType en sus tablas y modificar aquellas tablas que tienen datos faltantes/las tablas que faltan se regeneran con la información más correcta posible.

use la herramienta de Microsoft Font Validator para ver cómo "corregir" la fuente generada es. Todavía obtengo algunos errores, como para la tabla maxp, los valores máximos suelen ser demasiado grandes (es un subconjunto) o el campo xAvgCharWidth no es igual al valor calculado de la tabla 'OS/2' no es correcto, pero esto no detener el uso de otras fuentes incrustadas. Las fuentes incrustadas con PDFCreator son las que son problemáticas.

Preguntas:

  1. ¿Cómo puedo determinar lo que necesito cambio en el archivo de fuente con el fin de GDI para poder usarlo?
  2. ¿Hay otras herramientas de validación de fuentes que me puedan dar una idea de en lo que todavía está mal con el archivo de fuentes ?

Si es necesario: puedo hacer que un archivo de fuentes original y un archivo de fuentes modificado estén disponibles para su descarga en alguna parte.

¿Qué modificaciones se realizan hasta el momento:

  • Asegúrese de que hay una 'cabeza', 'hhea', 'maxp' y la sección 'OS/2'.
  • Si tenemos una fuente de símbolo, elimine los campos Panose y Unicode en la sección 'OS/2'
  • Complete los valores correctos para WInAscent/Desc y TypoAsc/Desc si son cero.
  • Complete los valores aceptables para las posiciones y tamaños super/subíndice/subrayado.
  • Escanee todos los glifos que quedan para completar los valores X/Y min/max en la cabeza.
  • Reconstruye la sección de nombre con información del archivo PDF de donde vino.
+0

PDFCreator se basa en Ghostscript para producir el PDF. La entrada de PDFCreator es PostScript, que (en Windows) generalmente se origina como salida de un controlador de impresora PostScript (la mayoría de las veces, el controlador PS de Adobe). Entonces, la pregunta es: ¿tienes el control total de tu flujo de trabajo? ¿O tiene que procesar archivos PDF generados por un PDFCreator en algún lugar, en algún momento fuera de su control? Si tiene el control total, puede configurar su flujo de trabajo de PDFCreator para incrustar las fuentes TrueType originales utilizadas por el formato de documento original (no PostScript), en lugar de hacer que el flujo de trabajo convierta las fuentes a PS Type1. –

+0

@pipitas: Los archivos PDF de origen se consideran "fuera de nuestro control". Actualmente tenemos una guía que dice: al usar PDFCreator, no use fuentes incrustadas. La razón principal por la que * realmente * quiero resolver este problema es la plena comprensión de los requisitos de carga de fuentes TrueType en Windows. Si puedo usar GDI para dibujar mi texto, puedo evitar depender de otros dlls, bibliotecas con sus licencias y problemas de patentes, etc. Pero al final me gusta mucho resolver este tema molesto aunque ahora está más abajo en la lista de prioridades debido a la directriz. –

+0

Bueno, si su problema ocurre principalmente con la salida de PDFCreator, pero no se le permite "arreglar" la causa de ese problema en su raíz (mediante una estúpida pauta que dice "No haga para sus archivos PDF lo que todos los esfuerzos recientes de estandarización [ PDF/X, PDF/A] recomendado [a saber, incrustando fuentes]! ", Entonces estoy perplejo ... –

Respuesta

3

A casi un año de retraso, pero he encontrado la respuesta:

El tipo de letra (símbolo o no) debe ser el mismo para la tabla 'CMAP' y la tabla 'nombre'. Entonces, si el cmap tiene un 3,0,4 cmap (MS, symbol, segment delta coding) y la tabla de nombres contiene 3,1, $ 0409 (MS, Unicode, enUS) entradas, la fuente no se cargará.

Parece que la presencia de un 'símbolo cmap' determina si la fuente se considera una fuente de símbolos por Windows; las banderas en 'OS/2' no parecen importar.

Así que si una fuente parece correcta usando 'Microsoft Font Validator', verifique si los campos de símbolo/unicode se alinean en las tablas 'cmap' y 'name'.

+0

Estaba mirando y parece que WPF puede tener esto también en .NET 4.0 usando 'PresentationCore' como referencia: http://msdn.microsoft.com/en-us/library/system.windows.media.glyphtypeface .symbol.aspx –

+0

No tengo una amplia experiencia con WPF, pero parece/parece que se pueden usar fuentes OpenType que no tienen cmap y se abordan los glifos en glyphid. Si intentas hacerlo en GDI, no funcionará. Gracias por mencionarlo. –

+0

No he profundizado demasiado, pero me encontré con [este documento técnico sobre la selección de fuente en WPF] (http://blogs.msdn.com/b/text/archive/2007/04/23/wpf -font-selection-model.aspx) que es muy detallado al mostrar cómo WPF determina las fuentes de las tablas. Es una lectura interesante. –

3

Con AddMemoryFont en GDI + se puede comprobar que es Status de ningún error en la fuente de memoria, como por ejemplo NotTrueTypeFont.

Una opción para GDI puede ser intentar cargar la fuente incrustada en un documento/formulario usted mismo con TTLoadEmbeddedFont y luego verificar cualquier error devuelto por error messages. Las únicas funciones que proporcionan más información que éste son CreateFontPackage/MergeFontPackage y su error codes, pero no logran ver la forma en que se pueden utilizar en su situación.

Excluyendo todo esto, ¿ha tenido la oportunidad de revisar PDFCreator's source code (suponiendo que esté utilizando el de código abierto en lugar del comercial)?

+0

Esta función/los códigos de estado no proporcionan suficiente información para ver por qué no se considera una fuente válida de tipo verdadero. Intento proporcionar un programa tipográfico de tipo verdadero que cumpla con los requisitos (todas las tablas requeridas están presentes, etc.) pero de alguna manera no veo lo que falta o está mal. Además, utilizo GDI y no GDI +, pero si pudiera obtener la información, lo que necesito cambiar a la fuente y hacer que todo funcione ... En alguna parte de la implementación de GDI para cargar fuentes truetype, el programa de fuente es rechazado y quiero saber por qué entonces puedo modificarlo y usar la fuente incrustada. –

+0

Ah, perdón por el GDI +. Sí, GDI solo verifica una cierta cantidad de cosas. He actualizado la respuesta anterior. –

+0

Probé MergeFontPackage para crear una fuente correcta u obtener algunas indicaciones sobre lo que está mal con ella. Y voila ... no hay errores, tenemos un nuevo archivo de fuente. Lamentablemente no funcionó; Mejor aún, el paquete de fuentes que creó era el mismo byte para byte. Así que esto no me dio la idea de qué era lo que estaba mal con el programa de fuente, además de no rendir un programa de fuente legible. Probaré TTLoadEmbedded para ver lo que eso me trae mañana. –

Cuestiones relacionadas