FPDF utf-8 인코딩 (HOW-TO)


80

누구든지 FPDF 패키지의 인코딩을 utf-8로 설정하는 방법을 알고 있습니까? 아니면 그리스 문자를 지원하는 ISO-8859-7 (그리스어) 이상?

기본적으로 그리스 문자가 포함 된 pdf 파일을 만들고 싶습니다.

어떤 제안이라도 도움이 될 것입니다. 성 조지


더 많은 언어를 사용하려면 UTF8이 필요하므로 tFPDF를 사용할 수 있습니다. composer 패키지를 살펴보십시오 .
robsch

답변:


116

UTF-8 인코딩을 사용하지 마십시오. 표준 FPDF 글꼴은 ISO-8859-1 또는 Windows-1252를 사용합니다. 다음을 사용하여 ISO-8859-1로 변환 할 수 있습니다 utf8_decode(). $str = utf8_decode($str); 그러나 Euro와 같은 일부 문자는 올바르게 번역되지 않습니다. iconv 확장을 사용할 수있는 경우 올바른 방법은 다음과 같습니다. $str = iconv('UTF-8', 'windows-1252', $str);


22
나는 이것이 도움이 될 것이라고 생각하지 않습니다. 귀하의 답변은 ISO-8859-1 또는 windows-1252 인코딩으로 PDF를 생성하는 방법을 설명하지만 이러한 인코딩은 비 라틴어 언어에서는 작동하지 않습니다. 다국어 (다중 스크립트) 텍스트 출력은 말할 것도 없습니다.
Томица Кораћ 2015-02-17

3
@Rafiq : "이전"FPDF를 사용하지 않지만 최신 UTF8 버전 tFPDF를 내 답변에 postet으로 사용합니다.
Tarsis

1
참고 : ISO-8859-1을 사용하는 경우 € 문자가 작동하지 않습니다 (문자 세트에 유로 기호가 없으므로 대신 ISO-8859-15를 사용하십시오).
BurninLeo 2015

1
@BurninLeo : ISO-8859-15는 그다지 좋지 않습니다. 모든 인코딩에는 동일한 문자 제한이 있으므로 -15에는 €가 있지만 ´ 또는 ½이 없습니다. 유일한 해결책은 내 대답에 표시된 것처럼 UTF-8을 피하는 대신 사용하는 것입니다.
Tarsis

3
tFPDF는 유니 코드를 지원하지만 3 년 동안 업데이트되지 않았습니다. FPDF가 더 최근에 업데이트되어 tFPDF가 구식이되었습니다. tFPDF를 사용할 때 염두에 두십시오.
Agilis

38

tFPDF http://www.fpdf.org/en/script/script92.php 라는 공식 UTF-8 버전의 FPDF도 있습니다 .

원본 FPDF에서 쉽게 전환 할 수 있습니다. 위 링크 또는 내 코드의 예제에 표시된대로 유니 코드 글꼴도 사용하는지 확인하십시오.

<?php

//this is a UTF-8 file, we won't need any encode/decode/iconv workarounds

//define the path to the .ttf files you want to use
define('FPDF_FONTPATH',"../fonts/");
require('tfpdf.php');

$pdf = new tFPDF();
$pdf->AddPage();

// Add Unicode fonts (.ttf files)
$fontName = 'Helvetica';
$pdf->AddFont($fontName,'','HelveticaNeue LightCond.ttf',true);
$pdf->AddFont($fontName,'B','HelveticaNeue MediumCond.ttf',true);

//now use the Unicode font in bold
$pdf->SetFont($fontName,'B',12);

//anything else is identical to the old FPDF, just use Write(),Cell(),MultiCell()... 
//without any encoding trouble
$pdf->Cell(100,20, "Some UTF-8 String");

//...
?>

모든 곳에서 utf8_decode ()를 스팸 처리하는 대신 이것을 사용하는 것이 훨씬 더 우아하고 AddFont ()에서 직접 .ttf 파일을 사용하는 기능도 장점이라고 생각합니다.

여기에 다른 대답은 문제를 피하거나 해결하는 방법 일 뿐이며 UTF-8을 피하는 것은 최신 프로젝트의 실제 옵션이 아닙니다.

FPDF를 기반으로하지만 고급 기능을 제공하고 UTF-8 지원을 제공하며 HTML 코드를 해석 할 수있는 mPDF 또는 TCPDF (및 기타)와 같은 대안도 있습니다 (물론 HTML을 PDF로 변환하는 직접적인 방법이 없으므로 제한됨). 대부분의 FPDF 코드는 이러한 라이브러리에서 직접 사용할 수 있으므로 코드를 마이그레이션하기가 매우 쉽습니다.

