2010-11-20 59 views
23

Antecedentes:¿Cómo incrusto las fuentes en un PDF existente?

Tengo PDF's Estoy generando mediante programación. Necesito poder enviar el PDF directamente a una impresora desde el servidor (no a través de una aplicación intermedia). Por el momento, puedo hacer todo lo anterior (generar PDF, enviar a la impresora), pero debido a que las fuentes no están incrustadas en el PDF, la impresora está sustituyendo la fuente.

Por qué las fuentes no se incrustan cuando se generaron:

estoy creando utilizando SQL Reporting Services de PDF de 2008. No es un problema conocido con SQL Reporting Services en que no va a incrustar fuentes (a menos que una serie de requisitos se cumplen - http://technet.microsoft.com/en-us/library/ms159713%28SQL.100%29.aspx). No me preguntes por qué, el PDF cumple con todos los requisitos enumerados de MS y las fuentes siguen apareciendo como no incrustadas: no existe un control real sobre si las fuentes están incrustadas, así que acepté que esto no funcionaba y continué. . La solución sugerida de Microsoft (http://blogs.msdn.com/b/donovans/archive/2007/07/20/reporting-services-pdf-renderer-faq.aspx en "Cuándo incrustados los servicios de informes") es procesar el PDF para incrustar manualmente las fuentes.

Objetivo Tome un documento PDF ya generado, programáticamente 'ábralo' e incruste las fuentes, vuelva a guardar el PDF.

Enfoque me señaló hacia iTextSharp, pero la mayoría de los ejemplos son para la versión de Java y estoy teniendo problemas para traducir a la versión iTextSharp (no puedo encontrar ninguna documentación para iTextSharp).

Estoy trabajando en esta publicación para lo que necesito hacer: Itext embed font in a PDF.

Sin embargo, por mi vida, parece que no puedo usar el objeto ByteArrayOutputStream. Parece que no puede encontrarlo. Investigué e investigé pero nadie parece decir en qué clase está o dónde lo encuentro, así que puedo incluirlo en las declaraciones de uso. Incluso he descifrado Reflector abierto y parece que no puedo encontrarlo en ningún lado.

Esto es lo que tengo hasta ahora y compila etc. etc. (el resultado es mi byte [] del PDF generado).

PdfReader pdf = new PdfReader(result);    
BaseFont unicode = BaseFont.CreateFont("Georgia", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 
// the next line doesn't work as I need a ByteArrayOutputStream variable to pass in 
PdfStamper stamper = new PdfStamper(pdf, MISSINGBYTEARRAYOUTPUTSTREAMVARIABLE); 
stamper.AcroFields.SetFieldProperty("test", "textfont", unicode, null); 
stamper.Close(); 
pdf.Close(); 

Entonces, ¿puede cualquier persona, sea que me ayude con el uso de iTextSharp incrustar fuentes en un archivo PDF o me punto en la dirección correcta?

Estoy más que feliz de utilizar cualquier otra solución que no sea iTextSharp para completar este objetivo, pero debe ser gratuita y puede ser utilizada por una empresa para una aplicación interna (es decir, Affero GPL).

+0

¿Podría dar los nombres de las fuentes que necesita para incrustar? (Algunas fuentes tienen licencias que no permiten la incrustación, y la mayoría del procesamiento de PDF o la creación de software respeta las banderas respectivas en los archivos de fuentes y elige no incrustarlas ...) –

+0

¡Claro! Georgia y Calibri: he comprobado que tenemos versiones TrueType y (bueno, según Windows) ambos tienen la etiqueta 'Embedability de la fuente' configurada como 'Editable'. ¿Debo entender que esta es la configuración correcta? ¡Gracias por cualquier ayuda! – hanzworld

+0

Para cualquiera que lea esto más adelante, ambos métodos funcionaron. SQL Reporting Services finalmente incrustó las fuentes correctamente después de muchas actualizaciones/revisiones y podría enviarse directamente a la impresora. Adicionalmente, llamado Ghostscript usando ProcessInfo desde .NET podría postprocesar el PDF. – hanzworld

Respuesta

29

Puede que esta no sea la respuesta que está buscando (ya que quiere que sus problemas se resuelvan mediante programación, no mediante una herramienta externa).

Pero puede utilizar Ghostscript línea de comandos para incrustar fuentes que faltan en retrospectiva a archivos PDF que no los han incrustado:

gs \ 
    -sFONTPATH=/path/to/fonts:/another/dir/with/more/fonts \ 
    -o output-pdf-with-embedded-fonts.pdf \ 
    -sDEVICE=pdfwrite \ 
    -dPDFSETTINGS=/prepress \ 
    input-pdf-where-some-fonts-are-not-embedded.pdf 

Una cosa importante es que las fuentes no están disponibles en uno de los directorios que apunta el interruptor -sFontPath=....

+0

¡Hola, gracias por esto! Tuve un rápido avance para ver el resultado de esto, y el PDF de edición de salida sí tiene fuentes incrustadas, ¡pero ha sustituido todas las fuentes con Helvetica! No puedo entender cómo corregir esto. ¿Algunas ideas? – hanzworld

+1

@hanzworld: ¿Puede proporcionar la salida de 'pdffonts.exe original.pdf' y' pdffonts.exe processed.pdf'? ('pdffonts.exe' es parte de las utilidades de CLI de XPDF disponibles aquí: http://www.foolabs.com/xpdf/download.html –

+0

PDF original: nombre de tipo emb objeto sub uni ID ------- ---------------- ----------- --- --- --- --------- Calibri TrueType no no no 3 0 Georgia, BoldItalic TrueType no no no 4 0 Calibri, Bold TrueType no no no 5 0 Georgia, Italic TrueType no no no 9 0 – hanzworld

8

Además de Ghostscript, también es posible usar Poppler y Cairo.Hay un comando pdftocairo de Poppler que convierte PDF a PDF a través de pdftocairo -pdf input.pdf output.pdf. También considera las sustituciones de fuentes establecidas en un archivo de configuración Fontconfig. Esto es muy útil si no tiene todas las fuentes en su sistema a las que se hace referencia en un archivo PDF, pero sepa qué otra fuente que ha instalado es un reemplazo atractivo. Después del procesamiento, la fuente de sustitución está incrustada.

+1

+ 1: - - ¡Oye, no lo sabía! :-) Confiaré por ahora en que funciona como describes. Lo probaremos más tarde. Pero si no funciona, tendré que recuperar mi copia de nuevo ... :-) –

+0

Esto es mucho más fácil que usar 'gs', incluso podría recordar este comando. – fission

+1

Esto funciona genial. Solo una nota para usuarios de Windows cygwin: si intentas ejecutar esto en cygwin, puedes usar una fuente diferente cambiando el aspecto de la imagen. Usar [Poppler para Windows] (http://blog.alivate.com.au/poppler-windows/) desde un símbolo del sistema estándar funciona muy bien. Gracias por publicar esta respuesta. – zelanix

Cuestiones relacionadas