台灣最大程式設計社群網站
線上人數
1382
 
會員總數:243645
討論主題:188247
歡迎您免費加入會員
討論區列表 >> PHP >> 如何處理Tcpdf的英文字會跑掉
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
如何處理Tcpdf的英文字會跑掉
價值 : 80 QP  點閱數:553 回應數:48

樓主

code
門外漢
0 5
258 75
發送站內信

各位好

我使用tcpdf套件產生中文與英文字

我在自己電腦列印pdf,中文與英文字都正常

可是別人在電腦上列印

英文會跑掉

例如:ABCD Test

別人印出來是:A B CD Test

tcpdf目前使用字型是

$pdf->SetFont('msungstdlight', '', 20);

請問我要怎處理?

1.先換字形請使用者列印嗎

2.還是tcpdf有相關字形鎖住功能




搜尋相關Tags的文章: [ php ] ,
本篇文章發表於2018-11-19 16:12
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

淺水員
檢舉此回應
其實 new TCPDF(...) 的第7個參數如果設為 true
會變成 PDF/A-1b 的格式
這應該是會把字型內嵌進去
只是檔案大小會變很大
在我個人電腦中執行時間也要幾秒鐘
不知道其他人有沒有更好的辦法
本篇文章回覆於2018-11-20 12:26
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

code
檢舉此回應
潛水員你好

我增加第7個參數如下

$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false,true);

但會出現

TCPDF ERROR: All fonts must be embedded in PDF/A mode!
本篇文章回覆於2018-11-20 14:07
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

淺水員
檢舉此回應
這我也不清楚
自己使用時沒有這問題
本篇文章回覆於2018-11-20 21:28
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

code
檢舉此回應
謝謝喔

我自己再找方法
本篇文章回覆於2018-11-21 08:59
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

code
檢舉此回應
開啟php錯誤模式

顯示錯誤為

我有增加相關中文金額程式

$numc ="零,壹,貳,參,肆,伍,陸,柒,捌,玖";

$unic = ",拾,佰,仟";

$unic1 = ",萬,億,兆,京";

$numc_arr = split(",", $numc);//php error

$unic_arr = split(",", $unic);//php error

$unic1_arr = split(",", $unic1);//php error

Function split() is deprecated

TCPDF ERROR: All fonts must be embedded in PDF/A mode!
本篇文章回覆於2018-11-21 09:09
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
請改用 preg_split 這個函數處理。
php 5.3 版後的split,已不支援PCRE規範。一但調用就會有deprecated 的警告。
另一個說法就是該函數已經被棄用了。
本篇文章回覆於2018-11-21 09:32
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
作者回應

code
檢舉此回應
好的 我繼續用
本篇文章回覆於2018-11-21 09:42
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
作者回應

code
檢舉此回應
你好

我改為

$numc_arr = preg_split(',', $numc);

$unic_arr = preg_split(",", $unic);

$unic1_arr = preg_split(",", $unic1);


出現錯誤為:Warning: preg_split(): No ending delimiter ','
本篇文章回覆於2018-11-21 16:05
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
作者回應

code
檢舉此回應
php 版本:5.3.8
本篇文章回覆於2018-11-21 16:05
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
作者回應

code
檢舉此回應
我改為

$numc_arr = preg_split('~,~', $numc);

$unic_arr = preg_split("~,~", $unic);

$unic1_arr = preg_split("~,~", $unic1);

Warning: preg_split(): No ending delimiter ',' 這個錯誤不見

只剩[TCPDF ERROR: All fonts must be embedded in PDF/A mode!]


本篇文章回覆於2018-11-21 16:10
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
作者回應

code
檢舉此回應
我先做tcpdf最簡單宣告

看看能不能產生PDF/A-1b
本篇文章回覆於2018-11-21 17:22
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
作者回應

code
檢舉此回應
目前我用這段測試碼

還是出錯誤 TCPDF ERROR: All fonts must be embedded in PDF/A mode! @@




<?php



require_once('tcpdf_include.php');


$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false,true);


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

$pdf->AddPage();

$pdf->SetTextColor(0, 0, 0);

$text="測試";


$pdf->text(165,205, $text);

$pdf->Output('test.pdf', 'I');


?>
本篇文章回覆於2018-11-22 11:12
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
13樓
作者回應

code
檢舉此回應
利用tcpdf 的example065 使用

使用
require_once('tcpdf_include.php');

// Include the main TCPDF library (search for installation path).
require_once('tcpdf_include.php');

// create new PDF document
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false, true);


// ---------------------------------------------------------

$pdf->setPrintHeader( false );
$pdf->setPrintFooter(false);


// Set font
//$pdf->SetFont('msungstdlight', '', 20, '', true);

$pdf->SetFont('helvetica', '', 20, '', true);

// Add a page
// This method has several options, check the source code documentation for more information.
$pdf->AddPage();

// Set some content to print
$html = <<<EOD

<p> Please check the source code documentation and other examples for further information (<a href="http://www.tcpdf.org">http://www.tcpdf.org</a>).</p>

EOD;

// Print text using writeHTMLCell()
$pdf->writeHTMLCell(0, 0, '', '', $html, 0, 1, 0, true, '', true);

// ---------------------------------------------------------

// Close and output PDF document
// This method has several options, check the source code documentation for more information.
$pdf->Output('example_065.pdf', 'I');


可以正常顯示

但修改
$pdf->SetFont('msungstdlight', '', 20, '', true);

//$pdf->SetFont('helvetica', '', 20, '', true);

會顯示TCPDF ERROR: All fonts must be embedded in PDF/A mode!

本篇文章回覆於2018-11-22 11:34
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
14樓
回應

淺水員
檢舉此回應
可能要先跑過一次
$fontname=TCPDF_FONTS::addTTFfont(字型檔,'TrueTypeUnicode','',32);

把 $fontname 印出來看字型名稱
然後之後用這字型即可

addTTFfont 好像會把 ttf 字型檔轉為他內部的格式
之後可以直接使用

本篇文章回覆於2018-11-23 00:44
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
15樓
回應

淺水員
檢舉此回應
認真研究了一下 tcpdf 字型的部分
雖然說他有個參數可以設定 subset(字型子集)
文件上面說可以降低檔案大小
但是不管怎麼試似乎都不產生影響
有可能存在 bug 或是他很吃字型檔的格式

此外,搜尋中也看到使用者覺得 subset 的計算太花時間
索性關閉…

所以我想問一下你們可以用 exec 或 system 等指令嗎
如果說 tcpdf 的效能與生產出來的品質不容易達到要求
那麼透過其他程式來生成 pdf 再傳給使用者也是一種方法

我有找到 inkscape 這個軟體
雖然他本來是向量繪圖軟體,但有命令列模式可以用
因此流程是這樣的:
1. 先用 php 產生 svg 圖檔
2. 透過 exec 等指令呼叫 inkscape 轉成 pdf
(相關文件:https://inkscape.org/doc/inkscape-man.html)
文件中有提到字型是內嵌的
而且只內嵌用到的文字

我用這樣的指令,產生的文件效果滿好的
inkscape -f input.svg -A output.pdf


因為你們好像是輸出固定格式的報表
所以也許畫一下 svg 圖檔應該不會太複雜
本篇文章回覆於2018-11-23 04:40
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   

回覆
如要回應,請先登入.