Foros del Web » Programación para mayores de 30 ;) » Programación General »

[SOLUCIONADO] Crear PDF con Font Type 3

Estas en el tema de Crear PDF con Font Type 3 en el foro de Programación General en Foros del Web. Hola gente, pongo esto acá porque no tengo ni idea de donde puede encajar. Estoy programando un pdf a mano (una pésima idea, pero la ...
  #1 (permalink)  
Antiguo 09/07/2015, 21:50
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años
Puntos: 320
Crear PDF con Font Type 3

Hola gente, pongo esto acá porque no tengo ni idea de donde puede encajar.

Estoy programando un pdf a mano (una pésima idea, pero la historia es larga), la cosa es que necesito crear un pdf cuyo "código fuente" sea solo texto plano, sin incluir blobs binarios ni objetos comprimidos, que muestre una frase que tenga embebida una fuente de type 3 con 11 caracteres.

Agarre el manual de pdf en la pagina 261 (la 269 del pdf) donde aparece un ejemplo basico de una fuente type 3 que usa un cuadrado para la letra A y un triangulo para la letra B.
Me dispuse a copiarlo y a ponerlo en marcha, pues eso es prácticamente lo que necesito, pero no hay caso, no logro que funcione.
Me lei este tutorial en español (que de tutorial no tiene nada, es una traduccion del manual anteriormente citado) pero tampoco logre que anduviera, googlemando encontre esto que esta relacionado pero no aclara mis dudas.

Tengo dos codigos, el primero es un PDF de hola mundo, este si funciona bien:
Código PDF:
Ver original
  1. %PDF-1.4
  2. 1 0 obj <</Type /Catalog /Pages 2 0 R>>
  3. endobj
  4. 2 0 obj <</Type /Pages /Kids [3 0 R] /Count 1>>
  5. endobj
  6. 3 0 obj <</Type /Page /Parent 2 0 R /Resources 4 0 R /MediaBox [0 0 500 800] /Contents 6 0 R>>
  7. endobj
  8. 4 0 obj<</Font <</F1 5 0 R>>>>
  9. endobj
  10. 5 0 obj<</Type /Font /Subtype /Type1 /BaseFont /Helvetica>>
  11. endobj
  12. 6 0 obj <</Length 43>> stream BT /F1 24 Tf 175 720 Td (Hola mundo!)Tj ET endstream
  13. endobj
  14. xref
  15. 0 7
  16. 0000000000 65535 f
  17. 0000000009 00000 n
  18. 0000000056 00000 n
  19. 0000000111 00000 n
  20. 0000000212 00000 n
  21. 0000000250 00000 n
  22. 0000000317 00000 n
  23. trailer <</Size 7/Root 1 0 R>>
  24. startxref
  25. 407
  26. %%EOF

Luego, lo que quize hacer es que ese "Hola mundo!" se convirtiera en "Hola bundo!" y mostrara los dichosos graficos usando type 3, tal como en el manual, pero no hay caso, el siguiente codigo es mi mejor intento, es sintacticamente correcto, por lo que no es un pdf dañado, pero no hace nada:
Código PDF:
Ver original
  1. %PDF-1.4
  2. 1 0 obj <</Type /Catalog /Pages 2 0 R>>
  3. endobj
  4. 2 0 obj <</Type /Pages /Kids [3 0 R] /Count 1>>
  5. endobj
  6. 3 0 obj <</Type /Page /Parent 2 0 R /Resources 4 0 R /MediaBox [0 0 500 800] /Contents 6 0 R>>
  7. endobj
  8. 4 0 obj <</Font <</F1 7 0 R>>>>
  9. endobj
  10. 5 0 obj <</Type /Font /Subtype /Type1 /BaseFont /Helvetica>>
  11. endobj
  12. 6 0 obj <</Length 43>> stream BT /F1 24 Tf 175 720 Td (Hola bundo!)Tj ET endstream
  13. endobj
  14. 7 0 obj <</Type /Font /Subtype /Type3 /CharProcs 9 0 R /Encoding 8 0 R /FirstChar 97 /LastChar 98 /Widths [1000 1000]>>
  15. endobj
  16. 8 0 obj <</Type /Encoding /Differences [97 /square 98 /triangle] >>
  17. endobj
  18. 9 0 obj << /square 10 0 R /triangle 11 0 R >>
  19. endobj
  20. 10 0 obj << /Length 38 >>
  21. stream
  22. 1000 0 0 0 750 750 d1 0 0 750 750 re f
  23. endstream
  24. endobj
  25. 11 0 obj << /Length 47 >>
  26. stream
  27. 1000 0 0 0 750 750 d1 0 0 m 375 750 l 750 0 l f
  28. endstream
  29. endobj
  30. xref
  31. 0 12
  32. 0000000000 65535 f
  33. 0000000009 00000 n
  34. 0000000056 00000 n
  35. 0000000111 00000 n
  36. 0000000213 00000 n
  37. 0000000252 00000 n
  38. 0000000320 00000 n
  39. 0000000410 00000 n
  40. 0000000537 00000 n
  41. 0000000612 00000 n
  42. 0000000665 00000 n
  43. 0000000754 00000 n
  44. trailer <</Size 12 /Root 1 0 R>>
  45. startxref
  46. 851
  47. %%EOF

Pero no pasa nada, deberia cambiar la fuente, pero no lo hace.

Probe 4 decenas de variantes mas, pero sin suerte.

Alguien me pude hechar un cable por favor?
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Última edición por NSD; 09/07/2015 a las 22:18
  #2 (permalink)  
Antiguo 10/07/2015, 11:40
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Crear PDF con Font Type 3

¿Esto debe tener alguna codificación especial? porque copiando y pegando el texto en un archivo "test.pdf", obtengo el mismo resultado para ambos ejemplos:

~$ pdftotext test.pdf
Syntax Error (459): Missing 'endstream' or incorrect stream length
Syntax Error (414): Unknown operator 'endobj'
Syntax Error (426): Unknown operator 'obj'
Syntax Error: End of file inside dictionary
Syntax Error: Leftover args in content stream

Ambos archivos se abren como una página en blanco
  #3 (permalink)  
Antiguo 14/07/2015, 17:51
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años
Puntos: 320
Respuesta: Crear PDF con Font Type 3

Hola, no, no requiere codificación especial. Muchas gracias por el interes, ya logre resolverlo, publico aquí la solución:

El problema es que se necesita generar pdf para una factura (incluyendo un código de barras) desde lenguajes antiguos (entiéndase: pascal, cobol, basic, etc) donde no hay muchas herramientas (por no decir ninguna) para tal fin, la solucion mas simple por la que se opto fue por generar un pdf como texto plano y luego desde esos lenguajes abrirlos, reemplazar el contenido y volver a guardarlos, es decir, usarlos como templates.
Los programas de diseño de pdf generan pdfs repletos de blobs binarios comprimidos, si bien es posible descomprimir esos blobs, los resultados siguen siendo muy desfavorables e incluso el texto generado sigue en binario ya que se incluye como curvas y luego se define un diccionario que vincula esas curvas con las letras para permitir su edicion posterior.

Por tal motivo, se opto por generar un pdf a mano que sea solo texto plano.
El problema mas grande fue el codigo de barras, porque debe estar embebido en el pdf ya que se debe mostrar correctamente en cualquier maquina, a continuación, expongo el codigo fuente de un pdf con un codigo de barras embebido que es texto plano solo, si alguien se topa con un problema similar puede utilizarlo.

Código PDF:
Ver original
  1. %PDF-1.4
  2. 1 0 obj <</Type /Catalog /Pages 2 0 R>> endobj
  3. 2 0 obj <</Type /Pages /Kids [3 0 R] /Count 1>> endobj
  4. 3 0 obj <</Type /Page /Parent 2 0 R /Resources 4 0 R /MediaBox [0 0 400 180] /Contents 6 0 R>> endobj
  5. 4 0 obj <</Font <</F1 5 0 R>>>> endobj
  6. 5 0 obj <</Type /Font /Subtype /Type3 /FontBBox [0 0 1100 1100] /FontMatrix [0.0011 0 0 0.0011 0 0] /CharProcs 8 0 R /Encoding 7 0 R /FirstChar 47 /LastChar 59 /Widths [1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100]>> endobj
  7. 6 0 obj <</Length 44>> stream BT /F1 20 Tf 50 100  Td (/0123456789/)Tj ET endstream endobj
  8. 7 0 obj <</Type /Encoding /Differences [47 /sls 48 /nr0 49 /nr1 50 /nr2 51 /nr3 52 /nr4 53 /nr5 54 /nr6 55 /nr7 56 /nr8 57 /nr9] >> endobj
  9. 8 0 obj << /sls 9 0 R /nr0 10 0 R /nr1 11 0 R /nr2 12 0 R /nr3 13 0 R /nr4 14 0 R /nr5 15 0 R /nr6 16 0 R /nr7 17 0 R /nr8 18 0 R /nr9 19 0 R >> endobj
  10. 9 0 obj << /Length 77 >>
  11. stream
  12. 1100 0 0 0 1100 1100 d1 0 0 200 1100 re 400 0 100 1100 re 800 0 100 1100 re f
  13. endstream
  14. endobj
  15. 10 0 obj << /Length 77 >>
  16. stream
  17. 1100 0 0 0 1100 1100 d1 0 0 100 1100 re 300 0 300 1100 re 700 0 200 1100 re f
  18. endstream
  19. endobj
  20. 11 0 obj << /Length 77 >>
  21. stream
  22. 1100 0 0 0 1100 1100 d1 0 0 100 1100 re 300 0 300 1100 re 800 0 200 1100 re f
  23. endstream
  24. endobj
  25. 12 0 obj << /Length 77 >>
  26. stream
  27. 1100 0 0 0 1100 1100 d1 0 0 200 1100 re 400 0 300 1100 re 900 0 100 1100 re f
  28. endstream
  29. endobj
  30. 13 0 obj << /Length 77 >>
  31. stream
  32. 1100 0 0 0 1100 1100 d1 0 0 200 1100 re 400 0 100 1100 re 600 0 300 1100 re f
  33. endstream
  34. endobj
  35. 14 0 obj << /Length 77 >>
  36. stream
  37. 1100 0 0 0 1100 1100 d1 0 0 200 1100 re 400 0 100 1100 re 700 0 300 1100 re f
  38. endstream
  39. endobj
  40. 15 0 obj << /Length 77 >>
  41. stream
  42. 1100 0 0 0 1100 1100 d1 0 0 200 1100 re 300 0 300 1100 re 800 0 100 1100 re f
  43. endstream
  44. endobj
  45. 16 0 obj << /Length 77 >>
  46. stream
  47. 1100 0 0 0 1100 1100 d1 0 0 200 1100 re 400 0 300 1100 re 800 0 100 1100 re f
  48. endstream
  49. endobj
  50. 17 0 obj << /Length 77 >>
  51. stream
  52. 1100 0 0 0 1100 1100 d1 0 0 300 1100 re 400 0 200 1100 re 700 0 300 1100 re f
  53. endstream
  54. endobj
  55. 18 0 obj << /Length 77 >>
  56. stream
  57. 1100 0 0 0 1100 1100 d1 0 0 300 1100 re 400 0 100 1100 re 700 0 200 1100 re f
  58. endstream
  59. endobj
  60. 19 0 obj << /Length 77 >>
  61. stream
  62. 1100 0 0 0 1100 1100 d1 0 0 300 1100 re 500 0 100 1100 re 700 0 200 1100 re f
  63. endstream
  64. endobj
  65. xref
  66. 0 20
  67. 0000000000 65535 f
  68. 0000000009 00000 n
  69. 0000000056 00000 n
  70. 0000000111 00000 n
  71. 0000000213 00000 n
  72. 0000000252 00000 n
  73. 0000000491 00000 n
  74. 0000000582 00000 n
  75. 0000000721 00000 n
  76. 0000000873 00000 n
  77. 0000001000 00000 n
  78. 0000001128 00000 n
  79. 0000001256 00000 n
  80. 0000001384 00000 n
  81. 0000001512 00000 n
  82. 0000001640 00000 n
  83. 0000001768 00000 n
  84. 0000001896 00000 n
  85. 0000002024 00000 n
  86. 0000002152 00000 n
  87. trailer <</Size 19 /Root 1 0 R>>
  88. startxref
  89. 2279
  90. %%EOF

Eso se copia y pega en un archivo txt en blanco y se lo guarda con la extencion .pdf y sale funcionando.

Espero a alguien le sirva. Saludos!
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #4 (permalink)  
Antiguo 15/07/2015, 08:54
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Crear PDF con Font Type 3

muy buena la explicación, ciertamente había visto en alguna ocasión que los PDF podían ser texto plano, pero nunca lo investigué en serio :)
  #5 (permalink)  
