2011-10-12 7 views
6

Estoy intentando crear dinámicamente documentos PDF en el servidor y enviarlos al cliente utilizando la biblioteca Zend_Pdf. Todo el texto en el PDF debe estar alineado al centro de la página, que será de tamaño carta, horizontal. Usando funciones que he encontrado varias veces en varios sitios, tengo un problema: la justificación del centro está desactivada. Todo el texto está apareciendo demasiado a la izquierda. Aquí está mi código:¿Por qué este código para centrar texto en un PDF utilizando la biblioteca PHP Zend_Pdf no funciona?

<? 
require('Zend/Pdf.php'); 

$font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA); 
$pdf = new Zend_Pdf(); 

// Create a new page, add to page listing 
$pdfPage = $pdf->newPage(Zend_Pdf_Page::SIZE_LETTER_LANDSCAPE); 
$pdf->pages[] = $pdfPage; 

// Add certify that 
$pdfPage->setFont($font, 15.75); 
drawCenteredText($pdfPage, "THIS IS TO CERTIFY THAT", 378); 

// Add name 
$pdfPage->setFont($font, 39.75); 
drawCenteredText($pdfPage, "Example Name", 314.25); 

// Headers 
header("Content-type: application/pdf"); 
header("Content-Disposition: inline; filename=\"cert.pdf\""); 
header('Content-Transfer-Encoding: binary'); 
header('Accept-Ranges: bytes'); 

// Output PDF 
echo $pdf->render(); 


function drawCenteredText($page, $text, $bottom) { 
    $text_width = getTextWidth($text, $page->getFont(), $page->getFontSize()); 
    $box_width = $page->getWidth(); 
    $left = ($box_width - $text_width)/2; 

    $page->drawText($text, $left, $bottom, 'UTF-8'); 
} 

function getTextWidth($text, $font, $font_size) { 
    $drawing_text = iconv('', 'UTF-8', $text); 
    $characters = array(); 
    for ($i = 0; $i < strlen($drawing_text); $i++) { 
     $characters[] = (ord($drawing_text[$i++]) << 8) | ord ($drawing_text[$i]); 
    } 
    $glyphs  = $font->glyphNumbersForCharacters($characters); 
    $widths  = $font->widthsForGlyphs($glyphs); 
    $text_width = (array_sum($widths)/$font->getUnitsPerEm()) * $font_size; 
    return $text_width; 
} 

?> 

... y este es el resultado.

Non-centered text

Respuesta

9

En el caso de cualquier otra persona se encuentra con un problema similar, el problema está aquí:

function getTextWidth($text, $font, $font_size) { 
    $drawing_text = iconv('', 'UTF-8', $text); 
    $characters = array(); 
    for ($i = 0; $i < strlen($drawing_text); $i++) { 
     $characters[] = (ord($drawing_text[$i++]) << 8) | ord ($drawing_text[$i]); 
    } 
    $glyphs  = $font->glyphNumbersForCharacters($characters); 
    $widths  = $font->widthsForGlyphs($glyphs); 
    $text_width = (array_sum($widths)/$font->getUnitsPerEm()) * $font_size; 
    return $text_width; 
} 

Cuando la construcción de la matriz de caracteres, los caracteres se están cargando incorrectamente - 8 bits, no 16.

$characters[] = ord ($drawing_text[$i]); 

Esto soluciona el problema y calcula correctamente el ancho del texto.

+0

Cheers, esto me ayudó a salir :) – zenzelezz

+0

¿Cómo aplicar el ajuste de texto utilizando el función del centro? – Tom

+0

Estoy teniendo el mismo problema. Y este código tampoco me sirve. Cuando imprimo_r $ font-> widthsForGlyphs ($ glyphs); solo obtener matrices llenas de ceros – returnvoid

5

tratar de utilizar esta función:

/** 
    * Return length of generated string in points 
    * 
    * @param string      $text 
    * @param Zend_Pdf_Resource_Font|Zend_Pdf_Page  $font 
    * @param int       $fontSize 
    * @return double 
*/ 
public static function getTextWidth($text, $resource, $fontSize = null/*, $encoding = null*/) { 
    //if($encoding == null) $encoding = 'UTF-8'; 

    if($resource instanceof Zend_Pdf_Page){ 
     $font = $resource->getFont(); 
     $fontSize = $resource->getFontSize(); 
    }elseif($resource instanceof Zend_Pdf_Resource_Font){ 
     $font = $resource; 
     if($fontSize === null) throw new Exception('The fontsize is unknown'); 
    } 

    if(!$font instanceof Zend_Pdf_Resource_Font){ 
     throw new Exception('Invalid resource passed'); 
    } 

    $drawingText = $text;//iconv ('', $encoding, $text); 
    $characters = array(); 
    for($i = 0; $i < strlen ($drawingText); $i ++) { 
     $characters [] = ord ($drawingText [$i]); 
    } 
    $glyphs = $font->glyphNumbersForCharacters ($characters); 
    $widths = $font->widthsForGlyphs ($glyphs); 

    $textWidth = (array_sum ($widths)/$font->getUnitsPerEm()) * $fontSize; 
    return $textWidth; 
} 

y lo llaman en su función de representar, como:

if ($this->getAlign() == self::TEXT_ALIGN_CENTER) 
{ 
     $x = ($currentPage->getWidth() - $this->getTextWidth($text, $currentPage))/2; 
} 
... 
$currentPage->drawText($text, $x, $y, ...); 
Cuestiones relacionadas