Drawing.
Geometria.
O formato de arquivo 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 polegada).
O tamanho da página pode ser recuperado de um objeto página:
getWidth();
$height = $pdfPage->getHeight();]]>
Colors.
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 são fornecidos 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 e o tamanho da fonte atuais são usadaos para a
operação de desenho (veja a descrição detalhada abaixo).
Desenhar um texo na página.
drawText('Hello world!', 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:
Desenhar uma string codificada em UTF-8 em uma página.
drawText($unicodeString, 72, 720, 'UTF-8');
...]]>
Using fonts.
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 types,
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(factory):
Zend_Pdf_Font::fontWithName($fontName) para as 14 fontes padrão ou
end_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 font (que normalmente possui a extensão '.ttf') ou uma fonte
OpenType (de extansão '.otf') se ela contiver o mesmo contorno das TrueType. Atualmente sem suporte, mas planejadas
para um lancçamento futuro são os arquivos do Mac OS X .dfont e os 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, a o método fábrica irá lanãr 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 visualiza-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 embarca-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 e 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 uya 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.
Desenhando Imagens.
A classe Zend_Pdf_Page fornece o método drawImage() para o desenho de imagens:
Objetos de imagem devem ser criaos 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 PHP 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::drawPoligon(),
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::drawPoligon() também recebem um parâmetro adicional $fillMethod:
Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING (comportamento padrão)
A PDF reference escreve 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 direcçã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
(Em uma Referência PDF).
Para um caminho que consiste em uma estrela de cinco pontas, desenhada com cinco linhas retas
conectadas interseccionando-se, 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 do "donut" entre eles está no interior, de acordo
com a regra; o "buraco do donut" está no exterior.
Zend_Pdf_Page::FILL_METHOD_EVEN_ODD
PDF reference describes this rule as follows:
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 impar, 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 (em uma Referência 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 do "donut" entre os círculos é considerada como
interior, independentemente das direções em que eles foram desenhados.
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():
Salvar/restaurar estados gráficos.
A qualquer hora os estados gráficos de uma págiuna (fonte atual, tamanho da fonte, cor das linhas, cor de
preenchimento, estilo de linha, rotação da página, e área de clip) 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: