framework - ¿Por qué este código para centrar texto en un PDF utilizando la biblioteca PHP Zend_Pdf no funciona?
zend_pdf draw line (2)
Intento 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:
<?
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.
En caso de que alguien más se encuentre 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;
}
Al construir la matriz de caracteres, los caracteres se cargan incorrectamente: 8 bits, no 16.
$characters[] = ord ($drawing_text[$i]);
Esto resuelve el problema y calcula correctamente el ancho del texto.
intenta usar 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 llámalo en tu función de renderizado, como:
if ($this->getAlign() == self::TEXT_ALIGN_CENTER)
{
$x = ($currentPage->getWidth() - $this->getTextWidth($text, $currentPage)) / 2;
}
...
$currentPage->drawText($text, $x, $y, ...);