php - caracteres - tcpdf change encoding
TCPDF UTF-8. Los símbolos lituanos no aparecen (14)
¿Tienes algún problema para leer un personaje como Karnātaka de la base de datos y mostrar como este karn? Taka, quiero decir "?" lo cual no queremos entonces hacer lo siguiente:
Definir charset para la conexión (
mysql_set_charset()
):$con = mysql_connect("localhost","root",""); if (!$con) { die(''Could not connect: '' . mysql_error()); } mysql_select_db("database_name", $con) or die(mysql_error()); mysql_set_charset(''utf8'',$con);
Use
$pdf->SetFont(''DejaVuSerif'', '''', 10);
en lugar de$pdf->SetFont(''helvetica'', ''B'', 12);
- Para la biblioteca TCPDF del carácter de lectura PHP como Rājasthān en lugar de R? Jasth? N de la base de datos
Estoy usando la última versión de TCPDF (5.9). Pero tiene algunos problemas extraños con la codificación. Necesito símbolos del lenguaje lituano como: ąčęėįšųūž. Pero consigue solo algunos. Otros permanecen como ????? Entonces qué debo hacer ? Utilizo la fuente de los tiempos predeterminados (viene con la descarga de TCPDF).
Cualquier ayuda sería apreciada.
Acabo de descubrir esta misma situación cuando intento renderizar texto rumano usando la fuente Helvetica predeterminada. Al hacer una investigación descubrí que la biblioteca tcpdf trata sus fuentes predeterminadas (denominadas fuentes "centrales") como caracteres Latin1, por lo que incluso si le dice que use la codificación UTF-8 y configure el indicador Unicode, literalmente traducirá su texto a Latin1 equivalentes antes de renderizar. El comportamiento predeterminado de la biblioteca es, si encuentra un equivalente de Latin1, traducir cada carácter que puede encontrar un equivalente, de lo contrario, traduce el carácter como ''?''.
Esto se puede encontrar dentro de la clase TCPDF en la siguiente cadena de método: Write()
-> Cell()
-> getCellCode()
-> _escapetext()
.
Dentro de _escapetext()
puedes ver que está comprobando $this->isunicode
luego verificando la fuente seleccionada para ver si su tipo es core | TrueType | Type1 . Si es así, tomará la cadena y la latinizará por usted mediante el método UTF8ToLatin1()
. Aquí es donde el ''?'' traducciones están teniendo lugar.
Mi recomendación sería usar una fuente Unicode personalizada (como Deja Vu Sans) que sea similar a la fuente predeterminada que está buscando. Eso funcionó para mí en mi situación actual.
Con el paquete TCPDF predeterminado, se prueban dejavusans y freeserif y ambas fuentes funcionan con caracteres lituanos . También escribí algunos caracteres rusos y también funcionaron. Usé este código para probarlo:
$this->pdf = new /TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, ''UTF-8'', false);
$this->pdf->AddPage();
$this->pdf->SetFont(''dejavusans'', ''B'', 20); // UTF8 fonts with lithuanian support: freeserif, dejavusans
$this->pdf->Write(0, ''ąžūčšęėųįĄŽŪČŠĘĖŲĮ Превед Кросавчег!'', '''', 0, ''C'', true, 0, false, false, 0);
Con la fuente dejavusans, funcionó bien tanto para las letras rusas como para las letonas.
Establezca la fuente en freeserif si funcionará. Probé.
$pdf->SetFont(''freeserif'', '''', 14, '''', true);
IIRC, puede definir una codificación cuando crea una fuente nueva, como se describe aquí . De lo contrario, debe usar la codificación que se definió cuando se creó la fuente. Parece que las fuentes que se envían con TCPDF usan WinAnsiEncoding ... alias código página 1252.
Clunky, pero efectivo.
Para esto use el siguiente código del parámetro TCPDF constructor
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, false, ''ISO-8859-1'', false);
Esto te ayudará.
Para mí fue un problema de fuente. Usé los times
las fuentes y mis chras multibyte locales no se muestran correctamente. Cuando lo cambié a freeserif
, funcionaban normalmente :)
TCPDF es bastante complicado con utf8. La mejor forma de lograr lo que desea es incrustar la fuente en el archivo PDF generado. Puede usar la fuente freeserif del paquete TCPDF, contiene todos los símbolos utf8, muestra absolutamente cualquier carácter de cualquier idioma, pero agrega ~ 700kb al archivo de salida. Esa es probablemente la forma más fácil de obtener los símbolos que necesita si el tamaño del archivo no es importante.
También puede crear su propia fuente para incrustar, que contenga los caracteres que necesita. Esa es probablemente la mejor solución, manteniéndola universal y de pequeño tamaño, pero es más compleja.
Alternativamente, puede retransmitir en las fuentes del núcleo, que se toman del sistema, y si no se encuentran, se reemplazan por un sustituto. Esto hace que el archivo de salida sea extremadamente liviano, pero agrega la necesidad de subconjuntos de fuentes para obtener caracteres exóticos. Personalmente no he tenido éxito con esto, así que sigo pensando que la incorporación de fuentes es la mejor solución, que también es más universal.
Tuve el mismo problema con los caracteres rumanos y el problema no fue la codificación, LC_CTYPE u otra configuración de TCPDF , sino la fuente que utilicé. Menciono que utilicé plantillas TWIG con fuente Courier. Puede intentar cambiar su fuente a freeserif
hay una fuente incluida en las fuentes centrales CPDF - dejavusans, muestra todos los caracteres lituanos. Solo agregue lo siguiente:
$pdf->setHeaderFont(Array(''dejavusans'', '''', 10, '''', false));
$pdf->setFooterFont(Array(''dejavusans'', '''', 8, '''', false));
$pdf->SetFont(''dejavusans'', '''', 10, '''', false);
Para usar TCPDF con caracteres especiales como ฿, 포 u otros , debe usar una fuente Unicode :
descargue la fuente aquí: ftp://ftp.fu-berlin.de/unix/X11/multimedia/MPlayer/contrib/fonts/arialuni.ttf.bz2
crea un archivo pdf de prueba y carga esta fuente en el ejemplo de TCPDF:
$fontname = $pdf->addTTFfont(''/var/www/app/images/fonts/arialuni.ttf'', ''TrueTypeUnicode'', '''', 32);
esto creará las fuentes como:
application / libraries / tcpdf / fonts / arialuni.ctg.z
application / libraries / tcpdf / fonts / arialuni.php
application / libraries / tcpdf / fonts / arialuni.zahora puede establecer la nueva fuente con: $ pdf-> SetFont (''arialuni'', '''', 10.5);
y ahora puedes usar caracteres Unicode especiales como ฿ y más ...
Establezca el parámetro $unicode
en el constructor TCPDF en false
y el parámetro de $encoding
en ''ISO-8859-1''
o algún otro mapa de caracteres.
This te ayudará a:
Predeterminado para UTF-8 unicode:
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, ''UTF-8'', false);
Ejemplo de constructor para charset europeo:
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, false, ''ISO-8859-1'', false);
$fontname = $pdf->addTTFfont(''C:/xampp/htdocs/copyshop/fonts/07-TH-Sarabun-PSK/THSarabun.ttf'', ''TrueTypeUnicode'', '''', 32);
$pdf->SetFont($fontname, '''', 16,'''',FALSE); //Working