https://github.com/mpdf/mpdf http://www.tcpdf.org/


1
iconv 및 디코딩 솔루션은 더 뛰어난 문자 (♠ ♥ ☺äκόσμος)에 대해 작동하지 않습니다. 그러나 fpdf.php를 tpdf.php 파일로 바꾸면 모든 것이 작동하기 시작하고 추가 보너스로 파일 크기가 작아집니다. 대단한 수정.
Sebastian

1
FPDF와 tFPDF는 별도의 분기입니까? FPDF 페이지에서 tFPDF가 숨겨진 이유를 아는 사람이 있습니까? 전환하기 전에 알아야 할 단점이 있습니까?
BurninLeo

1
나는 그들이 그것을 기본 FPDF 버전으로 만들지 않은 이유를 확신하지만, 그것은 메인 페이지 fpdf.org 에 직접 링크되어 있으며 거기에서 언급했듯이 tFPDF의 기능은 원래 mPDF 용으로 개발되었습니다. 나는 생산적인 환경에서 많은 PDF에 tFPDF를 사용했으며 UTF-8 및 글꼴 변경 외에 100 % 동일하다고 생각합니다. 문제가 없었습니다.
Tarsis

1
tFPDF는 스크립트 또는 FPDF의 확장입니다. FPDF가 최근에 업데이트 되었기 때문에 오래된 것으로 간주됩니다 (3 년 전에 업데이트 됨). tFPDF의 작성자는 유지 관리하지 않으며 tFPDF와 관련된 GitHub는 건드리지 않았습니다. 참조 : github.com/rev42/tfpdf
Agilis

더 많은 기능이 필요하지 않는 한 나는 그 문제를 보지 못합니다. btw 마지막 (부) 업데이트는 불과 4 개월 전이었습니다-여전히 UTF-8을 지원하지 않는 것보다 낫습니다. 어느 쪽이든 나는 FPDF를 기반으로하지만 고급 기능을 제공하고 HTML 코드도 지원하는 TCPDF 또는 mPDF를 선호합니다.
Tarsis

28

이 문제에 대한 정말 간단한 해결책이 있습니다.

fpdf.php 파일에서 다음과 같은 행으로 이동하십시오.

if($txt!=='')
{

내 버전의 fpdf에서 648 행입니다. 다음 코드 줄을 삽입합니다.

$txt = iconv('utf-8', 'cp1252', $txt);

(코드 줄 위)

if($align=='R')

이것은 모든 독일어 특수 문자에 적용되며 그리스 특수 문자에도 적용됩니다. 그렇지 않으면 cp1252를 필요한 각 알파벳으로 바꾸십시오. 여기에서 지원되는 모든 문자를 볼 수 있습니다. http://en.wikipedia.org/wiki/Windows-1252 .

나는 여기에서 해결책을 보았다 : http://fudforum.org/forum/index.php?t=msg&goto=167345 원래 저자가 UTF과 8 사이에 대시를 삽입하는 것을 잊었다로, 내 위의 예제 코드를 사용하십시오.

위의 내용이 도움이 되었기를 바랍니다.

다안


완벽합니다. 특수 문자를 올바르게 표시하기 위해 FPDF를 PHP7을 지원하는 버전으로 업데이트 한 후에도 여전히 작동하거나 필요합니다.
때로 믿을 수

1
이 명령은 나를 위해 작동합니다. $ txt = iconv ( 'utf-8', 'cp1252', $ txt); Thks
Patrick Arguello

놀라운 simpel 솔루션입니다. 그것은 :) 유래에 어두운 곳에서 슬픈 거리에 자리 잡고 있습니다
피터-월 Casteels

이것은 내 간격으로 무언가를 변경했습니다. 이제 일부 줄이 더 일찍 끊어졌습니다. 그러나 적어도 그것은 작동하는 것 같습니다.
Cold_Class

9

먼저 글꼴을 생성해야합니다. MakeFontFPDF 패키지에 포함 된 유틸리티 를 사용해야합니다 . Linux에서 데모의 약간 확장 된 스크립트를 사용했습니다.

<?php
// Generation of font definition file for tutorial 7
require('../makefont/makefont.php');

$dir = opendir('/usr/share/fonts/truetype/ttf-dejavu/');
while (($relativeName = readdir($dir)) !== false) {
    if ($relativeName == '..' || $relativeName == '.')
        continue;
    MakeFont("/usr/share/fonts/truetype/ttf-dejavu/$relativeName",'ISO-8859-2');
}
?>

그런 다음 생성 된 파일을 font내 웹 디렉토리에 복사 하고 다음을 사용했습니다.

