2016-04-22 85 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