Antiguo 15/07/2015, 13:39
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años
Puntos: 320
Respuesta: Crear PDF con Font Type 3

Bueno ya que estoy comparto el resultado final, total no creo volver a utilizarlo nunca mas y tal vez a alguien lo saque del apuro.

No pongo el codigo directamente porque es muy largo para el mensaje, pero si abren el archivo con un editor de texto plano lo pueden ver sin problemas.

Descargar Archivo PDF

Lo unico que tendrian que hacer a la hora de generar una factura nueva es crear una copia del archivo y buscar y reemplazar los parametros por los valores.

En este punto valen algunas aclaraciones:

Los parametros tienen la sintaxis <PXXXX> donde XXXX es un numero de 4 cifras.
Cada parametro, tiene una longitud maxima determinada por el espacio que ocupa ¡No se puede exeder esa longitud o el pdf quedara corrupto!

A la hora de reemplazar el valor del parametro, debe asegurarse que el string a reemplazar tenga la misma longitud que el string de reemplazo, por ejemplo, el parametro <P0008> es la razon social, supongamos que se quiere reemplazar por el valor: "Pirulito Ramirez SRL", el primer paso es determinar la longitud del nuevo valor, en este caso 20, lo siguiente es rellenar el codigo del parametro con espacios en blanco hasta esa longitud, en este caso quedaria: "<P0008> ", luego, se puede proceder a efectuar el reemplazo de forma segura entre los string "<P0008> " y "Pirulito Ramirez SRL".