$pdf->Cell(80,70, iconv('UTF-8', 'ISO-8859-2', 'Buňka jedna'),1);

(나는 테이블에서 작업하고 있었다.) 그것은 내 언어에 효과가 있었다 ( Buňka jednaCell one의 체코 어이다 ). 체코 어는 중앙 유럽 언어에 속하며 ISO-8859-2도 있습니다. 안타깝게도 FPDF 사용자는 UTF-8 인코딩의 장점을 잃게됩니다. PDF에서 얻을 수 없습니다.

Městečko Fruens Bøge

덴마크 문자 øřISO-8859-2가됩니다.

솔루션 제안 : 그리스어 글꼴을 가져 와서 적절한 인코딩 (ISO-8859-7)을 사용 iconv하여 글꼴을 생성하고 글꼴이 생성 된 것과 동일한 대상 인코딩으로 사용해야 합니다.




4

위의 솔루션 중 어느 것도 작동하지 않습니다.

이 시도:

function filter_html($value){
    $value = mb_convert_encoding($value, 'ISO-8859-1', 'UTF-8');
    return $value;
}

4

클래스를 만들어 FPDF를 확장하고 다음을 추가 할 수 있습니다.

class utfFPDF extends FPDF {

function Cell($w, $h=0, $txt="", $border=0, $ln=0, $align='', $fill=false, $link='')
{
    if (!empty($txt)){
        if (mb_detect_encoding($txt, 'UTF-8', false)){
            $txt = iconv('UTF-8', 'ISO-8859-5', $txt);

        }
    }
    parent::Cell($w, $h, $txt, $border, $ln, $align, $fill, $link);

} 

}


4

TFPDF 로 전환하지 않은 사람을 위해이 질문에 답하고 싶었 습니다.어떤 이유로 든 (프레임 워크 통합 등) .

이동 : http://www.fpdf.org/makefont/index.php

사용 .ttf 하려는 언어에 호환되는 글꼴을 사용하십시오. 언어에 맞는 인코딩 번호를 선택하십시오. 파일을 다운로드하여 현재 FPDF 글꼴 디렉토리에 붙여 넣습니다.

이것을 사용하여 새 글꼴을 활성화하십시오. $pdf->AddFont($font_name,'','Your_Font_Here.php');

그러면 $pdf->SetFont정상적으로 사용할 수 있습니다 .

글꼴 자체에서 iconv를 사용하여 UTF-8로 변환합니다. 예를 들어 히브리어를 사용하는 경우 iconv('UTF-8', 'windows-1255', $first_name).

언어 인코딩을 Windows 인코딩 번호로 대체하십시오.

오른쪽에서 왼쪽으로 빠른 수정은 strrev(iconv('UTF-8', 'windows-1255', $first_name)).


4

fpdf.php 파일에서 함수 셀을 편집하고 다음과 같은 줄을 찾습니다.

function cell ($w, $h = 0, $txt = '', $border = 0, $ln = 0, $align = '', $fill = false, $link = '')
{ 

라인을 찾은 후

뒤에 쓰기 {,

$txt = utf8_decode($txt);

파일을 저장하고 준비하면 악센트와 utf8 인코딩이 작동합니다. :)


3

중국어, 일본어, 러시아어 등을 지원하는 PDF를 FPDF에서 어떻게 만듭니 까?

(아래에서 사용중인 코드 스냅 샷)

문제 요약, 솔루션, 작업 코드가 포함 된 github 프로젝트, 예상되는 결과 PDF가 포함 된 온라인 예제를 제공하고 싶습니다.

문제 :

  1. Tarsis가 언급 한대로 FPDF를 TFPDF로 바꿉니다.
  2. 실제로 사용중인 UTF-8 문자를 지원하는 글꼴이 필요합니다.

    IE는 단순히 Helvetica를 사용하고 일본어를 표시하려고하면 작동하지 않습니다. Font Forge 또는 다른 글꼴 도구를 사용하는 경우 글꼴의 중국어 문자로 스크롤하여 비어 있는지 확인할 수 있습니다.

    Google 에는 모든 언어를 포함 하는 글꼴 ( Noto 글꼴 )이 있으며, 일반적으로 텍스트 크기의 여러 요소 인 20MB입니다. 따라서 많은 글꼴이 모든 단일 언어를 포함하지 않는 이유를 알 수 있습니다.

해결책 :

저는 일본어와 중국어 용 rounded-mgenplus-20140828.ttf 및 ZCOOL_QingKe_HuangYou.ttf 글꼴 팩을 사용하고 있습니다.이 글꼴 팩은 오픈 소스이며 많은 오픈 소스 프로젝트에서 찾을 수 있습니다. tFPDF 자체 또는, 같은 새로운 상속 클래스 class HTMLtoPDF extends tFPDF {...}에서 다음을 수행합니다.

$this->AddFont('japanese', '', 'rounded-mgenplus-20140828.ttf', true);
$this->SetFont('japanese', '', 14);
$this->Write(14, '日本語');

더 이상 아무것도 아닙니다!

GitHub의 코드 패키지 :

https://github.com/HoldOffHunger/php-html-to-pdf

일본어 온라인 데모 :

https://www.earthfluent.com/privacy.pdf?language=ja


1

자손을 위해.

내 Linux 컴퓨터에서 fpdf에 러시아어를 추가하는 방법 :

1) http://www.fpdf.org/makefont/ 로 이동 하여 ttf 글꼴 (예 : AerialRegular.ttf)을 ISO-8859-5 인코딩을 사용하여 2 개의 파일로 변환 : AerialRegular.php 및 AerialRegular.z

