>백엔드 개발 >PHP 튜토리얼 >phpword 플러그인_php 팁을 사용하여 단어 파일을 내보낼 때 중국어 문자가 깨지는 문제에 대한 해결 방법

phpword 플러그인_php 팁을 사용하여 단어 파일을 내보낼 때 중국어 문자가 깨지는 문제에 대한 해결 방법

WBOY
WBOY원래의
2016-05-16 20:38:051274검색

Word 문서를 내보내려면 PHP 기술을 사용해야 하는 최근 프로젝트 개발 중 첫 번째는 Word.Application과 같은 Microsoft Office와 함께 제공되는 ActiveX/COM 구성 요소를 사용하는 것이었습니다. 형식 호환성이 높으며 순수한 doc Word2003 형식 문서를 생성할 수 있습니다. 단점은 더 많은 리소스를 차지하며(호출 시 WINWORD.EXE 프로세스가 시작됨) 웹에서 다중 사용자 액세스에 적합하지 않다는 것입니다. 물론 PHP 등 대부분의 웹 개발 기술은 리눅스 서버에서 구동되기 때문에 윈도우 환경에서는 사용이 불가능하고 플랫폼 이식성과 호환성도 좋지 않다.

Word를 생성하는 두 번째 방법은 Word 호환 웹 페이지 형식을 생성한 다음 Word에서 여는 것입니다. 이 솔루션은 전체적으로 이상한 느낌이 듭니다. 결국 파일 형식이 HTML이고 형식 호환성이 좋지 않습니다. 하지만 이 방법의 장점은 서버 리소스를 절약하고 빠르게 생성할 수 있다는 것입니다. 마지막 솔루션은 PHPWord를 사용하여 Word2007(docx) 형식으로 문서를 생성하는 것입니다. 이제 기본적으로 Microsoft Office Word 2003 및 이후 버전과 호환됩니다. 2003 버전의 경우 호환되는 형식의 패키지(다운로드 주소)만 다운로드하여 설치하면 되며, 물론 최신 버전의 Office를 사용하는 경우에도 해당 파일을 정상적으로 열 수 있습니다. Office 2007, Office 2010으로 제한됨), 이 형식 패키지를 설치할 필요가 없습니다.

자, 이제 PHPWord를 소개하겠습니다. 프로젝트 홈페이지에 방문하시면 다운로드 받으실 수 있으며, 프로젝트에 대한 자세한 정보를 얻으실 수 있습니다.

저는 주로 사용 중 중국어 깨짐 문제가 발생했습니다. 온라인 전문가의 지도를 바탕으로 다음과 같은 방법을 통해 이러한 문제를 해결했습니다.

1. 동아시아 글꼴 지원 추가

/Writer/Word2007/Base.php 파일 경로(아마도 349행)의 내용을 열고 편집하고(행 수는 버전에 따라 변경될 수 있음) _writeTextStyle 함수에

을 추가합니다.

$objWriter->writeAttribute('w:eastAsia', $font)
예를 들어 제가 수정한 부분은 기본적으로 다음과 같습니다.

// Font
if($font != 'Arial') {
  $objWriter->startElement('w:rFonts');
    $objWriter->writeAttribute('w:eastAsia', $font); // 添加这行
    $objWriter->writeAttribute('w:ascii', $font);
    $objWriter->writeAttribute('w:hAnsi', $font);
    $objWriter->writeAttribute('w:cs', $font);
  $objWriter->endElement();
}

2. 한자 깨짐 문제 해결

PHPWord/Template.php를 편집하고 $replace = utf8_encode($replace); 코드를 찾은 다음 이 코드 줄을 삭제하거나 주석 처리하고 $replace = iconv('gbk','utf-8', $를 추가합니다. 교체); 예를 들어 코드는 다음과 같이 변경됩니다.

 /**
 * Set a Template value
 * 
 * @param mixed $search
 * @param mixed $replace
 */
public function setValue($search, $replace) {
  if(substr($search, 0, 2) !== '${' && substr($search, -1) !== '}') {
    $search = '${'.$search.'}';
  }
 
  if(!is_array($replace)) {
    //$replace = utf8_encode($replace);
    $replace =iconv('gbk', 'utf-8', $replace); // 注释掉上面行后添加这行
  }
 
  $this->_documentXML = str_replace($search, $replace, $this->_documentXML);
}


호출 방법은 다음과 같습니다.

$document->setValue('Template', iconv('utf-8', 'GB2312//IGNORE', '中文'));

위의 코드는 주로 템플릿의 문제를 해결합니다. 아래와 같은 이유로 섹션에 텍스트를 추가하는 문제를 해결합니다. $givenText = utf8_encode($text); 코드를 찾아 이 코드 줄을 삭제하거나 주석 처리한 후 추가합니다. $givenText = iconv( 'gbk', 'utf-8', $text); 예를 들어 코드는 다음과 같습니다.

/**
 * Add a Text Element
 * 
 * @param string $text
 * @param mixed $styleFont
 * @param mixed $styleParagraph
 * @return PHPWord_Section_Text
 */
public function addText($text, $styleFont = null, $styleParagraph = null) {
  //$givenText = utf8_encode($text);
  $givenText = iconv('gbk', 'utf-8', $text); // 注释掉上面行后添加这行
  $text = new PHPWord_Section_Text($givenText, $styleFont, $styleParagraph);
  $this->_elementCollection[] = $text;
  return $text;
}

호출 방법은 위의 템플릿 호출과 유사하므로 여기서는 나열하지 않겠습니다.