Para alinear un texto, se debe hacer de forma manual, rellenando con espacios en blanco la zona sobrante, por ejemplo, supongamos que se tiene el total de la factura: "$10.345,21" y quiere que se muestre alineado a la derecha, el parametro <P0014> tiene como longitud maxima 22, por lo tanto, teniendo en cuenta que la longitud del total a reemplazar es de 10 caracteres, se deben agregar a este total, 12 caracteres en blanco al inicio y luego efectuar el reemplazo, en este caso quedarian los string: " $10.345,21" y "<P0014> "

A continuacion se muestra una tabla con las longitudes maximas de cada campo, en los que figura una X puede ser cualquier digito:
<P0001> | 7
<P0002> | 16
<P0003> | 40
<P0004> | 40
<P0005> | 40
<P0006> | 40
<P0007> | 40
<P0008> | 164
<P0009> | 164
<P0010> | 57
<P0011> | 57
<P0012> | 51
<P0013> | 51
<P0014> | 22
<P0015> | 67
<P0016> | 67
<P6XX1> | 16
<P6XX2> | 16
<P6XX3> | 81
<P6XX4> | 16
<P6XX5> | 20
<P6XX6> | 32
<P1001> | 21
<P1002> | 21
<P1003> | 21
<P1004> | 26
<P1005> | 26
<P9001> | 48
<P9002> | 99
<P9003> | 99
<P9004> | 99
<P9005> | 49
<P9006> | 49
<P9007> | 49
<P9008> | 49
<P9009> | 37
<P9010> | 37
<P9011> | 37
<P9012> | 37
<P9013> | 37
<P9014> | 37
<P9015> | 16
<P9016> | 16
<P9017> | 80
<P9018> | 16
<P9019> | 19
<P9020> | 31
<P9021> | 20
<P9022> | 20
<P9023> | 20
<P9024> | 26
<P9025> | 26
<P9026> | 20
<P9027> | 30
<P9028> | 30
<P9029> | 37
<P9030> | 37
<P9031> | 62
<P9032> | 58

Se puede crear una funcion "alinear" que reciba una alineacion, el parametro y el valor nuevo, y se encargue de rellenar con espacios en blanco basandose en la tabla anterior y otra funcion "reemplazar" que reciba el parametro y el valor nuevo ya alineado y complete el nombre del parametro con espacios en blanco a la derecha hasta igualar la longitud del valor y luego reemplace el texto.

El codigo de barras se genera solo, si bien asi como esta el archivo no aparece el codigo de barras, en el codigo fuente aparece el parametro <P0015> dos veces, el cual tenes que reemplazar por el el numero que quieras mostrar encerrado entre "/", la barra es equivalente a los "*", pasa que a la hora de embeber la fuente elegi la "/" porque su codigo ascii esta antes del "0" y si elegia el "*" tenia que meter todos los caracteres que estaban en el medio también, lo cual es bastante tedioso de hacer a mano.

Esa es basicamente la idea. Saludos.

EDITO: En el foro no se ven correctamente todos los espacios de los ejemplos, ya que cuando hay varios espacios adyacentes los muestra como uno solo, ojo con eso no se confundan!
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Etiquetas: font, pdf, programa, type
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:39.