2)이 두 파일을 fpdf / font 디렉토리에 넣으십시오.

3) 코드에서 사용하십시오.

$pdf = new \FPDI();
    $pdf->AddFont('ArialMT','','ArialRegular.php');
    $pdf->AddPage();
    $tplIdx = $pdf->importPage(1);
    $pdf->useTemplate($tplIdx, 0, 0, 211, 297); //width and height in mms
    $pdf->SetFont('ArialMT','',35);
    $pdf->SetTextColor(255,0,0);
    $fullName = iconv('UTF-8', 'ISO-8859-5', 'Алексей');
    $pdf->SetXY(60, 54);
    $pdf->Write(0, $fullName);



0

이 기능을 텍스트에 적용 할 수 있습니다.

 $yourtext = iconv('UTF-8', 'windows-1252', $yourtext);

감사


0

ASP에 FPDF를 사용하는데 iconv 기능을 사용할 수 없습니다. AddPage () 함수 바로 뒤에 가짜 이미지 (1x1px jpeg)를 pdf 에 추가 하여 UTF-8 문제를 해결 한 것이 이상해 보입니다 .

pdf.Image "images/fpdf.jpg",0,0,1

이런 식으로 악센트 부호가있는 문자가 내 pdf에 올바르게 추가됩니다. 이유를 묻지 말고 작동합니다.


0

그리스어에서할지 확실하지 않지만 브라질 포르투갈어 문자에 대해 동일한 문제가 있었고 해결책은 html 엔티티를 사용하는 것이 었습니다. 기본적으로 두 가지 경우가 있습니다.

  1. 문자열 에는 UTF-8 문자 포함될 있습니다.

이를 위해 먼저 html 엔터티로 인코딩 htmlentities()한 다음 iso-8859-1. 예:

$s = html_entity_decode(htmlentities($my_variable_text), ENT_COMPAT | ENT_HTML401, 'iso-8859-1');
  1. html 엔티티가있는 고정 문자열 :

이것에 대해서는 그냥 htmlentities()외침을 남겼 습니다. 예:

$s = html_entity_decode("Treasurer/Tr&eacute;sorier", ENT_COMPAT | ENT_HTML401, 'iso-8859-1');

그런 다음 $s이 예제와 같이 FPDF로 전달 했습니다.

$pdf->Cell(100, 20, $s, 0, 0, 'L');

참고 : http://php.net/manual/en/function.html-entity-decode.phpENT_COMPAT | ENT_HTML401 에서와 같이 매개 변수 # 2의 표준 값입니다 .

도움이되기를 바랍니다.


0

나는이 질문이 오래되었다는 것을 알고 있지만 내 대답은 다른 대답에서 해결책을 찾지 못한 사람들에게 도움이 될 것이라고 생각합니다. 그래서 내 문제는 PDF에 크로아티아 문자를 표시 할 수 없다는 것입니다. 첫째, FPDF를 사용했지만 유니 코드를 지원하지 않는 것 같습니다. 마지막으로 내 문제를 해결 한 것은 유니 코드를 지원하는 FPDF 버전 인 tFPDF입니다. 이것은 나를 위해 일한 예입니다.

require('tFPDF/tfpdf.php');
$pdf = new tFPDF();
$pdf->AddPage();
$pdf->AddFont('DejaVu','','DejaVuSansCondensed.ttf',true);
$pdf->AddFont('DejaVu', 'B', 'DejaVuSansCondensed-Bold.ttf', true);

$pdf->SetFont('DejaVu','',14);

$txt = 'čćžšđČĆŽŠĐ';
$pdf->Write(8,$txt);

$pdf->Output();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.