Desenhando
Geometria
O PDF usa a mesma geometria do PostScript. A geometria começa no
canto inferior esquerdo da página e, por padrão, é medida em pontos (1/72 de polegada).
O tamanho da página pode ser recuperado de um objeto página:
getWidth();
$height = $pdfPage->getHeight();
]]>
Cores
O PDF possui uma poderosa capacidade para a representação de cores.
O módulo Zend_Pdf dá suporte à Escala de Cinza, RGB e CMYK.
Qualquer um deles pode ser usado em qualquer lugar onde um
Zend_Pdf_Color for requisitado. As classes
Zend_Pdf_Color_GrayScale,
Zend_Pdf_Color_Rgb e Zend_Pdf_Color_Cmyk
fornecem a seguinte funcionalidade:
O estilo de cores do HTML também é fornecido na classe
Zend_Pdf_Color_Html:
Desenhando Formas
Todas as operações de desenho podem ser feitas no contexto de uma página
PDF.
A classe Zend_Pdf_Page provê um conjunto de formas básicas para
desenho:
Desenhando Texto
As operações de desenho de texto também existem no contexto de uma página
PDF. Você pode desenhar uma linha de texto em qualquer posição da
página ao fornecer as coordenadas x e y. A fonte, tamanho da fonte e a cor de
preenchimento de página atuais são usadas para a operação de desenho de texto (veja a
descrição detalhada abaixo).
Desenha uma string na página
drawText('Olá mundo!', 72, 720);
...
]]>
Define a cor da fonte
setFillColor(Zend_Pdf_Color_Html::color('#990000'))
->drawText('Hello world (in red)!', 72, 720);
....
]]>
Por padrão, as strings de texto são interpretadas usando o método de decodificação e
caracteres local. Se você tiver uma string que use um método de codificação diferente
(como uma string UTF-8 sendo lida de um arquivo no disco, ou uma string MacRoman obtida
de um bando de dados legado), você pode a codificação na hora de desenhar e a
Zend_Pdf irá tratar a comunicação para você. Você pode fornecer
as strings em qualquer método de codificação suportada pela função iconv() do
PHP:
Desenha uma string codificada em UTF-8 em uma página
drawText($unicodeString, 72, 720, 'UTF-8');
...
]]>
Usando fontes
O método Zend_Pdf_Page::drawText() usa a fonte atual da página,
que é configurada através do método Zend_Pdf_Page::setFont():
Documentos PDF suportam as fontes PostScript Type 1 e TrueType, assim
como dois tipos especiais do PDF, o Type 3 e as fontes compostas.
Existem também 14 fontes padrão Type 1 inclusas em todos os visualizadores de
PDF: Courier (4 estilos), Helvetica (4 estilos), Times (4 estilos),
Symbol, e Zapf Dingbats.
Zend_Pdf atualmente dá suporte às 14 fontes
PDF padrão, assim como às suas fontes personalizadas TrueType.
Objetos do tipo Font são obtidos via um dos dois métodos fábrica:
Zend_Pdf_Font::fontWithName($fontName) para as 14 fontes padrão
do PDF ou
Zend_Pdf_Font::fontWithPath($filePath) para fontes
personalizadas.
Criar uma fonte padrão
setFont($font, 36);
...
]]>
As constantes para as 14 fontes PDF padrão são definidas na classe
Zend_Pdf_Font:
Zend_Pdf_Font::FONT_COURIER
Zend_Pdf_Font::FONT_COURIER_BOLD
Zend_Pdf_Font::FONT_COURIER_ITALIC
Zend_Pdf_Font::FONT_COURIER_BOLD_ITALIC
Zend_Pdf_Font::FONT_TIMES
Zend_Pdf_Font::FONT_TIMES_BOLD
Zend_Pdf_Font::FONT_TIMES_ITALIC
Zend_Pdf_Font::FONT_TIMES_BOLD_ITALIC
Zend_Pdf_Font::FONT_HELVETICA
Zend_Pdf_Font::FONT_HELVETICA_BOLD
Zend_Pdf_Font::FONT_HELVETICA_ITALIC
Zend_Pdf_Font::FONT_HELVETICA_BOLD_ITALIC
Zend_Pdf_Font::FONT_SYMBOL
Zend_Pdf_Font::FONT_ZAPFDINGBATS
Você também pode usar qualquer fonte individual TrueType (que normalmente possui a
extensão '.ttf') ou uma fonte OpenType (de extensão '.otf') se ela contiver o mesmo
contorno das TrueType. Atualmente sem suporte, mas planejadas para um lançamento futuro
são os arquivos .dfont do Mac OS X e os arquivos Microsoft TrueType Collection (extensão
'.ttc').
Para usar uma fonte TrueType, você deve fornecer o caminho completo para a fonte. Se a
fonte não puder ser lida por algum motivo, ou se ela não for uma fonte TrueType, o
método fábrica irá lançar uma exceção:
Criar uma fonte TrueType
setFont($goodDogCoolFont, 36);
...
]]>
Por padrão, fontes personalizadas serão embarcadas no documento PDF
resultante. Isso permite que as pessoas que receberem o arquivo poderão visualizá-lo
corretamente, mesmo que não possuam as fontes apropriadas instaladas em seus sistemas.
Se você estiver preocupado com o tamanho do arquivo você pode solicitar que a fonte não
seja incluída através de uma opção 'não embarque' do método fábrica:
Criar uma fonte TrueType, mas não embarcá-la no documento PDF
setFont($goodDogCoolFont, 36);
...
]]>
Se o programa da fonte não for embarcado, mas o recebedor do arquivo
PDF tiver a fonte instalada em seu sistema ele irá ver o documento
corretamente. Caso ele não possua a fonte correta instalada, o visualizador
PDF fará o melhor para sintetizar uma substituição.
Algumas fontes possuem regras de licença específicas que evitam que elas sejam
embarcadas em documentos PDF. Então, para que você não seja pego de
surpresa por isso, se você tentar usar uma fonte que não pode ser embarcada, o método
fábrica irá lançar uma exceção.
Você ainda pode usar estas fontes, mas deve passar a opção 'não embarque' como foi
descrito acima, ou então você pode simplesmente suprimir a exceção:
Não lançar uma exceção para fontes que não podem ser embarcadas
Esta técnica de supressão é preferível se você permitir que o usuário final escolha sua
própria fonte. Fontes que podem ser embarcadas no documento PDF vão
ser; aquelas que não puderem, não serão.
Programas de fonte podem ser um tanto grandes, alguns alcançam dezenas de megabytes. Por
padrão, todas as fontes embarcadas são comprimidas usando o esquema de compressão Flate,
resultando, em média, em uma economia de espaço de 50%. Se, por alguma razão, você não
quer comprimir o programa da fonte, você pode desabilitar isso através de uma opção:
Não comprimir uma fonte embarcada
Finalmente, quando necessário, você pode combinar as opções de embarque usando o
operador binário OR:
Combinando opções de embarque de fonte
Standard PDF fonts limitations
Standard PDF fonts use several single byte encodings internally
(see PDF
Reference, Sixth Edition, version 1.7 Appendix D for details). They are
generally equal to Latin1 character set (except Symbol and ZapfDingbats fonts).
Zend_Pdf uses CP1252 (WinLatin1) for drawing text with standard
fonts.
Text still can be provided in any other encoding, which must be specified if it differs
from a current locale. Only WinLatin1 characters will be actually drawn.
Combining font embedding options
setFont($font, 36)
->drawText('Euro sign - €', 72, 720, 'UTF-8')
->drawText('Text with umlauts - à è ì', 72, 650, 'UTF-8');
...
]]>
Desenhando Imagens
A classe Zend_Pdf_Page fornece o método drawImage() para o
desenho de imagens:
Objetos de imagem devem ser criados com o método
Zend_Pdf_Image::imageWithPath($filePath) (imagens JPG, PNG e
TIFF são suportadas agora):
Desenhando imagens
drawImage($image, 100, 100, 400, 300);
...
]]>
Importante! O suporte a JPEG requer que a extensão PHP GD
esteja configurada. Importante! O suporte a PNG requer que
extensão ZLIB esteja configurada para trabalhar com imagens com canal
Alpha.
Consulte a documentação do PHP para informações detalhadas (http://www.php.net/manual/en/ref.image.php).
(http://www.php.net/manual/en/ref.zlib.php).
Estilo de desenho de linhas
O desenho de linhas é definido pela largura, cor e padrão de traços. Todos estes
parâmetros podem ser atribuídos pelos seguintes métodos da classe
Zend_Pdf_Page:
Estilo de preenchimento
Os métodos Zend_Pdf_Page::drawRectangle(),
Zend_Pdf_Page::drawPolygon(),
Zend_Pdf_Page::drawCircle() e
Zend_Pdf_Page::drawEllipse() usam o argumento
$fillType como um parâmetro opcional. Ele pode ser:
Zend_Pdf_Page::SHAPE_DRAW_STROKE - pincelamento
Zend_Pdf_Page::SHAPE_DRAW_FILL - apenas preenchimento
Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE - preenchimento e pincelamento
(comportamento padrão)
Os métodos Zend_Pdf_Page::drawPolygon() também recebem um
parâmetro adicional $fillMethod:
Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING (comportamento padrão)
A referência do PDF descreve esta regra como:
A regra "nonzero winding number" determina se um dado ponto está dentro
de um caminho por conceitualmente desenhar um raio a partir desse ponto
até o infinito em qualquer direção e, em seguida, analisar os lugares
onde um segmento do caminho atravessa o raio. Começando a contagem do 0,
a regra acrescenta 1 cada vez que um segmento cruza o raio da esquerda
para a direita e subtrai 1 cada vez que um segmento cruza da direita
para a esquerda. Após a contagem de todos os cruzamentos, se o resultado
for 0 então o ponto está fora do caminho; de outra forma está dentro.
Nota: O método descrito não especifica o que fazer se um caminho
segmento coincide ou é tangente ao escolhido raio. Uma vez que a
direção do raio é arbitrária, a regra simplesmente escolhe um raio que
não encontra tais problemas de interseção. Para simples caminhos
convexos, a regra "nonzero winding number" define o interior e o
exterior como esperado intuitivamente. Os casos mais interessantes são
os envolvem caminhos complexos ou com auto-intersecção, como os que são
apresentados na Figura 4.10 (na Referência do PDF).
Para um caminho que consiste em uma estrela de cinco pontas, desenhada
com cinco linhas retas conectadas se inter-seccionando, a regra
considera como sendo o interior toda a área delimitada pela estrela,
incluindo o pentágono no centro. Para um caminho composto de dois
círculos concêntricos, as áreas delimitadas por ambos os círculos são
consideradas como sendo o interior, desde que ambos os círculos sejam
desenhados na mesma direção. Se os círculos forem desenhados em direções
opostas, apenas a forma da "rosquinha" entre eles está no interior, de
acordo com a regra; o "buraco da rosquinha" está no exterior.
Zend_Pdf_Page::FILL_METHOD_EVEN_ODD
A referência do PDF descreve esta regra como:
Uma alternativa à regra "nonzero winding number" é a regra "even-odd".
Esta regra determina a "interiorização" de um ponto através do desenho
de um raio daquele ponto em qualquer direção e simplesmente contando a
quantidade de segmentos de caminhos que cruzam o raio, independentemente
da direção. Se a quantidade for ímpar, o ponto está no interior; se for
par está no exterior. Isto gera os mesmos resultados da regra "nonzero
winding number" para caminhos com formas simples, mas produz resultados
diferentes para os mais de forma mais complexa. A Figura 4.11 (na
Referência do PDF) mostra os efeitos da aplicação da
regra "even-odd" para caminhos complexos. Para a estrela de cinco
pontas, a regra considera os pontos triangulares como estando no
interior do caminho, mas não o pentágono no centro. Para os dois
círculos concêntricos, apenas a forma da "rosquinha" entre os círculos é
considerada como interior, independentemente das direções em que eles
foram desenhados.
Transformações Lineares
Rotações
A página PDF pode ser rotacionada antes do uso de qualquer
operação de desenho. Isso pode ser feito pelo método
Zend_Pdf_Page::rotate():
Starting from ZF 1.8, scaling
Scaling transformation is provided by
Zend_Pdf_Page::scale() method:
Starting from ZF 1.8, translating
Coordinate system shifting is performed by
Zend_Pdf_Page::translate() method:
Starting from ZF 1.8, skewing
Page skewing can be done using Zend_Pdf_Page::skew()
method:
Salvar/restaurar estados gráficos
A qualquer hora os estados gráficos de uma página (fonte atual, tamanho da fonte, cor
das linhas, cor de preenchimento, estilo de linha, rotação da página, e área de corte)
podem ser salvos e então restaurados. Operações "Salvar" colocam os dados em uma pilha,
as restaurações recuperam os estados da pilha.
Existem dois métodos na classe Zend_Pdf_Page para essas
operações:
Recorte de área de desenho
O PDF e o módulo Zend_Pdf dão suporte ao
recorte de áreas de desenho. O recorte da área atual limita as regiões da página que
serão afetadas por operações de pintura. Inicialmente é a página toda.
A classe Zend_Pdf_Page fornece um conjunto de métodos para
operações de recorte.
Estilos
A classe Zend_Pdf_Style fornece funcionalidades de estilo.
Estilos podem ser usados para o armazenamento de um conjunto de parâmetros do estado
gráfico e aplicá-los à uma página PDF com uma operação:
A classe Zend_Pdf_Style fornece um conjunto de métodos para
configurar ou recuperar diferentes parâmetros do estado gráfico:
Transparency
Zend_Pdf module supports transparency handling.
Transparency may be set using Zend_Pdf_Page::setAlpha() method: