2016-04-22 45 views
1

我有一個數組中的數據,我可以使用PDF :: API2將數據寫入pdf格式。但問題是在寫入過程中,縮進(空格)不象陣列使用perl模塊創建PDF時壓縮錯位PDF :: API2

在陣列形式中完全相同:

ATOM  1 N MET A 0  24.277 8.374 -9.854 1.00 38.41   N 0.174 

ATOM  38 OE2 GLU A 4  37.711 19.692 -12.684 1.00 28.70   O 0.150 

在PDF格式:

ATOM 1 N MET A 0 24.277 8.374-9.8541.0038.41 N 0.174 

ATOM 38 OE2 GLU A 4 37.71119.692-12.684 1.00 28.70 O 0.150 

我的代碼:

my $pdf = PDF::API2->new(-file => "/home/httpd/cgi-bin/new.pdf"); 
$pdf->mediabox("A4"); 
my $page = $pdf->page; 
my $fnt = $pdf->corefont('Arial',-encoding => 'latin1'); 
my $txt = $page->text; 
$txt->textstart; 
$txt->font($fnt, 8); 
$txt->translate(100,800); 
$j1=0; 
for($i=0;$i<=scalar(@ar_velz);$i++) #Data input to write in PDF 
{ 
$txt->lead(10); 
$txt->section("$ar_velz[$i]", 500, 800); #writing each array index 
if($j1 == 75)     #To create a page for every 75 lines 
{ 
$page = $pdf->page; 
$fnt = $pdf->corefont('Arial',-encoding => 'latin1'); 
$txt = $page->text; 
$txt->textstart; 
$txt->font($fnt, 8); 
$txt->lead(10); 
$txt->translate(100,800); 
$j1=0; 
} 
$j1++; 
} 
$txt->textend; 
$pdf->save; 
$pdf->end(); 

} 

回答

4

發生這種情況是因爲Arial不是mono-spaced font。角色都有不同的寬度。特別是空白區通常不是很寬。如果您希望間距保持不變,則需要使用單間距font,例如Courier

$fnt = $pdf->corefont('Courier',-encoding => 'latin1'); 

這也是爲什麼PDF :: API2 includes a method advancewidth在其PDF :: API2 :: Content類中的原因。您可以使用它來檢查文本塊是否太寬而無法放入一行,並在需要時手動包裝它。當然,對於你的桌子,這沒有幫助。


到單間距的字體的替代可能是使用PDF::Table,其可以在PDF :: API2文件內創建表。

+1

謝謝,它工作完美。 –

+1

@simbabque:我不認爲PDF文檔有製表符停止,但找不到關於這個主題的任何內容。你知道這件事嗎?包含由PDF呈現的水平製表符的字符串如何? – Borodin