많은 고민 끝에 갑자기 인터넷에 다른 버전의 PhpWord가 있다는 것을 알게 되었습니다. 프로젝트 클래스 이름은 대문자와 대문자가 약간 다릅니다. 그것은 PHPOffice/PHPWord와 GitHub 프로젝트 주소(문서)에 속합니다. 이 버전의 PHPWord에는 더 풍부한 콘텐츠가 있으며 더 많은 기능(줄 간격, 들여쓰기, 첫 줄 들여쓰기 등 포함)을 지원합니다. 마지막으로 이 버전의 PHPWord도 API 인터페이스라는 점에 주목할 가치가 있습니다. 기본적으로 동일하며 보편적으로 사용할 수 있습니다. 그러나 일부 API는 PHPOffice/PHPWord에서 권장되지 않습니다. 예를 들어 createSection을 addSection으로 변경해야 합니다. 또한 이 버전의 PHPWord를 적용하면 위와 같이 중국어 지원 수정이 필요하지 않으므로 문제가 더 발생하지 않습니다.

이 두 PHPWord 프로젝트 관계자는 더 자세한 사용 예와 문서를 제공했지만 여기서는 소개하지 않습니다. 마지막 알림은 템플릿 모드에서 loadTemplate은 setValue와 같은 템플릿 작업 메서드만 사용할 수 있으며 단락을 추가하거나 수정할 수 없다는 것입니다. 이것은 약간 불편합니다.

PHPOffice/PHPWord의 경우 참조용으로 간단한 예를 제공합니다(물론 공식적인 예도 더 있습니다).

require_once 'PhpOffice/PhpWord/PhpWord.php'; // 包含头文件
use PhpOffice\PhpWord\Autoloader;
use PhpOffice\PhpWord\Settings;
use PhpOffice\PhpWord\IOFactory;
 
require_once __DIR__ . '/PhpOffice/PhpWord/Autoloader.php';
Autoloader::register();
Settings::loadConfig();
 
// Create a new PHPWord Object
$PHPWord = new \PhpOffice\PhpWord\PhpWord();
$PHPWordHelper= new \PhpOffice\PhpWord\Shared\Font();
 
$PHPWord->setDefaultFontName('仿宋'); // 全局字体
$PHPWord->setDefaultFontSize(16);   // 全局字号为3号
 
// 设置文档的属性,这些在对文档右击属性可以看到,也可以省去这些步骤
$properties = $PHPWord->getDocumentProperties();
$properties->setCreator('张三');  // 创建者
$properties->setCompany('某公司'); // 公司
$properties->setTitle('某某文档'); // 标题
$properties->setDescription('http://wangye.org'); // 描述
$properties->setLastModifiedBy('李四'); // 最后修改
$properties->setCreated( time() );   // 创建时间
$properties->setModified( time() );   // 修改时间
 
// 添加3号仿宋字体到'FangSong16pt'留着下面使用
$PHPWord->addFontStyle('FangSong16pt', array('name'=>'仿宋', 'size'=>16));
 
// 添加段落样式到'Normal'以备下面使用
$PHPWord->addParagraphStyle(
 'Normal',array(
  'align'=>'both',
  'spaceBefore' => 0,
  'spaceAfter' => 0,
  'spacing'=>$PHPWordHelper->pointSizeToTwips(2.8),
  'lineHeight' => 1.19, // 行间距
  'indentation' => array( // 首行缩进
   'firstLine' => $PHPWordHelper->pointSizeToTwips(32)
  )
 )
);
 
// Section样式:上3.5厘米、下3.8厘米、左3厘米、右3厘米,页脚3厘米
// 注意这里厘米(centimeter)要转换为twips单位
$sectionStyle = array(
  'orientation' => null,
  'marginLeft' => $PHPWordHelper->centimeterSizeToTwips(3),
  'marginRight' => $PHPWordHelper->centimeterSizeToTwips(3),
  'marginTop' => $PHPWordHelper->centimeterSizeToTwips(3.5),
  'marginBottom' => $PHPWordHelper->centimeterSizeToTwips(3.8),
  'pageNumberingStart' => 1, // 页码从1开始
  'footerHeight' => $PHPWordHelper->centimeterSizeToTwips(3),
);
 
$section = $PHPWord->addSection($sectionStyle); // 添加一节
 
// 下面这句是输入文档内容,注意这里用到了刚才我们添加的
// 字体样式FangSong16pt和段落样式Normal
$section->addText('文档内容', 'FangSong16pt', 'Normal');
$section->addTextBreak(1); // 新起一个空白段落
 
$objWriter = IOFactory::createWriter($PHPWord, 'Word2007');
$objWriter->save('/path/to/file'); // 保存到/path/to/file路径下

요약

1. 템플릿 단어를 사용하여 중국어 왜곡된 단어 솔루션 생성: phpword/Template.php 파일을 열고 $replace = utf8_encode($replace)를 찾아 $replace =iconv('gbk', 'utf-8) ', $replace) 그게 다입니다.

2. 단어 문서를 직접 생성합니다. addText 개체를 호출할 때 중국어 문자가 깨졌을 때 해결 방법: phpword/Section.php 파일을 열고 $givenText = utf8_encode($text)를 찾습니다. gbk', 'utf-8', $text); 그게 다입니다.

3. 다른 방법에도 비슷한 해결책이 있는 것 같습니다.

4. php 파일은 gbk를 사용합니다. 어쨌든 내 것은 중국어를 표시합니다. 오랫동안 온라인에서 검색하고 오랫동안 조사한 끝에 마침내 알아냈습니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.