Explorar el Código

revert

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@20188 44c647ce-9c0f-0410-b52a-842ac1e357ba
mauriciofauth hace 16 años
padre
commit
e93dd1e0bc

+ 299 - 598
documentation/manual/pt-br/module_specs/Zend_Db_Profiler.xml

@@ -1,599 +1,300 @@
-<sect1 id="zend.db.profiler">
-
-
-
-    <title>Zend_Db_Profiler</title>
-
-
-
-    <sect2 id="zend.db.profiler.introduction">
-
-
-
-        <title>Introdução</title>
-
-
-
-        <para>
-
-                <code>Zend_Db_Profiler</code> pode ser habilitado para permitir o profilling(análise de desempenho) de suas consultas(instruções SQL).
-
-            Neste profiler(analisador) incluem-se as consultas processadas pelo adaptador e o tempo gasto em suas execuções,
-
-            permitindo inspecionar as consultas que foram executadas, sem a necessidade de adicionar código ou classes extras de depuração. O seu uso avançado permite também que o desenvolvedor filtre quais consultas serão analisadas.
-
-        </para>
-
-
-
-        <para>
-
-            Habilite o profiler para todos as consultas passando uma directiva
-
-            para o construtor do adaptador, ou solicitando ao adaptador para
-
-            habilitá-lo depois.
-
-        </para>
-
-
-
-        <programlisting role="php"><![CDATA[<?php
-
-require_once 'Zend/Db.php';
-
-
-
-$params = array (
-
-    'host'     => '127.0.0.1',
-
-    'username' => 'malory',
-
-    'password' => '******',
-
-    'dbname'   => 'camelot',
-
-    'profiler' => true  // ligando o profiller; mude para false para desabilitá-lo(padrão)
-
-);
-
-
-
-$db = Zend_Db::factory('PDO_MYSQL', $params);
-
-
-
-// desligando o profiller:
-
-$db->getProfiler()->setEnabled(false);
-
-
-
-// ligando o profiller:
-
-$db->getProfiler()->setEnabled(true);]]>
-
-        </programlisting>
-
-    </sect2>
-
-
-
-    <sect2 id="zend.db.profiler.using">
-
-
-
-        <title>Usando o Profiler</title>
-
-
-
-        <para>
-
-            A qualquer momento, capture o profiler usando o método
-
-            <code>getProfiler()</code> do adaptador.
-
-        </para>
-
-
-
-        <programlisting role="php"><![CDATA[<?php
-
-$profiler = $db->getProfiler();]]>
-
-        </programlisting>
-
-
-
-        <para>
-
-            Com isto, é retornado uma instância do objeto <code>Zend_Db_Profiler</code>. Com
-
-            esta instância, o desenvolvedor pode examinar suas consultas usando uma variedade de métodos:
-
-        </para>
-
-
-
-        <itemizedlist>
-
-            <listitem>
-
-                <para>
-
-                    <code>getTotalNumQueries()</code> retorna o número total
-
-                    de consultas que foram analisadas.
-
-                </para>
-
-            </listitem>
-
-            <listitem>
-
-                <para>
-
-                    <code>getTotalElapsedSecs()</code> retorna o número total
-
-                    de segundos gastos em todas as consultas analisadas.
-
-                </para>
-
-            </listitem>
-
-            <listitem>
-
-                <para>
-
-                    <code>getQueryProfiles()</code> retorna um array com todas as
-
-                    análises das consultas.
-
-                </para>
-
-            </listitem>
-
-            <listitem>
-
-                <para>
-
-                    <code>getLastQueryProfile</code> retorna a última (mais recente)
-
-                    consulta analisada, independente ou não se esta consulta foi finalizada(se não, o tempo final será nulo)
-
-                </para>
-
-            </listitem>
-
-            <listitem>
-
-                <para>
-
-                    <code>clear()</code> limpa qualquer análise antiga da pilha de execução.
-
-                </para>
-
-            </listitem>
-
-        </itemizedlist>
-
-
-
-        <para>
-
-            O valor retornado pelo <code>getLastQueryProfile()</code> e os
-
-            elementos individuais do <code>getQueryProfiles()</code> são
-
-            objetos do <code>Zend_Db_Profiler_Query</code>, que provê a
-
-            habilidade de inspecionar suas consultas individualmente:
-
-        </para>
-
-
-
-        <itemizedlist>
-
-            <listitem>
-
-                <para>
-
-                    <code>getQuery()</code> retorna o texto SQL da consulta.
-
-                    O texto SQL de uma instrução preparada (prepared statement) com seus parâmetros é o texto
-
-                    no momento em que a consulta foi preparada, contendo apenas os seus parâmetros, e não os seus valores
-
-                    usados quando a instrução é executada.
-
-                </para>
-
-            </listitem>
-
-            <listitem>
-
-                <para>
-
-                    <code>getQueryParams()</code> retorna um array de valores dos parâmetros que são usados
-
-                    quando for executada uma query preparada.
-
-                    Nisto incluem-se ambos parâmetros e argumentos acoplados do método <code>execute()</code> da instrução.
-
-                    As chaves do array são os posicionais (1-baseado) ou nomeados(string) índices de parâmetro.
-
-                </para>
-
-            </listitem>
-
-            <listitem>
-
-                <para>
-
-
-
-                    <code>getElapsedSecs()</code> retorna o número de segundos que a consulta executou.
-
-                </para>
-
-            </listitem>
-
-        </itemizedlist>
-
-
-
-        <para>
-
-            A informação fornecida pelo <code>Zend_Db_Profiler</code> é útil para analisar os gargalos
-
-            das aplicações, e para depurar consultas que foram executadas. Por exemplo, para ver a última
-
-            consulta que foi executada:
-
-        </para>
-
-
-
-        <programlisting role="php"><![CDATA[<?php
-
-$query = $profiler->getLastQueryProfile();
-
-
-
-echo $query->getQuery();]]>
-
-        </programlisting>
-
-
-
-        <para>
-
-            Talvez uma página qualquer esteja gerando lentidão. Use o profiler para determinar
-
-            primeiro o total de segundos gastos em todas as consultas, e então
-
-            examine-as para encontrar aquele que demorou mais tempo para executar.
-
-        </para>
-
-
-
-        <programlisting role="php"><![CDATA[<?php
-
-$totalTime    = $profiler->getTotalElapsedSecs();
-
-$queryCount   = $profiler->getTotalNumQueries();
-
-$longestTime  = 0;
-
-$longestQuery = null;
-
-
-
-foreach ($profiler->getQueryProfiles() as $query) {
-
-    if ($query->getElapsedSecs() > $longestTime) {
-
-        $longestTime  = $query->getElapsedSecs();
-
-        $longestQuery = $query->getQuery();
-
-    }
-
-}
-
-
-
-echo 'Executado: ' . $queryCount . ' consultas em ' . $totalTime . ' seconds' . "\n";
-
-echo 'Tamanho médio da query' . $totalTime / $queryCount . ' seconds' . "\n";
-
-echo 'consultas por segundo: ' . $queryCount / $totalTime . "\n";
-
-echo 'Query que demorou mais tempo: ' . $longestTime . "\n";
-
-echo "Query mais longa: \n" . $longestQuery . "\n";]]>
-
-        </programlisting>
-
-
-
-    </sect2>
-
-
-
-    <sect2 id="zend.db.profiler.advanced">
-
-
-
-        <title>Uso Avançado do Profiller</title>
-
-
-
-        <para>
-
-            Além da inspeção de consultas, o profiler também permite ao devenvolvedor
-
-            filtrar quais consultas sejam analisadas. Os seguintes métodos
-
-            operam em uma instância de <code>Zend_Db_Profiler</code>.
-
-        </para>
-
-
-
-        <sect3 id="zend.db.profiler.advanced.filtertime">
-
-            <title>Filtro por tempo decorrido das consultas</title>
-
-
-
-            <para>
-
-                <code>setFilterElapsedSecs()</code> permite ao desenvolvedor setar um
-
-                tempo mínimo para uma consulta antes de ela ser analisada.
-
-                Para remover o filtro, passe para o método um valor nulo.
-
-            </para>
-
-
-
-            <programlisting role="php"><![CDATA[<?php
-
-// Apenas consultas analisadas que levam ao menos 5 segundos:
-
-$profiler->setFilterElapsedSecs(5);
-
-
-
-// Todas as consultas analisadas, não importando o tamanho:
-
-$profiler->setFilterElapsedSecs(null);]]>
-
-            </programlisting>
-
-        </sect3>
-
-
-
-        <sect3 id="zend.db.profiler.advanced.filtertype">
-
-            <title>Filtro pelo tipo de consulta</title>
-
-
-
-            <para>
-
-                <code>setFilterQueryType()</code> permite ao desenvolvedor setar
-
-                quais tipos de consultas deverão ser analisadas; para analisar
-
-                múltiplos tipos, lógicos ou todas. Os tipos de consultas são definidas
-
-                segundo as constantes de <code>Zend_Db_Profiler</code>
-
-            </para>
-
-
-
-            <itemizedlist>
-
-                <listitem>
-
-                    <para>
-
-                        <code>Zend_Db_Profiler::CONNECT</code>: operações de conexão,
-
-                        ou seleção de base de dados.
-
-                    </para>
-
-                </listitem>
-
-                <listitem>
-
-                    <para>
-
-                        <code>Zend_Db_Profiler::QUERY</code>: consultas gerais da
-
-                        base de dados que não se encaixam com outro tipos.
-
-                    </para>
-
-                </listitem>
-
-                <listitem>
-
-                    <para>
-
-                        <code>Zend_Db_Profiler::INSERT</code>: qualquer consulta que
-
-                        adicionar novos dados para a base de dados, geralmente um INSERT SQL.
-
-                    </para>
-
-                </listitem>
-
-                <listitem>
-
-                    <para>
-
-                        <code>Zend_Db_Profiler::UPDATE</code>: qualquer consulta que
-
-                        atualiza dados existentes, geralmente um UPDATE SQL.
-
-                    </para>
-
-                </listitem>
-
-                <listitem>
-
-                    <para>
-
-                        <code>Zend_Db_Profiler::DELETE</code>: qualquer consulta que
-
-                        exclui dados existentes, geralmente um DELETE SQL.
-
-                    </para>
-
-                </listitem>
-
-                <listitem>
-
-                    <para>
-
-                        <code>Zend_Db_Profiler::SELECT</code>: qualquer consulta que
-
-                        retorna dados existentes, geralmente um SELECT SQL.
-
-                    </para>
-
-                </listitem>
-
-                <listitem>
-
-                    <para>
-
-                        <code>Zend_Db_Profiler::TRANSACTION</code>: qualquer
-
-                        operação transacional, como a inicialição da transação, commit ou rollback.
-
-                    </para>
-
-                </listitem>
-
-            </itemizedlist>
-
-
-
-            <para>
-
-                Assim como usando o <code>setFilterElapsedSecs()</code>, você pode remover
-
-                quaisquer filtros existentes passando <code>null</code> como único argumento.
-
-            </para>
-
-
-
-            <programlisting role="php"><![CDATA[<?php
-
-// Analisa somente consultas usando SELECT
-
-$profiler->setFilterQueryType(Zend_Db_Profiler::SELECT);
-
-
-
-// Analisa as consultas SELECT, INSERT e UPDATE
-
-$profiler->setFilterQueryType(Zend_Db_Profiler::SELECT | Zend_Db_Profiler::INSERT | Zend_Db_Profiler::UPDATE);
-
-
-
-// Analisa a instrução DELETE (então podemos descobrir porque os dados continuam desaparecendo)
-
-$profiler->setFilterQueryType(Zend_Db_Profiler::DELETE);
-
-
-
-// Remove totos os filtros
-
-$profiler->setFilterQueryType(null);]]>
-
-            </programlisting>
-
-
-
-        </sect3>
-
-
-
-        <sect3 id="zend.db.profiler.advanced.getbytype">
-
-            <title>Retorna análises por tipo de consulta</title>
-
-
-
-            <para>
-
-                Usando o <code>setFilterQueryType()</code>, podemos resumir as análises geradas.
-
-                Entretanto, às vezes é mais útil manter todas as análises e visualizar somente
-
-                aquelas que você precisa num determinado momento. Outra funcionalidade do
-
-                <code>getQueryProfiles()</code> é a capacidade de fazer esta filtragem
-
-                "on-the-fly" (execução de código em tempo de execução),
-
-                passando o tipo da consulta(ou uma combinação lógica de tipos) em seu primeiro argumento;
-
-                veja na <xref linkend="zend.db.profiler.advanced.filtertype" />
-
-                uma lista de todas as constantes dos tipos de consultas.
-
-            </para>
-
-
-
-            <programlisting role="php"><![CDATA[<?php
-
-// Retorna apenas consultas SELECT analisadas
-
-$profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::SELECT);
-
-
-
-// Retorna apenas anásiles de consultas SELECT, INSERT e UPDATE.
-
-$profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::SELECT | Zend_Db_Profiler::INSERT | Zend_Db_Profiler::UPDATE);
-
-
-
-// Retorna as análises feitas na instrução DELETE (então podemos descobrir porque os dados continuam desaparecendo)
-
-$profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::DELETE);]]>
-
-            </programlisting>
-
-
-
-        </sect3>
-
-
-
-    </sect2>
-
-
-
-</sect1>
-
-<!--
-
-vim:se ts=4 sw=4 et:
-
+<sect1 id="zend.db.profiler">
+
+    <title>Zend_Db_Profiler</title>
+
+    <sect2 id="zend.db.profiler.introduction">
+
+        <title>Introdução</title>
+
+        <para>
+                <code>Zend_Db_Profiler</code> pode ser habilitado para permitir o profilling(análise de desempenho) de suas consultas(instruções SQL).
+            Neste profiler(analisador) incluem-se as consultas processadas pelo adaptador e o tempo gasto em suas execuções,
+            permitindo inspecionar as consultas que foram executadas, sem a necessidade de adicionar código ou classes extras de depuração. O seu uso avançado permite também que o desenvolvedor filtre quais consultas serão analisadas.
+        </para>
+
+        <para>
+            Habilite o profiler para todos as consultas passando uma directiva
+            para o construtor do adaptador, ou solicitando ao adaptador para
+            habilitá-lo depois.
+        </para>
+
+        <programlisting role="php"><![CDATA[<?php
+require_once 'Zend/Db.php';
+
+$params = array (
+    'host'     => '127.0.0.1',
+    'username' => 'malory',
+    'password' => '******',
+    'dbname'   => 'camelot',
+    'profiler' => true  // ligando o profiller; mude para false para desabilitá-lo(padrão)
+);
+
+$db = Zend_Db::factory('PDO_MYSQL', $params);
+
+// desligando o profiller:
+$db->getProfiler()->setEnabled(false);
+
+// ligando o profiller:
+$db->getProfiler()->setEnabled(true);]]>
+        </programlisting>
+    </sect2>
+
+    <sect2 id="zend.db.profiler.using">
+
+        <title>Usando o Profiler</title>
+
+        <para>
+            A qualquer momento, capture o profiler usando o método
+            <code>getProfiler()</code> do adaptador.
+        </para>
+
+        <programlisting role="php"><![CDATA[<?php
+$profiler = $db->getProfiler();]]>
+        </programlisting>
+
+        <para>
+            Com isto, é retornado uma instância do objeto <code>Zend_Db_Profiler</code>. Com
+            esta instância, o desenvolvedor pode examinar suas consultas usando uma variedade de métodos:
+        </para>
+
+        <itemizedlist>
+            <listitem>
+                <para>
+                    <code>getTotalNumQueries()</code> retorna o número total
+                    de consultas que foram analisadas.
+                </para>
+            </listitem>
+            <listitem>
+                <para>
+                    <code>getTotalElapsedSecs()</code> retorna o número total
+                    de segundos gastos em todas as consultas analisadas.
+                </para>
+            </listitem>
+            <listitem>
+                <para>
+                    <code>getQueryProfiles()</code> retorna um array com todas as
+                    análises das consultas.
+                </para>
+            </listitem>
+            <listitem>
+                <para>
+                    <code>getLastQueryProfile</code> retorna a última (mais recente)
+                    consulta analisada, independente ou não se esta consulta foi finalizada(se não, o tempo final será nulo)
+                </para>
+            </listitem>
+            <listitem>
+                <para>
+                    <code>clear()</code> limpa qualquer análise antiga da pilha de execução.
+                </para>
+            </listitem>
+        </itemizedlist>
+
+        <para>
+            O valor retornado pelo <code>getLastQueryProfile()</code> e os
+            elementos individuais do <code>getQueryProfiles()</code> são
+            objetos do <code>Zend_Db_Profiler_Query</code>, que provê a
+            habilidade de inspecionar suas consultas individualmente:
+        </para>
+
+        <itemizedlist>
+            <listitem>
+                <para>
+                    <code>getQuery()</code> retorna o texto SQL da consulta.
+                    O texto SQL de uma instrução preparada (prepared statement) com seus parâmetros é o texto
+                    no momento em que a consulta foi preparada, contendo apenas os seus parâmetros, e não os seus valores
+                    usados quando a instrução é executada.
+                </para>
+            </listitem>
+            <listitem>
+                <para>
+                    <code>getQueryParams()</code> retorna um array de valores dos parâmetros que são usados
+                    quando for executada uma query preparada.
+                    Nisto incluem-se ambos parâmetros e argumentos acoplados do método <code>execute()</code> da instrução.
+                    As chaves do array são os posicionais (1-baseado) ou nomeados(string) índices de parâmetro.
+                </para>
+            </listitem>
+            <listitem>
+                <para>
+
+                    <code>getElapsedSecs()</code> retorna o número de segundos que a consulta executou.
+                </para>
+            </listitem>
+        </itemizedlist>
+
+        <para>
+            A informação fornecida pelo <code>Zend_Db_Profiler</code> é útil para analisar os gargalos
+            das aplicações, e para depurar consultas que foram executadas. Por exemplo, para ver a última
+            consulta que foi executada:
+        </para>
+
+        <programlisting role="php"><![CDATA[<?php
+$query = $profiler->getLastQueryProfile();
+
+echo $query->getQuery();]]>
+        </programlisting>
+
+        <para>
+            Talvez uma página qualquer esteja gerando lentidão. Use o profiler para determinar
+            primeiro o total de segundos gastos em todas as consultas, e então
+            examine-as para encontrar aquele que demorou mais tempo para executar.
+        </para>
+
+        <programlisting role="php"><![CDATA[<?php
+$totalTime    = $profiler->getTotalElapsedSecs();
+$queryCount   = $profiler->getTotalNumQueries();
+$longestTime  = 0;
+$longestQuery = null;
+
+foreach ($profiler->getQueryProfiles() as $query) {
+    if ($query->getElapsedSecs() > $longestTime) {
+        $longestTime  = $query->getElapsedSecs();
+        $longestQuery = $query->getQuery();
+    }
+}
+
+echo 'Executado: ' . $queryCount . ' consultas em ' . $totalTime . ' seconds' . "\n";
+echo 'Tamanho médio da query' . $totalTime / $queryCount . ' seconds' . "\n";
+echo 'consultas por segundo: ' . $queryCount / $totalTime . "\n";
+echo 'Query que demorou mais tempo: ' . $longestTime . "\n";
+echo "Query mais longa: \n" . $longestQuery . "\n";]]>
+        </programlisting>
+
+    </sect2>
+
+    <sect2 id="zend.db.profiler.advanced">
+
+        <title>Uso Avançado do Profiller</title>
+
+        <para>
+            Além da inspeção de consultas, o profiler também permite ao devenvolvedor
+            filtrar quais consultas sejam analisadas. Os seguintes métodos
+            operam em uma instância de <code>Zend_Db_Profiler</code>.
+        </para>
+
+        <sect3 id="zend.db.profiler.advanced.filtertime">
+            <title>Filtro por tempo decorrido das consultas</title>
+
+            <para>
+                <code>setFilterElapsedSecs()</code> permite ao desenvolvedor setar um
+                tempo mínimo para uma consulta antes de ela ser analisada.
+                Para remover o filtro, passe para o método um valor nulo.
+            </para>
+
+            <programlisting role="php"><![CDATA[<?php
+// Apenas consultas analisadas que levam ao menos 5 segundos:
+$profiler->setFilterElapsedSecs(5);
+
+// Todas as consultas analisadas, não importando o tamanho:
+$profiler->setFilterElapsedSecs(null);]]>
+            </programlisting>
+        </sect3>
+
+        <sect3 id="zend.db.profiler.advanced.filtertype">
+            <title>Filtro pelo tipo de consulta</title>
+
+            <para>
+                <code>setFilterQueryType()</code> permite ao desenvolvedor setar
+                quais tipos de consultas deverão ser analisadas; para analisar
+                múltiplos tipos, lógicos ou todas. Os tipos de consultas são definidas
+                segundo as constantes de <code>Zend_Db_Profiler</code>
+            </para>
+
+            <itemizedlist>
+                <listitem>
+                    <para>
+                        <code>Zend_Db_Profiler::CONNECT</code>: operações de conexão,
+                        ou seleção de base de dados.
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                        <code>Zend_Db_Profiler::QUERY</code>: consultas gerais da
+                        base de dados que não se encaixam com outro tipos.
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                        <code>Zend_Db_Profiler::INSERT</code>: qualquer consulta que
+                        adicionar novos dados para a base de dados, geralmente um INSERT SQL.
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                        <code>Zend_Db_Profiler::UPDATE</code>: qualquer consulta que
+                        atualiza dados existentes, geralmente um UPDATE SQL.
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                        <code>Zend_Db_Profiler::DELETE</code>: qualquer consulta que
+                        exclui dados existentes, geralmente um DELETE SQL.
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                        <code>Zend_Db_Profiler::SELECT</code>: qualquer consulta que
+                        retorna dados existentes, geralmente um SELECT SQL.
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                        <code>Zend_Db_Profiler::TRANSACTION</code>: qualquer
+                        operação transacional, como a inicialição da transação, commit ou rollback.
+                    </para>
+                </listitem>
+            </itemizedlist>
+
+            <para>
+                Assim como usando o <code>setFilterElapsedSecs()</code>, você pode remover
+                quaisquer filtros existentes passando <code>null</code> como único argumento.
+            </para>
+
+            <programlisting role="php"><![CDATA[<?php
+// Analisa somente consultas usando SELECT
+$profiler->setFilterQueryType(Zend_Db_Profiler::SELECT);
+
+// Analisa as consultas SELECT, INSERT e UPDATE
+$profiler->setFilterQueryType(Zend_Db_Profiler::SELECT | Zend_Db_Profiler::INSERT | Zend_Db_Profiler::UPDATE);
+
+// Analisa a instrução DELETE (então podemos descobrir porque os dados continuam desaparecendo)
+$profiler->setFilterQueryType(Zend_Db_Profiler::DELETE);
+
+// Remove totos os filtros
+$profiler->setFilterQueryType(null);]]>
+            </programlisting>
+
+        </sect3>
+
+        <sect3 id="zend.db.profiler.advanced.getbytype">
+            <title>Retorna análises por tipo de consulta</title>
+
+            <para>
+                Usando o <code>setFilterQueryType()</code>, podemos resumir as análises geradas.
+                Entretanto, às vezes é mais útil manter todas as análises e visualizar somente
+                aquelas que você precisa num determinado momento. Outra funcionalidade do
+                <code>getQueryProfiles()</code> é a capacidade de fazer esta filtragem
+                "on-the-fly" (execução de código em tempo de execução),
+                passando o tipo da consulta(ou uma combinação lógica de tipos) em seu primeiro argumento;
+                veja na <xref linkend="zend.db.profiler.advanced.filtertype" />
+                uma lista de todas as constantes dos tipos de consultas.
+            </para>
+
+            <programlisting role="php"><![CDATA[<?php
+// Retorna apenas consultas SELECT analisadas
+$profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::SELECT);
+
+// Retorna apenas anásiles de consultas SELECT, INSERT e UPDATE.
+$profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::SELECT | Zend_Db_Profiler::INSERT | Zend_Db_Profiler::UPDATE);
+
+// Retorna as análises feitas na instrução DELETE (então podemos descobrir porque os dados continuam desaparecendo)
+$profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::DELETE);]]>
+            </programlisting>
+
+        </sect3>
+
+    </sect2>
+
+</sect1>
+<!--
+vim:se ts=4 sw=4 et:
 -->

+ 1304 - 2608
documentation/manual/pt-br/module_specs/Zend_Db_Select.xml

@@ -1,2608 +1,1304 @@
-<sect1 id="zend.db.select">
-
-
-
-    <title>Zend_Db_Select</title>
-
-
-
-    <sect2 id="zend.db.select.introduction">
-
-
-
-        <title>Visão Geral do Objeto Select</title>
-
-
-
-        <para>
-
-            O objeto Zend_Db_Select representa um comando de consulta SQL <code>SELECT</code>.
-
-            A classe possui métodos para a adição de partes individuais em uma query. Você
-
-            pode especificar algumas partes da consulta usando métodos PHP e estruturas de
-
-            dados, e a classe se encarrega de formar a sintaxe SQL correta para você. Depois
-
-            da construção de uma consulta, você pode executá-la como se você houvesse a escrito
-
-            em uma string.
-
-        </para>
-
-
-
-        <para>
-
-            As vantagens oferecidas pelo Zend_Db_Select incluem:
-
-        </para>
-
-
-
-        <itemizedlist>
-
-            <listitem>
-
-                <para>
-
-                    Métodos orientados a objetos para especificação de consultas SQL
-
-                    de maneira "piece-by-piece" (aos pedaços ou em partes);
-
-                </para>
-
-            </listitem>
-
-            <listitem>
-
-                <para>
-
-                    Abstração de independência de base de dados de algumas partes
-
-                    da consulta SQL;
-
-                </para>
-
-            </listitem>
-
-            <listitem>
-
-                <para>
-
-                    Colocação automática de aspas nos identificadores de metadados na maioria
-
-                    dos casos, para dar suporte aos identificadores que contém palavras SQL reservadas
-
-                    e caracteres especiais;
-
-                </para>
-
-            </listitem>
-
-            <listitem>
-
-                <para>
-
-                    Colocação automática de aspas nos identificadores e valores, para ajudar
-
-                    na redução de ataques por "SQL injection".
-
-                </para>
-
-            </listitem>
-
-        </itemizedlist>
-
-
-
-        <para>
-
-            A utilização de Zend_Db_Select não é obrigatória. Para consultas SELECT
-
-            muito simples, normalmente é mais fácil escrever toda a consulta SQL
-
-            em uma string e executá-la usando métodos da classe Adapter, como o
-
-            <code>query()</code> ou <code>fetchAll()</code>. O uso de Zend_Db_Select
-
-            é muito útil quando você precisa montar uma consulta SELECT usando "procedures"
-
-            (através de procedimentos), ou quando você precisa montar a consulta baseando-se
-
-            na lógica condicional da sua aplicação.
-
-        </para>
-
-
-
-    </sect2>
-
-
-
-    <sect2 id="zend.db.select.creating">
-
-
-
-        <title>Criando um Objeto Select</title>
-
-
-
-        <para>
-
-            Você pode criar uma instância de um objeto Zend_Db_Select
-
-            usando o método <code>select()</code> de um objeto Zend_Db_Adapter_Abstract.
-
-        </para>
-
-
-
-        <example id="zend.db.select.creating.example-db">
-
-            <title>Exemplo do método select() do adaptador para bases de dados</title>
-
-            <programlisting role="php"><![CDATA[<?php
-
-
-
-$db = Zend_Db::factory( ...options... );
-
-$select = $db->select();]]></programlisting>
-
-        </example>
-
-
-
-        <para>
-
-            Outra forma de criar um objeto Zend_Db_Select é com o
-
-            construtor dele, especificando o adaptador como parâmetro.
-
-        </para>
-
-
-
-        <example id="zend.db.select.creating.example-new">
-
-            <title>Examplo da criação de um novo objeto Select</title>
-
-            <programlisting role="php"><![CDATA[<?php
-
-
-
-$db = Zend_Db::factory( ...options... );
-
-$select = new Zend_Db_Select($db);]]></programlisting>
-
-        </example>
-
-
-
-    </sect2>
-
-
-
-    <sect2 id="zend.db.select.building">
-
-
-
-        <title>Construindo Consultas Select</title>
-
-
-
-        <para>
-
-            Ao contruir um consulta, você pode adicionar cláusulas uma por uma.
-
-            Existe um método diferente para cada cláusula no objeto.
-
-        </para>
-
-
-
-        <example id="zend.db.select.building.example">
-
-            <title>Exemplo do uso de métodos para adicionar cláusulas</title>
-
-            <programlisting role="php"><![CDATA[<?php
-
-
-
-// Create the Zend_Db_Select object
-
-$select = $db->select();
-
-
-
-// Add a FROM clause
-
-$select->from( ...specify table and columns... )
-
-
-
-// Add a WHERE clause
-
-$select->where( ...specify search criteria... )
-
-
-
-// Add an ORDER BY clause
-
-$select->order( ...specify sorting criteria... );]]></programlisting>
-
-        </example>
-
-
-
-        <para>
-
-            Você também pode usar a maior parte dos métodos do objeto Zend_Db_Select
-
-            com uma interface "fluent" conveniente.  Uma interface "fluent" significa que cada
-
-            método retorna uma referência para o objeto no qual foi chamado, então você pode
-
-            imediatamente chamar outro método.
-
-        </para>
-
-
-
-        <example id="zend.db.select.building.example-fluent">
-
-            <title>Examplo de uso da interface "fluent"</title>
-
-            <programlisting role="php"><![CDATA[<?php
-
-
-
-$select = $db->select()
-
-    ->from( ...specify table and columns... )
-
-    ->where( ...specify search criteria... )
-
-    ->order( ...specify sorting criteria... );]]></programlisting>
-
-        </example>
-
-
-
-        <para>
-
-            Os exemplos nesta seção mostram o uso da  interface "fluent",
-
-            mas você pode usar a interface "non-fluent" em todos os casos.
-
-            É freqüentemente necessário usar a interface "non-fluent" quando, por exemplo,
-
-            sua aplicação precisa executar alguma lógica antes de adicionar uma cláusula
-
-            a uma consulta.
-
-        </para>
-
-
-
-        <sect3 id="zend.db.select.building.from">
-
-
-
-            <title>Adicionando uma cláusula FROM</title>
-
-
-
-            <para>
-
-                Especifique a tabela para esta consulta usando o método <code>from()</code>.
-
-                Você pode especificar o nome da tabela como uma simples string.
-
-                Zend_Db_Select coloca o entre aspas o nome da tabela, então, você pode
-
-                usar caracteres especiais.
-
-            </para>
-
-
-
-            <example id="zend.db.select.building.from.example">
-
-                <title>Example of the from() method</title>
-
-                <programlisting role="php"><![CDATA[<?php
-
-
-
-// Build this query:
-
-//   SELECT *
-
-//   FROM "products"
-
-
-
-$select = $db->select()
-
-    ->from( 'products' );]]></programlisting>
-
-            </example>
-
-
-
-            <para>
-
-                You can also specify the correlation name (sometimes called the
-
-                "table alias") for a table.  Instead of a simple string, use an
-
-                associative array mapping the correlation name to the table
-
-                name.  In other clauses of the SQL query, use this correlation
-
-                name.  If your query joins more than one table, Zend_Db_Select
-
-                generates unique correlation names based on the table names,
-
-                for any tables for which you don't specify the correlation name.
-
-            </para>
-
-
-
-            <example id="zend.db.select.building.from.example-cname">
-
-                <title>Example of specifying a table correlation name</title>
-
-                <programlisting role="php"><![CDATA[<?php
-
-
-
-// Build this query:
-
-//   SELECT p.*
-
-//   FROM "products" AS p
-
-
-
-$select = $db->select()
-
-    ->from( array('p' => 'products') );]]></programlisting>
-
-            </example>
-
-
-
-            <para>
-
-                Algumas marcas de RDBMS dão suporte a um especificador de schema
-
-                para uma tabela. Você pode especificar o nome a tabela como
-
-                "<code>schemaName.tableName</code>", onde Zend_Db_Select coloca entre aspas
-
-                cada uma das partes individualmente, ou então você deve especificar o nome
-
-                do schema separadamente. Um nome de schema especificado no nome da tabela
-
-                precede um schema fornecido separadamente se eventualmente ambos forem
-
-                informados.
-
-            </para>
-
-
-
-            <example id="zend.db.select.building.from.example-schema">
-
-                <title>Exemplo de especificação de nome de schema</title>
-
-                <programlisting role="php"><![CDATA[<?php
-
-
-
-// Build this query:
-
-//   SELECT *
-
-//   FROM "myschema"."products"
-
-
-
-$select = $db->select()
-
-    ->from( 'myschema.products' );
-
-
-
-// or
-
-
-
-$select = $db->select()
-
-    ->from('products', '*', 'myschema');]]></programlisting>
-
-            </example>
-
-
-
-        </sect3>
-
-
-
-        <sect3 id="zend.db.select.building.columns">
-
-
-
-            <title>Adicionando Colunas</title>
-
-
-
-            <para>
-
-                No segundo argumento do método <code>from()</code> ,
-
-                você pode especificaras colunas a serem selecionadas da
-
-                respectiva tabela. Se você não especificar nenhuma coluna,
-
-                o valor padrão é "<code>*</code>", o caracter curinga para "todas as colunas".
-
-            </para>
-
-
-
-            <para>
-
-                Você pode listar as colunas em um simples array de strings, ou como
-
-                um mapeamento associativo do alias da coluna para nome da coluna.
-
-                Se você só tiver uma coluna para consultar, e não precisar indicar um
-
-                alias, você pode listá-la em uma string simples ao invés de um array.
-
-            </para>
-
-
-
-            <para>
-
-                Se você passar um array vazio como o argumento de colunas, nenhuma
-
-                coluna da respectiva tabela será incluída no result set.
-
-                Veja um exemplo de <link linkend="zend.db.select.building.join.example-no-columns">código</link> sob a seção do método <code>join()</code>.
-
-            </para>
-
-
-
-            <para>
-
-                Você pode especificar o nome da coluna como
-
-                "<code>correlationName.columnName</code>".
-
-                Zend_Db_Select os coloca entre aspas individualmente.
-
-                Caso você não especifique o nome da correlação para uma coluna,
-
-                é usado o nome da correlação da tabela indicada no método<code>from()</code>.
-
-            </para>
-
-
-
-            <example id="zend.db.select.building.columns.example">
-
-                <title>Examples of specifying columns</title>
-
-                <programlisting role="php"><![CDATA[<?php
-
-
-
-// Build this query:
-
-//   SELECT p."product_id", p."product_name"
-
-//   FROM "products" AS p
-
-
-
-$select = $db->select()
-
-    ->from(array('p' => 'products'),
-
-        array('product_id', 'product_name'));
-
-
-
-// Build the same query, specifying correlation names:
-
-//   SELECT p."product_id", p."product_name"
-
-//   FROM "products" AS p
-
-
-
-$select = $db->select()
-
-    ->from(array('p' => 'products'),
-
-        array('p.product_id', 'p.product_name'));
-
-
-
-// Build this query with an alias for one column:
-
-//   SELECT p."product_id" AS prodno, p."product_name"
-
-//   FROM "products" AS p
-
-
-
-$select = $db->select()
-
-    ->from(array('p' => 'products'),
-
-        array('prodno' => 'product_id', 'product_name'));]]></programlisting>
-
-            </example>
-
-
-
-        </sect3>
-
-
-
-        <sect3 id="zend.db.select.building.columns-expr">
-
-
-
-            <title>Adicionando Colunas de Expressões</title>
-
-
-
-            <para>
-
-               Algumas vezes as colunas de uma consulta SQL são expressões, e não
-
-               simplesmente o nome de uma couna da tabela. Expressões não devem usar
-
-               nomes de correlação ou aspas. Se a string da coluna possuir parênteses,
-
-               Zend_Db_Select a reconhecerá como uma expressão.
-
-            </para>
-
-
-
-            <para>
-
-                Você também pode criar um objeto do tipo Zend_Db_Expr explicitamente,
-
-                para prevenir que uma string seja tratada como um nome de coluna.
-
-                Zend_Db_Expr é uma classe diminuta que contém uma única string.
-
-                Zend_Db_Select reconhece obtejos do tipo Zend_Db_Expr e os converte
-
-                novamente para strings, mas não efetua qualquer alteração como a
-
-                colocação de aspas ou nomes de correlação.
-
-            </para>
-
-
-
-            <note>
-
-                <para>
-
-                    O uso de Zend_Db_Expr para nomes de colunas não é necessário se as
-
-                    expressões contiverem parênteses; Zend_Db_Select reconhece os parênteses
-
-                    e trata a string como uma expresão, ignorando a colocação de aspas e de
-
-                    nomes de correlação.
-
-                </para>
-
-            </note>
-
-
-
-            <example id="zend.db.select.building.columns-expr.example">
-
-                <title>Exemplos de especificação de colunas contendo expressões</title>
-
-                <programlisting role="php"><![CDATA[<?php
-
-
-
-// Build this query:
-
-//   SELECT p."product_id", LOWER(product_name)
-
-//   FROM "products" AS p
-
-// An expression with parentheses implicitly becomes
-
-// a Zend_Db_Expr.
-
-
-
-$select = $db->select()
-
-    ->from(array('p' => 'products'),
-
-        array('product_id', 'LOWER(product_name)'));
-
-
-
-// Build this query:
-
-//   SELECT p."product_id", (p.cost * 1.08) AS cost_plus_tax
-
-//   FROM "products" AS p
-
-
-
-$select = $db->select()
-
-    ->from(array('p' => 'products'),
-
-        array('product_id', 'cost_plus_tax' => '(p.cost * 1.08)'));
-
-
-
-// Build this query using Zend_Db_Expr explicitly:
-
-//   SELECT p."product_id", p.cost * 1.08 AS cost_plus_tax
-
-//   FROM "products" AS p
-
-
-
-$select = $db->select()
-
-    ->from(array('p' => 'products'),
-
-        array('product_id', 'cost_plus_tax' => new Zend_Db_Expr('p.cost * 1.08')));]]></programlisting>
-
-            </example>
-
-
-
-            <para>
-
-                Nos casos acima, Zend_Db_Select não altera a string
-
-                para colocar os nomes de correlação ou aspas. Se as
-
-                mudanças forem necessárias para evitar alguma ambiguidade,
-
-                você deve fazê-las manualmente na string.
-
-            </para>
-
-
-
-            <para>
-
-                Se os nomes das colunas são palavras-chave SQL ou possuem
-
-                caracteres especiais, você deve usar o método <code>quoteIdentifier()</code>
-
-                da classe Adapter, e interpolar o resultado na string. O método
-
-                <code>quoteIdentifier()</code> usa aspas no SQL para delimitar o identificador,
-
-                o que deixa claro que ele é um identificador de uma tabela ou coluna e não
-
-                parte da síntaxe SQL.
-
-            </para>
-
-
-
-            <para>
-
-                Seu código fica mais independente de base de dados se você
-
-                usar o método <code>quoteIdentifier()</code> ao invés de digitar
-
-                as aspas nas strings porque algumas marcas de SGBD Relacionais usam
-
-                símbolos fora do padrão para referenciar identificadores.
-
-                O método <code>quoteIdentifier()</code> é projetado para usar
-
-                os símbolos de referência apropriados de acordo com o tipo de adaptador.
-
-                O método  <code>quoteIdentifier()</code> também ignora qualquer
-
-                caracter de referência que aparecer no nome de um identificador.
-
-            </para>
-
-
-
-            <example id="zend.db.select.building.columns-quoteid.example">
-
-                <title>Examples of quoting columns in an expression</title>
-
-                <programlisting role="php"><![CDATA[<?php
-
-
-
-// Build this query, quoting a special column name "from" in the expression:
-
-//   SELECT p."from" + 10 AS origin
-
-//   FROM "products" AS p
-
-
-
-$select = $db->select()
-
-    ->from(array('p' => 'products'),
-
-        array('origin' => '(p.' . $db->quoteIdentifier('from') . ' + 10)'));]]></programlisting>
-
-            </example>
-
-
-
-        </sect3>
-
-
-
-        <sect3 id="zend.db.select.building.join">
-
-
-
-            <title>Adding Another Table to the Query with JOIN</title>
-
-
-
-            <para>
-
-                Many useful queries involve using a <code>JOIN</code>
-
-                to combine rows from multiple tables.  You can add
-
-                tables to a Zend_Db_Select query using the
-
-                <code>join()</code> method.  Using this method is
-
-                similar to the <code>from()</code> method, except
-
-                you can also specify a join condition in most cases.
-
-            </para>
-
-
-
-            <example id="zend.db.select.building.join.example">
-
-                <title>Example of the join() method</title>
-
-                <programlisting role="php"><![CDATA[<?php
-
-
-
-// Build this query:
-
-//   SELECT p."product_id", p."product_name", l.*
-
-//   FROM "products" AS p JOIN "line_items" AS l
-
-//     ON p.product_id = l.product_id
-
-
-
-$select = $db->select()
-
-    ->from(array('p' => 'products'),
-
-        array('product_id', 'product_name'))
-
-    ->join(array('l' => 'line_items'),
-
-        'p.product_id = l.product_id');]]></programlisting>
-
-            </example>
-
-
-
-            <para>
-
-                The second argument to <code>join()</code> is a string
-
-                that is the join condition.  This is an expression that
-
-                declares the criteria by which rows in one table match
-
-                rows in the the other table.  You can use correlation
-
-                names in this expression.
-
-            </para>
-
-
-
-            <note>
-
-                <para>
-
-                    No quoting is applied to the expression you specify
-
-                    for the join condition; if you have column names that need
-
-                    to be quoted, you must use <code>quoteIdentifier()</code>
-
-                    as you form the string for the join condition.
-
-                </para>
-
-            </note>
-
-
-
-            <para>
-
-                The third argument to <code>join()</code> is an array
-
-                of column names, like that used in the <code>from()</code>
-
-                method.  It defaults to "<code>*</code>", supports correlation
-
-                names, expressions, and Zend_Db_Expr in the same way as the
-
-                array of column names in the <code>from()</code> method.
-
-            </para>
-
-
-
-            <para>
-
-                To select no columns from a table, use an empty array for
-
-                the list of columns.  This usage works in the
-
-                <code>from()</code> method too, but typically you want
-
-                some columns from the primary table in your queries,
-
-                whereas you might want no columns from a joined table.
-
-            </para>
-
-
-
-            <example id="zend.db.select.building.join.example-no-columns">
-
-                <title>Example of specifying no columns</title>
-
-                <programlisting role="php"><![CDATA[<?php
-
-
-
-// Build this query:
-
-//   SELECT p."product_id", p."product_name"
-
-//   FROM "products" AS p JOIN "line_items" AS l
-
-//     ON p.product_id = l.product_id
-
-
-
-$select = $db->select()
-
-    ->from(array('p' => 'products'),
-
-        array('product_id', 'product_name'))
-
-    ->join(array('l' => 'line_items'),
-
-        'p.product_id = l.product_id',
-
-        array() ); // empty list of columns]]></programlisting>
-
-                <para>
-
-                    Note the empty <code>array()</code> in the above example
-
-                    in place of a list of columns from the joined table.
-
-                </para>
-
-            </example>
-
-
-
-            <para>
-
-                SQL has several types of joins.
-
-                See the list below for the methods to support
-
-                different join types in Zend_Db_Select.
-
-            </para>
-
-
-
-            <itemizedlist>
-
-                <listitem>
-
-                    <para>
-
-                        <command>INNER JOIN</command> with the
-
-                        <code>join(table, join, [columns])</code>
-
-                        or <code>joinInner(table, join, [columns])</code> methods.
-
-                    </para>
-
-                    <para>
-
-                        This may be the most common type of join.  Rows from
-
-                        each table are compared using the join condition you
-
-                        specify.  The result set includes only the rows that
-
-                        satisfy the join condition.  The result set can be
-
-                        empty if no rows satisfy this condition.
-
-                    </para>
-
-                    <para>
-
-                        All RDBMS brands support this join type.
-
-                    </para>
-
-                </listitem>
-
-                <listitem>
-
-                    <para>
-
-                        <command>LEFT JOIN</command> with the
-
-                        <code>joinLeft(table, condition, [columns])</code> method.
-
-                    </para>
-
-                    <para>
-
-                        All rows from the left operand table are included,
-
-                        matching rows from the right operand table included,
-
-                        and the columns from the right operand table are filled
-
-                        with NULLs if no row exists matching the left table.
-
-                    </para>
-
-                    <para>
-
-                        All RDBMS brands support this join type.
-
-                    </para>
-
-                </listitem>
-
-                <listitem>
-
-                    <para>
-
-                        <command>RIGHT JOIN</command> with the
-
-                        <code>joinRight(table, condition, [columns])</code> method.
-
-                    </para>
-
-                    <para>
-
-                        Right outer join is the complement of left outer join.
-
-                        All rows from the right operand table are included,
-
-                        matching rows from the left operand table included,
-
-                        and the columns from the left operand table are filled
-
-                        with NULLs if no row exists matching the right table.
-
-                    </para>
-
-                    <para>
-
-                        Some RDBMS brands don't support this join type, but
-
-                        in general any right join can be represented as a left
-
-                        join by reversing the order of the tables.
-
-                    </para>
-
-                </listitem>
-
-                <listitem>
-
-                    <para>
-
-                        <command>FULL JOIN</command> with the
-
-                        <code>joinFull(table, condition, [columns])</code> method.
-
-                    </para>
-
-                    <para>
-
-                        A full outer join is like combining a left outer join
-
-                        and a right outer join.  All rows from both tables are
-
-                        included, paired with each other on the same row of the
-
-                        result set if they satisfy the join condition, and
-
-                        otherwise paired with NULLs in place of columns from the
-
-                        other table.
-
-                    </para>
-
-                    <para>
-
-                        Some RDBMS brands don't support this join type.
-
-                    </para>
-
-                </listitem>
-
-                <listitem>
-
-                    <para>
-
-                        <command>CROSS JOIN</command> with the
-
-                        <code>joinCross(table, [columns])</code> method.
-
-                    </para>
-
-                    <para>
-
-                        A cross join is a Cartesian product.
-
-                        Every row in the first table is matched to every
-
-                        row in the second table.  Therefore the number of
-
-                        rows in the result set is equal to the product of
-
-                        the number of rows in each table.  You can filter
-
-                        the result set using conditions in a WHERE clause;
-
-                        in this way a cross join is similar to the old SQL-89
-
-                        join syntax.
-
-                    </para>
-
-                    <para>
-
-                        The <code>joinCross()</code> method has no parameter
-
-                        to specify the join condition.
-
-                        Some RDBMS brands don't support this join type.
-
-                    </para>
-
-                </listitem>
-
-                <listitem>
-
-                    <para>
-
-                        <command>NATURAL JOIN</command> with the
-
-                        <code>joinNatural(table, [columns])</code> method.
-
-                    </para>
-
-                    <para>
-
-                        A natural join compares any column(s) that appear with
-
-                        the same name in both tables.  The comparison is
-
-                        equality of all the column(s); comparing the columns
-
-                        using inequality is not a natural join.
-
-                        Only natural inner joins are supported by this API,
-
-                        even though SQL permits natural outer joins as well.
-
-                    </para>
-
-                    <para>
-
-                        The <code>joinNatural()</code> method has no parameter
-
-                        to specify the join condition.
-
-                    </para>
-
-                </listitem>
-
-            </itemizedlist>
-
-
-
-        </sect3>
-
-
-
-        <sect3 id="zend.db.select.building.where">
-
-
-
-            <title>Adding a WHERE Clause</title>
-
-
-
-            <para>
-
-                You can specify criteria for restricting rows of the result set
-
-                using the <code>where()</code> method.  The first argument of
-
-                this method is a SQL expression, and this expression is used
-
-                in a SQL <code>WHERE</code> clause in the query.
-
-            </para>
-
-
-
-            <example id="zend.db.select.building.where.example">
-
-                <title>Example of the where() method</title>
-
-                <programlisting role="php"><![CDATA[<?php
-
-
-
-// Build this query:
-
-//   SELECT product_id, product_name, price
-
-//   FROM "products"
-
-//   WHERE price > 100.00
-
-
-
-$select = $db->select()
-
-    ->from(
-
-        'products',
-
-        array('product_id', 'product_name', 'price'))
-
-    ->where('price > 100.00');]]></programlisting>
-
-            </example>
-
-
-
-            <note>
-
-                <para>
-
-                    No quoting is applied to expressions given to the
-
-                    <code>where()</code> or <code>orWhere()</code> methods.
-
-                    If you have column names that need to be quoted, you must use
-
-                    <code>quoteIdentifier()</code> as you form the string for the
-
-                    condition.
-
-                </para>
-
-            </note>
-
-
-
-            <para>
-
-                The second argument to the <code>where()</code> method is
-
-                optional.  It is a value to substitute into the expression.
-
-                Zend_Db_Select quotes the value and substitutes it for a
-
-                question-mark ("<code>?</code>") symbol in the expression.
-
-            </para>
-
-
-
-            <para>
-
-                This method accepts only one parameter.
-
-                If you have an expression into which you need to substitute
-
-                multiple variables, you must format the string manually,
-
-                interpolating variables and performing quoting yourself.
-
-            </para>
-
-
-
-            <example id="zend.db.select.building.where.example-param">
-
-                <title>Example of a parameter in the where() method</title>
-
-                <programlisting role="php"><![CDATA[<?php
-
-
-
-// Build this query:
-
-//   SELECT product_id, product_name, price
-
-//   FROM "products"
-
-//   WHERE (price > 100.00)
-
-
-
-$minimumPrice = 100;
-
-
-
-$select = $db->select()
-
-    ->from(
-
-        'products',
-
-        array('product_id', 'product_name', 'price'))
-
-    ->where('price > ?', $minimumPrice);]]></programlisting>
-
-            </example>
-
-
-
-            <para>
-
-                You can invoke the <code>where()</code> method multiple times
-
-                on the same Zend_Db_Select object.  The resulting query combines
-
-                the multiple terms together using <code>AND</code> between them.
-
-            </para>
-
-
-
-            <example id="zend.db.select.building.where.example-and">
-
-                <title>Example of multiple where() methods</title>
-
-                <programlisting role="php"><![CDATA[<?php
-
-
-
-// Build this query:
-
-//   SELECT product_id, product_name, price
-
-//   FROM "products"
-
-//   WHERE (price > 100.00)
-
-//     AND (price < 500.00)
-
-
-
-$minimumPrice = 100;
-
-$maximumPrice = 500;
-
-
-
-$select = $db->select()
-
-    ->from('products',
-
-        array('product_id', 'product_name', 'price'))
-
-    ->where('price > ?', $minimumPrice)
-
-    ->where('price < ?', $maximumPrice);]]></programlisting>
-
-            </example>
-
-
-
-            <para>
-
-                If you need to combine terms together using <code>OR</code>,
-
-                use the <code>orWhere()</code> method.  This method is used
-
-                in the same way as the <code>where()</code> method, except
-
-                that the term specified is preceded by <code>OR</code>,
-
-                instead of <code>AND</code>.
-
-            </para>
-
-
-
-            <example id="zend.db.select.building.where.example-or">
-
-                <title>Example of the orWhere() method</title>
-
-                <programlisting role="php"><![CDATA[<?php
-
-
-
-// Build this query:
-
-//   SELECT product_id, product_name, price
-
-//   FROM "products"
-
-//   WHERE (price < 100.00)
-
-//     OR (price > 500.00)
-
-
-
-$minimumPrice = 100;
-
-$maximumPrice = 500;
-
-
-
-$select = $db->select()
-
-    ->from('products',
-
-        array('product_id', 'product_name', 'price'))
-
-    ->where('price < ?', $minimumPrice)
-
-    ->orWhere('price > ?', $maximumPrice);]]></programlisting>
-
-            </example>
-
-
-
-            <para>
-
-                Zend_Db_Select automatically puts parentheses around each
-
-                expression you specify using the <code>where()</code> or
-
-                <code>orWhere()</code> methods.  This helps to ensure that
-
-                Boolean operator precedence does not cause unexpected
-
-                results.
-
-            </para>
-
-
-
-            <example id="zend.db.select.building.where.example-parens">
-
-                <title>Example of parenthesizing Boolean expressions</title>
-
-                <programlisting role="php"><![CDATA[<?php
-
-
-
-// Build this query:
-
-//   SELECT product_id, product_name, price
-
-//   FROM "products"
-
-//   WHERE (price < 100.00 OR price > 500.00)
-
-//     AND (product_name = 'Apple')
-
-
-
-$minimumPrice = 100;
-
-$maximumPrice = 500;
-
-$prod = 'Apple';
-
-
-
-$select = $db->select()
-
-    ->from('products',
-
-        array('product_id', 'product_name', 'price'))
-
-    ->where("price < $minimumPrice OR price > $maximumPrice")
-
-    ->where('product_name = ?', $prod);]]></programlisting>
-
-            </example>
-
-
-
-            <para>
-
-                In the example above, the results would be quite different
-
-                without the parentheses, because <code>AND</code> has higher
-
-                precedence than <code>OR</code>.  Zend_Db_Select applies the
-
-                parentheses so the effect is that each expression in successive
-
-                calls to the <code>where()</code> bind more tightly than the
-
-                <code>AND</code> that combines the expressions.
-
-            </para>
-
-
-
-        </sect3>
-
-
-
-        <sect3 id="zend.db.select.building.group">
-
-
-
-            <title>Adding a GROUP BY Clause</title>
-
-
-
-            <para>
-
-                In SQL, the <code>GROUP BY</code> clause allows you
-
-                to reduce the rows of a query result set to one row per
-
-                unique value found in the column(s) named in the
-
-                <code>GROUP BY</code> clause.
-
-            </para>
-
-
-
-            <para>
-
-                In Zend_Db_Select, you can specify the column(s) to use
-
-                for calculating the groups of rows using the
-
-                <code>group()</code> method.  The argument to this
-
-                method is a column or an array of columns to use in
-
-                the <code>GROUP BY</code> clause.
-
-            </para>
-
-
-
-            <example id="zend.db.select.building.group.example">
-
-                <title>Example of the group() method</title>
-
-                <programlisting role="php"><![CDATA[<?php
-
-
-
-// Build this query:
-
-//   SELECT p."product_id", COUNT(*) AS line_items_per_product
-
-//   FROM "products" AS p JOIN "line_items" AS l
-
-//     ON p.product_id = l.product_id
-
-//   GROUP BY p.product_id
-
-
-
-$select = $db->select()
-
-    ->from(array('p' => 'products'),
-
-        array('product_id'))
-
-    ->join(array('l' => 'line_items'),
-
-        'p.product_id = l.product_id',
-
-        array('line_items_per_product' => 'COUNT(*)'))
-
-    ->group('p.product_id');]]></programlisting>
-
-            </example>
-
-
-
-            <para>
-
-                Like the columns array in the <code>from()</code> method, you
-
-                can use correlation names in the column name strings, and the
-
-                column is quoted as an identifier unless the string contains
-
-                parentheses or is an object of type Zend_Db_Expr.
-
-            </para>
-
-
-
-        </sect3>
-
-
-
-        <sect3 id="zend.db.select.building.having">
-
-
-
-            <title>Adding a HAVING Clause</title>
-
-
-
-            <para>
-
-                In SQL, the <code>HAVING</code> clause applies a restriction
-
-                condition on groups of rows.  This is similar to how a
-
-                <code>WHERE</code> clause applies a restriction condition on rows.
-
-                But the two clauses are different because <code>WHERE</code>
-
-                conditions are applied before groups are defined, whereas
-
-                <code>HAVING</code> conditions are applied after groups are
-
-                defined.
-
-            </para>
-
-
-
-            <para>
-
-                In Zend_Db_Select, you can specify conditions for restricting
-
-                groups using the <code>having()</code> method.  Its usage is
-
-                similar to that of the <code>where()</code> method.
-
-                The first argument is a string containing a SQL expression.
-
-                The optional second argument is a value that is used to replace
-
-                a positional parameter placeholder in the SQL expression.
-
-                Expressions given in multiple invocations of the
-
-                <code>having()</code> method are combined using the Boolean
-
-                <code>AND</code> operator, or the <code>OR</code> operator if
-
-                you use the <code>orHaving()</code> method.
-
-            </para>
-
-
-
-            <example id="zend.db.select.building.having.example">
-
-                <title>Example of the having() method</title>
-
-                <programlisting role="php"><![CDATA[<?php
-
-
-
-// Build this query:
-
-//   SELECT p."product_id", COUNT(*) AS line_items_per_product
-
-//   FROM "products" AS p JOIN "line_items" AS l
-
-//     ON p.product_id = l.product_id
-
-//   GROUP BY p.product_id
-
-//   HAVING line_items_per_product > 10
-
-
-
-$select = $db->select()
-
-    ->from(array('p' => 'products'),
-
-        array('product_id'))
-
-    ->join(array('l' => 'line_items'),
-
-        'p.product_id = l.product_id',
-
-        array('line_items_per_product' => 'COUNT(*)'))
-
-    ->group('p.product_id')
-
-    ->having('line_items_per_product > 10');]]></programlisting>
-
-            </example>
-
-
-
-            <note>
-
-                <para>
-
-                    No quoting is applied to expressions given to the
-
-                    <code>having()</code> or <code>orHaving()</code> methods.
-
-                    If you have column names that need to be quoted, you must use
-
-                    <code>quoteIdentifier()</code> as you form the string for the
-
-                    condition.
-
-                </para>
-
-            </note>
-
-
-
-        </sect3>
-
-
-
-        <sect3 id="zend.db.select.building.order">
-
-
-
-            <title>Adding an ORDER BY Clause</title>
-
-
-
-            <para>
-
-                In SQL, the <code>ORDER BY</code> clause specifies one or more
-
-                columns or expressions by which the result set of a query is
-
-                sorted.  If multiple columns are listed, the secondary columns
-
-                are used to resolve ties; the sort order is determined by the
-
-                secondary columns if the preceding columns contain identical
-
-                values.  The default sorting is from least value to greatest
-
-                value.  You can also sort by greatest value to least value for
-
-                a given column in the list by specifying the keyword
-
-                <code>DESC</code> after that column.
-
-            </para>
-
-
-
-            <para>
-
-                In Zend_Db_Select, you can use the <code>order()</code> method
-
-                to specify a column or an array of columns by which to sort.
-
-                Each element of the array is a string naming a column.
-
-                optionally with the <code>ASC</code> <code>DESC</code> keyword
-
-                following it, separated by a space.
-
-            </para>
-
-
-
-            <para>
-
-                Like in the <code>from()</code> and <code>group()</code>
-
-                methods, column names are quoted as identifiers, unless they
-
-                contain contain parentheses or are an object of type
-
-                Zend_Db_Expr.
-
-            </para>
-
-
-
-            <example id="zend.db.select.building.order.example">
-
-                <title>Example of the order() method</title>
-
-                <programlisting role="php"><![CDATA[<?php
-
-
-
-// Build this query:
-
-//   SELECT p."product_id", COUNT(*) AS line_items_per_product
-
-//   FROM "products" AS p JOIN "line_items" AS l
-
-//     ON p.product_id = l.product_id
-
-//   GROUP BY p.product_id
-
-//   ORDER BY "line_items_per_product" DESC, "product_id"
-
-
-
-$select = $db->select()
-
-    ->from(array('p' => 'products'),
-
-        array('product_id'))
-
-    ->join(array('l' => 'line_items'),
-
-        'p.product_id = l.product_id',
-
-        array('line_items_per_product' => 'COUNT(*)'))
-
-    ->group('p.product_id')
-
-    ->order(array('line_items_per_product DESC', 'product_id'));]]></programlisting>
-
-            </example>
-
-
-
-        </sect3>
-
-
-
-        <sect3 id="zend.db.select.building.limit">
-
-
-
-            <title>Adding a LIMIT Clause</title>
-
-
-
-            <para>
-
-                Some RDBMS brands extend SQL with a query clause known as the
-
-                <code>LIMIT</code> clause.  This clause reduces the number of
-
-                rows in the result set to at most a number you specify.
-
-                You can also specify to skip a number of rows before starting
-
-                to output.
-
-                This feature makes it easy to take a subset of a result set,
-
-                for example when displaying query results on progressive pages
-
-                of output.
-
-            </para>
-
-
-
-            <para>
-
-                In Zend_Db_Select, you can use the <code>limit()</code> method
-
-                to specify the count of rows and the number of rows to skip.
-
-                The first argument to this method is the desired count of rows.
-
-                The second argument is the number of rows to skip.
-
-            </para>
-
-
-
-            <example id="zend.db.select.building.limit.example">
-
-                <title>Example of the limit() method</title>
-
-                <programlisting role="php"><![CDATA[<?php
-
-
-
-// Build this query:
-
-//   SELECT p."product_id", p."product_name"
-
-//   FROM "products" AS p
-
-//   LIMIT 10, 20
-
-
-
-$select = $db->select()
-
-    ->from(array('p' => 'products'), array('product_id', 'product_name'))
-
-    ->limit(10, 20);]]></programlisting>
-
-            </example>
-
-
-
-            <note>
-
-                <para>
-
-                    The <code>LIMIT</code> syntax is not supported by all RDBMS
-
-                    brands.  Some RDBMS require different syntax to support
-
-                    similar functionality.  Each Zend_Db_Adapter_Abstract class
-
-                    includes a method to produce SQL appropriate for that RDBMS.
-
-                </para>
-
-            </note>
-
-
-
-            <para>
-
-                Use the <code>limitPage()</code> method for an alternative way
-
-                to specify row count and offset.  This method allows you to
-
-                limit the result set to one of a series of fixed-length subsets
-
-                of rows from the query's total result set.  In other words, you
-
-                specify the length of a "page" of results, and the ordinal
-
-                number of the single page of results you want the query to return.
-
-                The page number is the first argument of the
-
-                <code>limitPage()</code> method, and the page length is the
-
-                second argument.  Both arguments are required; they have no
-
-                default values.
-
-            </para>
-
-
-
-            <example id="zend.db.select.building.limit.example2">
-
-                <title>Example of the limitPage() method</title>
-
-                <programlisting role="php"><![CDATA[<?php
-
-
-
-// Build this query:
-
-//   SELECT p."product_id", p."product_name"
-
-//   FROM "products" AS p
-
-//   LIMIT 10, 20
-
-
-
-$select = $db->select()
-
-    ->from(array('p' => 'products'), array('product_id', 'product_name'))
-
-    ->limitPage(2, 10);]]></programlisting>
-
-            </example>
-
-
-
-        </sect3>
-
-
-
-        <sect3 id="zend.db.select.building.distinct">
-
-
-
-            <title>Adding the DISTINCT Query Modifier</title>
-
-
-
-            <para>
-
-                The <code>distinct()</code> method enables you to add the
-
-                <code>DISTINCT</code> keyword to your SQL query.
-
-            </para>
-
-
-
-            <example id="zend.db.select.building.distinct.example">
-
-                <title>Example of the distinct() method</title>
-
-                <programlisting role="php"><![CDATA[<?php
-
-
-
-// Build this query:
-
-//   SELECT DISTINCT p."product_name"
-
-//   FROM "products" AS p
-
-
-
-$select = $db->select()
-
-    ->distinct()
-
-    ->from(array('p' => 'products'), 'product_name');]]></programlisting>
-
-            </example>
-
-
-
-        </sect3>
-
-
-
-        <sect3 id="zend.db.select.building.for-update">
-
-
-
-            <title>Adding the FOR UPDATE Query Modifier</title>
-
-
-
-            <para>
-
-                The <code>forUpdate()</code> method enables you to add the
-
-                <code>FOR UPDATE</code> modifier to your SQL query.
-
-            </para>
-
-
-
-            <example id="zend.db.select.building.for-update.example">
-
-                <title>Example of forUpdate() method</title>
-
-                <programlisting role="php"><![CDATA[<?php
-
-
-
-// Build this query:
-
-//   SELECT FOR UPDATE p.*
-
-//   FROM "products" AS p
-
-
-
-$select = $db->select()
-
-    ->forUpdate()
-
-    ->from(array('p' => 'products'));]]></programlisting>
-
-            </example>
-
-
-
-        </sect3>
-
-
-
-    </sect2>
-
-
-
-    <sect2 id="zend.db.select.execute">
-
-
-
-        <title>Executing Select Queries</title>
-
-
-
-        <para>
-
-            This section describes how to execute the query represented by a
-
-            Zend_Db_Select object.
-
-        </para>
-
-
-
-        <sect3 id="zend.db.select.execute.query-adapter">
-
-
-
-            <title>Executing Select Queries from the Db Adapter</title>
-
-
-
-            <para>
-
-                You can execute the query represented by the Zend_Db_Select
-
-                object by passing it as the first argument to the
-
-                <code>query()</code> method of a Zend_Db_Adapter_Abstract
-
-                object.  Use the Zend_Db_Select objects instead of a string
-
-                query.
-
-            </para>
-
-
-
-            <para>
-
-                The <code>query()</code> method returns an object of type
-
-                Zend_Db_Statement or PDOStatement, depending on the adapter type.
-
-            </para>
-
-
-
-            <example id="zend.db.select.execute.query-adapter.example">
-
-                <title>Example using the Db adapter's query() method</title>
-
-                <programlisting role="php"><![CDATA[<?php
-
-
-
-$select = $db->select()
-
-  ->from('products');
-
-
-
-$stmt = $db->query($select);
-
-$result = $stmt->fetchAll();]]></programlisting>
-
-            </example>
-
-
-
-        </sect3>
-
-
-
-        <sect3 id="zend.db.select.execute.query-select">
-
-
-
-            <title>Executing Select Queries from the Object</title>
-
-
-
-            <para>
-
-                As an alternative to using the <code>query()</code> method
-
-                of the adapter object, you can use the <code>query()</code>
-
-                method of the Zend_Db_Select object.
-
-                Both methods return an object of type Zend_Db_Statement or
-
-                PDOStatement, depending on the adapter type.
-
-            </para>
-
-
-
-            <example id="zend.db.select.execute.query-select.example">
-
-                <title>Example using the Select object's query method</title>
-
-                <programlisting role="php"><![CDATA[<?php
-
-
-
-$select = $db->select()
-
-    ->from('products');
-
-
-
-$stmt = $select->query();
-
-$result = $stmt->fetchAll();]]></programlisting>
-
-            </example>
-
-
-
-        </sect3>
-
-
-
-        <sect3 id="zend.db.select.execute.tostring">
-
-
-
-            <title>Converting a Select Object to a SQL String</title>
-
-
-
-            <para>
-
-                If you need access to a string representation of the SQL
-
-                query corresponding to the Zend_Db_Select object, use
-
-                the <code>__toString()</code> method.
-
-            </para>
-
-
-
-            <example id="zend.db.select.execute.tostring.example">
-
-                <title>Example of the __toString() method</title>
-
-                <programlisting role="php"><![CDATA[<?php
-
-
-
-$select = $db->select()
-
-    ->from('products');
-
-
-
-$sql = $select->__toString();
-
-echo "$sql\n";
-
-
-
-// The output is the string:
-
-//   SELECT * FROM "products"]]></programlisting>
-
-            </example>
-
-
-
-        </sect3>
-
-
-
-    </sect2>
-
-
-
-    <sect2 id="zend.db.select.other">
-
-
-
-        <title>Other methods</title>
-
-
-
-        <para>
-
-            This section describes other methods of the Zend_Db_Select class
-
-            that are not covered above:  <code>getPart()</code> and
-
-            <code>reset()</code>.
-
-        </para>
-
-
-
-        <sect3 id="zend.db.select.other.get-part">
-
-
-
-            <title>Retrieving Parts of the Select Object</title>
-
-
-
-            <para>
-
-                The <code>getPart()</code> method returns a representation
-
-                of one part of your SQL query.  For example, you can use this
-
-                method to return the array of expressions for the
-
-                <code>WHERE</code> clause, or the array of columns
-
-                (or column expressions) that are in the <code>SELECT</code>
-
-                list, or the values of the count and offset for the
-
-                <code>LIMIT</code> clause.
-
-            </para>
-
-
-
-            <para>
-
-                The return value is not a string containing a fragment of SQL
-
-                syntax.  The return value is an internal representation, which
-
-                is typically an array structure containing values and
-
-                expressions.  Each part of the query has a different structure.
-
-            </para>
-
-
-
-            <para>
-
-                The single argument to the <code>getPart()</code> method is
-
-                a string that identifies which part of the Select query to
-
-                return.  For example, the string <code>'from'</code>
-
-                identifies the part of the Select object that stores
-
-                information about the tables in the <code>FROM</code> clause,
-
-                including joined tables.
-
-            </para>
-
-
-
-            <para>
-
-                The Zend_Db_Select class defines constants you can use for
-
-                parts of the SQL query.  You can use these constant definitions,
-
-                or you can the literal strings.
-
-            </para>
-
-
-
-            <table id="zend.db.select.other.get-part.table">
-
-                <title>Constants used by getPart() and reset()</title>
-
-                <tgroup cols="2">
-
-                    <thead>
-
-                        <row>
-
-                            <entry>Constant</entry>
-
-                            <entry>String value</entry>
-
-                        </row>
-
-                    </thead>
-
-                    <tbody>
-
-                        <row>
-
-                            <entry><code>Zend_Db_Select::DISTINCT</code></entry>
-
-                            <entry><code>'distinct'</code></entry>
-
-                        </row>
-
-                        <row>
-
-                            <entry><code>Zend_Db_Select::FOR_UPDATE</code></entry>
-
-                            <entry><code>'forupdate'</code></entry>
-
-                        </row>
-
-                        <row>
-
-                            <entry><code>Zend_Db_Select::COLUMNS</code></entry>
-
-                            <entry><code>'columns'</code></entry>
-
-                        </row>
-
-                        <row>
-
-                            <entry><code>Zend_Db_Select::FROM</code></entry>
-
-                            <entry><code>'from'</code></entry>
-
-                        </row>
-
-                        <row>
-
-                            <entry><code>Zend_Db_Select::WHERE</code></entry>
-
-                            <entry><code>'where'</code></entry>
-
-                        </row>
-
-                        <row>
-
-                            <entry><code>Zend_Db_Select::GROUP</code></entry>
-
-                            <entry><code>'group'</code></entry>
-
-                        </row>
-
-                        <row>
-
-                            <entry><code>Zend_Db_Select::HAVING</code></entry>
-
-                            <entry><code>'having'</code></entry>
-
-                        </row>
-
-                        <row>
-
-                            <entry><code>Zend_Db_Select::ORDER</code></entry>
-
-                            <entry><code>'order'</code></entry>
-
-                        </row>
-
-                        <row>
-
-                            <entry><code>Zend_Db_Select::LIMIT_COUNT</code></entry>
-
-                            <entry><code>'limitcount'</code></entry>
-
-                        </row>
-
-                        <row>
-
-                            <entry><code>Zend_Db_Select::LIMIT_OFFSET</code></entry>
-
-                            <entry><code>'limitoffset'</code></entry>
-
-                        </row>
-
-                    </tbody>
-
-                </tgroup>
-
-            </table>
-
-
-
-            <example id="zend.db.select.other.get-part.example">
-
-                <title>Example of the getPart() method</title>
-
-                <programlisting role="php"><![CDATA[<?php
-
-
-
-$select = $db->select()
-
-    ->from('products')
-
-    ->order('product_id');
-
-
-
-// You can use a string literal to specify the part
-
-$orderData = $select->getPart( 'order' );
-
-
-
-// You can use a constant to specify the same part
-
-$orderData = $select->getPart( Zend_Db_Select::ORDER );
-
-
-
-// The return value may be an array structure, not a string.
-
-// Each part has a different structure.
-
-print_r( $orderData );]]></programlisting>
-
-            </example>
-
-
-
-        </sect3>
-
-
-
-        <sect3 id="zend.db.select.other.reset">
-
-
-
-            <title>Resetting Parts of the Select Object</title>
-
-
-
-            <para>
-
-                The <code>reset()</code> method enables you to clear one
-
-                specified part of the SQL query, or else clear all parts of
-
-                the SQL query if you omit the argument.
-
-            </para>
-
-
-
-            <para>
-
-                The single argument is optional.  You can specify the part
-
-                of the query to clear, using the same strings you used in
-
-                the argument to the <code>getPart()</code> method.
-
-                The part of the query you specify is reset to a default state.
-
-            </para>
-
-
-
-            <para>
-
-                If you omit the parameter, <code>reset()</code> changes all
-
-                parts of the query to their default state.  This makes the
-
-                Zend_Db_Select object equivalent to a new object, as though you
-
-                had just instantiated it.
-
-            </para>
-
-
-
-            <example id="zend.db.select.other.reset.example">
-
-                <title>Example of the reset() method</title>
-
-                <programlisting role="php"><![CDATA[<?php
-
-
-
-// Build this query:
-
-//   SELECT p.*
-
-//   FROM "products" AS p
-
-//   ORDER BY "product_name"
-
-
-
-$select = $db->select()
-
-    ->from(array('p' => 'products')
-
-    ->order('product_name');
-
-
-
-// Changed requirement, instead order by a different columns:
-
-//   SELECT p.*
-
-//   FROM "products" AS p
-
-//   ORDER BY "product_id"
-
-
-
-// Clear one part so we can redefine it
-
-$select->reset( Zend_Db_Select::ORDER );
-
-
-
-// And specify a different column
-
-$select->order('product_id');
-
-
-
-// Clear all parts of the query
-
-$select->reset();]]></programlisting>
-
-            </example>
-
-
-
-        </sect3>
-
-
-
-    </sect2>
-
-
-
-</sect1>
-
-<!--
-
-vim:se ts=4 sw=4 et:
-
--->
-
+<sect1 id="zend.db.select">
+
+    <title>Zend_Db_Select</title>
+
+    <sect2 id="zend.db.select.introduction">
+
+        <title>Visão Geral do Objeto Select</title>
+
+        <para>
+            O objeto Zend_Db_Select representa um comando de consulta SQL <code>SELECT</code>.
+            A classe possui métodos para a adição de partes individuais em uma query. Você
+            pode especificar algumas partes da consulta usando métodos PHP e estruturas de
+            dados, e a classe se encarrega de formar a sintaxe SQL correta para você. Depois
+            da construção de uma consulta, você pode executá-la como se você houvesse a escrito
+            em uma string.
+        </para>
+
+        <para>
+            As vantagens oferecidas pelo Zend_Db_Select incluem:
+        </para>
+
+        <itemizedlist>
+            <listitem>
+                <para>
+                    Métodos orientados a objetos para especificação de consultas SQL
+                    de maneira "piece-by-piece" (aos pedaços ou em partes);
+                </para>
+            </listitem>
+            <listitem>
+                <para>
+                    Abstração de independência de base de dados de algumas partes
+                    da consulta SQL;
+                </para>
+            </listitem>
+            <listitem>
+                <para>
+                    Colocação automática de aspas nos identificadores de metadados na maioria
+                    dos casos, para dar suporte aos identificadores que contém palavras SQL reservadas
+                    e caracteres especiais;
+                </para>
+            </listitem>
+            <listitem>
+                <para>
+                    Colocação automática de aspas nos identificadores e valores, para ajudar
+                    na redução de ataques por "SQL injection".
+                </para>
+            </listitem>
+        </itemizedlist>
+
+        <para>
+            A utilização de Zend_Db_Select não é obrigatória. Para consultas SELECT
+            muito simples, normalmente é mais fácil escrever toda a consulta SQL
+            em uma string e executá-la usando métodos da classe Adapter, como o
+            <code>query()</code> ou <code>fetchAll()</code>. O uso de Zend_Db_Select
+            é muito útil quando você precisa montar uma consulta SELECT usando "procedures"
+            (através de procedimentos), ou quando você precisa montar a consulta baseando-se
+            na lógica condicional da sua aplicação.
+        </para>
+
+    </sect2>
+
+    <sect2 id="zend.db.select.creating">
+
+        <title>Criando um Objeto Select</title>
+
+        <para>
+            Você pode criar uma instância de um objeto Zend_Db_Select
+            usando o método <code>select()</code> de um objeto Zend_Db_Adapter_Abstract.
+        </para>
+
+        <example id="zend.db.select.creating.example-db">
+            <title>Exemplo do método select() do adaptador para bases de dados</title>
+            <programlisting role="php"><![CDATA[<?php
+
+$db = Zend_Db::factory( ...options... );
+$select = $db->select();]]></programlisting>
+        </example>
+
+        <para>
+            Outra forma de criar um objeto Zend_Db_Select é com o
+            construtor dele, especificando o adaptador como parâmetro.
+        </para>
+
+        <example id="zend.db.select.creating.example-new">
+            <title>Examplo da criação de um novo objeto Select</title>
+            <programlisting role="php"><![CDATA[<?php
+
+$db = Zend_Db::factory( ...options... );
+$select = new Zend_Db_Select($db);]]></programlisting>
+        </example>
+
+    </sect2>
+
+    <sect2 id="zend.db.select.building">
+
+        <title>Construindo Consultas Select</title>
+
+        <para>
+            Ao contruir um consulta, você pode adicionar cláusulas uma por uma.
+            Existe um método diferente para cada cláusula no objeto.
+        </para>
+
+        <example id="zend.db.select.building.example">
+            <title>Exemplo do uso de métodos para adicionar cláusulas</title>
+            <programlisting role="php"><![CDATA[<?php
+
+// Create the Zend_Db_Select object
+$select = $db->select();
+
+// Add a FROM clause
+$select->from( ...specify table and columns... )
+
+// Add a WHERE clause
+$select->where( ...specify search criteria... )
+
+// Add an ORDER BY clause
+$select->order( ...specify sorting criteria... );]]></programlisting>
+        </example>
+
+        <para>
+            Você também pode usar a maior parte dos métodos do objeto Zend_Db_Select
+            com uma interface "fluent" conveniente.  Uma interface "fluent" significa que cada
+            método retorna uma referência para o objeto no qual foi chamado, então você pode
+            imediatamente chamar outro método.
+        </para>
+
+        <example id="zend.db.select.building.example-fluent">
+            <title>Examplo de uso da interface "fluent"</title>
+            <programlisting role="php"><![CDATA[<?php
+
+$select = $db->select()
+    ->from( ...specify table and columns... )
+    ->where( ...specify search criteria... )
+    ->order( ...specify sorting criteria... );]]></programlisting>
+        </example>
+
+        <para>
+            Os exemplos nesta seção mostram o uso da  interface "fluent",
+            mas você pode usar a interface "non-fluent" em todos os casos.
+            É freqüentemente necessário usar a interface "non-fluent" quando, por exemplo,
+            sua aplicação precisa executar alguma lógica antes de adicionar uma cláusula
+            a uma consulta.
+        </para>
+
+        <sect3 id="zend.db.select.building.from">
+
+            <title>Adicionando uma cláusula FROM</title>
+
+            <para>
+                Especifique a tabela para esta consulta usando o método <code>from()</code>.
+                Você pode especificar o nome da tabela como uma simples string.
+                Zend_Db_Select coloca o entre aspas o nome da tabela, então, você pode
+                usar caracteres especiais.
+            </para>
+
+            <example id="zend.db.select.building.from.example">
+                <title>Example of the from() method</title>
+                <programlisting role="php"><![CDATA[<?php
+
+// Build this query:
+//   SELECT *
+//   FROM "products"
+
+$select = $db->select()
+    ->from( 'products' );]]></programlisting>
+            </example>
+
+            <para>
+                You can also specify the correlation name (sometimes called the
+                "table alias") for a table.  Instead of a simple string, use an
+                associative array mapping the correlation name to the table
+                name.  In other clauses of the SQL query, use this correlation
+                name.  If your query joins more than one table, Zend_Db_Select
+                generates unique correlation names based on the table names,
+                for any tables for which you don't specify the correlation name.
+            </para>
+
+            <example id="zend.db.select.building.from.example-cname">
+                <title>Example of specifying a table correlation name</title>
+                <programlisting role="php"><![CDATA[<?php
+
+// Build this query:
+//   SELECT p.*
+//   FROM "products" AS p
+
+$select = $db->select()
+    ->from( array('p' => 'products') );]]></programlisting>
+            </example>
+
+            <para>
+                Algumas marcas de RDBMS dão suporte a um especificador de schema
+                para uma tabela. Você pode especificar o nome a tabela como
+                "<code>schemaName.tableName</code>", onde Zend_Db_Select coloca entre aspas
+                cada uma das partes individualmente, ou então você deve especificar o nome
+                do schema separadamente. Um nome de schema especificado no nome da tabela
+                precede um schema fornecido separadamente se eventualmente ambos forem
+                informados.
+            </para>
+
+            <example id="zend.db.select.building.from.example-schema">
+                <title>Exemplo de especificação de nome de schema</title>
+                <programlisting role="php"><![CDATA[<?php
+
+// Build this query:
+//   SELECT *
+//   FROM "myschema"."products"
+
+$select = $db->select()
+    ->from( 'myschema.products' );
+
+// or
+
+$select = $db->select()
+    ->from('products', '*', 'myschema');]]></programlisting>
+            </example>
+
+        </sect3>
+
+        <sect3 id="zend.db.select.building.columns">
+
+            <title>Adicionando Colunas</title>
+
+            <para>
+                No segundo argumento do método <code>from()</code> ,
+                você pode especificaras colunas a serem selecionadas da
+                respectiva tabela. Se você não especificar nenhuma coluna,
+                o valor padrão é "<code>*</code>", o caracter curinga para "todas as colunas".
+            </para>
+
+            <para>
+                Você pode listar as colunas em um simples array de strings, ou como
+                um mapeamento associativo do alias da coluna para nome da coluna.
+                Se você só tiver uma coluna para consultar, e não precisar indicar um
+                alias, você pode listá-la em uma string simples ao invés de um array.
+            </para>
+
+            <para>
+                Se você passar um array vazio como o argumento de colunas, nenhuma
+                coluna da respectiva tabela será incluída no result set.
+                Veja um exemplo de <link linkend="zend.db.select.building.join.example-no-columns">código</link> sob a seção do método <code>join()</code>.
+            </para>
+
+            <para>
+                Você pode especificar o nome da coluna como
+                "<code>correlationName.columnName</code>".
+                Zend_Db_Select os coloca entre aspas individualmente.
+                Caso você não especifique o nome da correlação para uma coluna,
+                é usado o nome da correlação da tabela indicada no método<code>from()</code>.
+            </para>
+
+            <example id="zend.db.select.building.columns.example">
+                <title>Examples of specifying columns</title>
+                <programlisting role="php"><![CDATA[<?php
+
+// Build this query:
+//   SELECT p."product_id", p."product_name"
+//   FROM "products" AS p
+
+$select = $db->select()
+    ->from(array('p' => 'products'),
+        array('product_id', 'product_name'));
+
+// Build the same query, specifying correlation names:
+//   SELECT p."product_id", p."product_name"
+//   FROM "products" AS p
+
+$select = $db->select()
+    ->from(array('p' => 'products'),
+        array('p.product_id', 'p.product_name'));
+
+// Build this query with an alias for one column:
+//   SELECT p."product_id" AS prodno, p."product_name"
+//   FROM "products" AS p
+
+$select = $db->select()
+    ->from(array('p' => 'products'),
+        array('prodno' => 'product_id', 'product_name'));]]></programlisting>
+            </example>
+
+        </sect3>
+
+        <sect3 id="zend.db.select.building.columns-expr">
+
+            <title>Adicionando Colunas de Expressões</title>
+
+            <para>
+               Algumas vezes as colunas de uma consulta SQL são expressões, e não
+               simplesmente o nome de uma couna da tabela. Expressões não devem usar
+               nomes de correlação ou aspas. Se a string da coluna possuir parênteses,
+               Zend_Db_Select a reconhecerá como uma expressão.
+            </para>
+
+            <para>
+                Você também pode criar um objeto do tipo Zend_Db_Expr explicitamente,
+                para prevenir que uma string seja tratada como um nome de coluna.
+                Zend_Db_Expr é uma classe diminuta que contém uma única string.
+                Zend_Db_Select reconhece obtejos do tipo Zend_Db_Expr e os converte
+                novamente para strings, mas não efetua qualquer alteração como a
+                colocação de aspas ou nomes de correlação.
+            </para>
+
+            <note>
+                <para>
+                    O uso de Zend_Db_Expr para nomes de colunas não é necessário se as
+                    expressões contiverem parênteses; Zend_Db_Select reconhece os parênteses
+                    e trata a string como uma expresão, ignorando a colocação de aspas e de
+                    nomes de correlação.
+                </para>
+            </note>
+
+            <example id="zend.db.select.building.columns-expr.example">
+                <title>Exemplos de especificação de colunas contendo expressões</title>
+                <programlisting role="php"><![CDATA[<?php
+
+// Build this query:
+//   SELECT p."product_id", LOWER(product_name)
+//   FROM "products" AS p
+// An expression with parentheses implicitly becomes
+// a Zend_Db_Expr.
+
+$select = $db->select()
+    ->from(array('p' => 'products'),
+        array('product_id', 'LOWER(product_name)'));
+
+// Build this query:
+//   SELECT p."product_id", (p.cost * 1.08) AS cost_plus_tax
+//   FROM "products" AS p
+
+$select = $db->select()
+    ->from(array('p' => 'products'),
+        array('product_id', 'cost_plus_tax' => '(p.cost * 1.08)'));
+
+// Build this query using Zend_Db_Expr explicitly:
+//   SELECT p."product_id", p.cost * 1.08 AS cost_plus_tax
+//   FROM "products" AS p
+
+$select = $db->select()
+    ->from(array('p' => 'products'),
+        array('product_id', 'cost_plus_tax' => new Zend_Db_Expr('p.cost * 1.08')));]]></programlisting>
+            </example>
+
+            <para>
+                Nos casos acima, Zend_Db_Select não altera a string
+                para colocar os nomes de correlação ou aspas. Se as
+                mudanças forem necessárias para evitar alguma ambiguidade,
+                você deve fazê-las manualmente na string.
+            </para>
+
+            <para>
+                Se os nomes das colunas são palavras-chave SQL ou possuem
+                caracteres especiais, você deve usar o método <code>quoteIdentifier()</code>
+                da classe Adapter, e interpolar o resultado na string. O método
+                <code>quoteIdentifier()</code> usa aspas no SQL para delimitar o identificador,
+                o que deixa claro que ele é um identificador de uma tabela ou coluna e não
+                parte da síntaxe SQL.
+            </para>
+
+            <para>
+                Seu código fica mais independente de base de dados se você
+                usar o método <code>quoteIdentifier()</code> ao invés de digitar
+                as aspas nas strings porque algumas marcas de SGBD Relacionais usam
+                símbolos fora do padrão para referenciar identificadores.
+                O método <code>quoteIdentifier()</code> é projetado para usar
+                os símbolos de referência apropriados de acordo com o tipo de adaptador.
+                O método  <code>quoteIdentifier()</code> também ignora qualquer
+                caracter de referência que aparecer no nome de um identificador.
+            </para>
+
+            <example id="zend.db.select.building.columns-quoteid.example">
+                <title>Examples of quoting columns in an expression</title>
+                <programlisting role="php"><![CDATA[<?php
+
+// Build this query, quoting a special column name "from" in the expression:
+//   SELECT p."from" + 10 AS origin
+//   FROM "products" AS p
+
+$select = $db->select()
+    ->from(array('p' => 'products'),
+        array('origin' => '(p.' . $db->quoteIdentifier('from') . ' + 10)'));]]></programlisting>
+            </example>
+
+        </sect3>
+
+        <sect3 id="zend.db.select.building.join">
+
+            <title>Adding Another Table to the Query with JOIN</title>
+
+            <para>
+                Many useful queries involve using a <code>JOIN</code>
+                to combine rows from multiple tables.  You can add
+                tables to a Zend_Db_Select query using the
+                <code>join()</code> method.  Using this method is
+                similar to the <code>from()</code> method, except
+                you can also specify a join condition in most cases.
+            </para>
+
+            <example id="zend.db.select.building.join.example">
+                <title>Example of the join() method</title>
+                <programlisting role="php"><![CDATA[<?php
+
+// Build this query:
+//   SELECT p."product_id", p."product_name", l.*
+//   FROM "products" AS p JOIN "line_items" AS l
+//     ON p.product_id = l.product_id
+
+$select = $db->select()
+    ->from(array('p' => 'products'),
+        array('product_id', 'product_name'))
+    ->join(array('l' => 'line_items'),
+        'p.product_id = l.product_id');]]></programlisting>
+            </example>
+
+            <para>
+                The second argument to <code>join()</code> is a string
+                that is the join condition.  This is an expression that
+                declares the criteria by which rows in one table match
+                rows in the the other table.  You can use correlation
+                names in this expression.
+            </para>
+
+            <note>
+                <para>
+                    No quoting is applied to the expression you specify
+                    for the join condition; if you have column names that need
+                    to be quoted, you must use <code>quoteIdentifier()</code>
+                    as you form the string for the join condition.
+                </para>
+            </note>
+
+            <para>
+                The third argument to <code>join()</code> is an array
+                of column names, like that used in the <code>from()</code>
+                method.  It defaults to "<code>*</code>", supports correlation
+                names, expressions, and Zend_Db_Expr in the same way as the
+                array of column names in the <code>from()</code> method.
+            </para>
+
+            <para>
+                To select no columns from a table, use an empty array for
+                the list of columns.  This usage works in the
+                <code>from()</code> method too, but typically you want
+                some columns from the primary table in your queries,
+                whereas you might want no columns from a joined table.
+            </para>
+
+            <example id="zend.db.select.building.join.example-no-columns">
+                <title>Example of specifying no columns</title>
+                <programlisting role="php"><![CDATA[<?php
+
+// Build this query:
+//   SELECT p."product_id", p."product_name"
+//   FROM "products" AS p JOIN "line_items" AS l
+//     ON p.product_id = l.product_id
+
+$select = $db->select()
+    ->from(array('p' => 'products'),
+        array('product_id', 'product_name'))
+    ->join(array('l' => 'line_items'),
+        'p.product_id = l.product_id',
+        array() ); // empty list of columns]]></programlisting>
+                <para>
+                    Note the empty <code>array()</code> in the above example
+                    in place of a list of columns from the joined table.
+                </para>
+            </example>
+
+            <para>
+                SQL has several types of joins.
+                See the list below for the methods to support
+                different join types in Zend_Db_Select.
+            </para>
+
+            <itemizedlist>
+                <listitem>
+                    <para>
+                        <command>INNER JOIN</command> with the
+                        <code>join(table, join, [columns])</code>
+                        or <code>joinInner(table, join, [columns])</code> methods.
+                    </para>
+                    <para>
+                        This may be the most common type of join.  Rows from
+                        each table are compared using the join condition you
+                        specify.  The result set includes only the rows that
+                        satisfy the join condition.  The result set can be
+                        empty if no rows satisfy this condition.
+                    </para>
+                    <para>
+                        All RDBMS brands support this join type.
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                        <command>LEFT JOIN</command> with the
+                        <code>joinLeft(table, condition, [columns])</code> method.
+                    </para>
+                    <para>
+                        All rows from the left operand table are included,
+                        matching rows from the right operand table included,
+                        and the columns from the right operand table are filled
+                        with NULLs if no row exists matching the left table.
+                    </para>
+                    <para>
+                        All RDBMS brands support this join type.
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                        <command>RIGHT JOIN</command> with the
+                        <code>joinRight(table, condition, [columns])</code> method.
+                    </para>
+                    <para>
+                        Right outer join is the complement of left outer join.
+                        All rows from the right operand table are included,
+                        matching rows from the left operand table included,
+                        and the columns from the left operand table are filled
+                        with NULLs if no row exists matching the right table.
+                    </para>
+                    <para>
+                        Some RDBMS brands don't support this join type, but
+                        in general any right join can be represented as a left
+                        join by reversing the order of the tables.
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                        <command>FULL JOIN</command> with the
+                        <code>joinFull(table, condition, [columns])</code> method.
+                    </para>
+                    <para>
+                        A full outer join is like combining a left outer join
+                        and a right outer join.  All rows from both tables are
+                        included, paired with each other on the same row of the
+                        result set if they satisfy the join condition, and
+                        otherwise paired with NULLs in place of columns from the
+                        other table.
+                    </para>
+                    <para>
+                        Some RDBMS brands don't support this join type.
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                        <command>CROSS JOIN</command> with the
+                        <code>joinCross(table, [columns])</code> method.
+                    </para>
+                    <para>
+                        A cross join is a Cartesian product.
+                        Every row in the first table is matched to every
+                        row in the second table.  Therefore the number of
+                        rows in the result set is equal to the product of
+                        the number of rows in each table.  You can filter
+                        the result set using conditions in a WHERE clause;
+                        in this way a cross join is similar to the old SQL-89
+                        join syntax.
+                    </para>
+                    <para>
+                        The <code>joinCross()</code> method has no parameter
+                        to specify the join condition.
+                        Some RDBMS brands don't support this join type.
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                        <command>NATURAL JOIN</command> with the
+                        <code>joinNatural(table, [columns])</code> method.
+                    </para>
+                    <para>
+                        A natural join compares any column(s) that appear with
+                        the same name in both tables.  The comparison is
+                        equality of all the column(s); comparing the columns
+                        using inequality is not a natural join.
+                        Only natural inner joins are supported by this API,
+                        even though SQL permits natural outer joins as well.
+                    </para>
+                    <para>
+                        The <code>joinNatural()</code> method has no parameter
+                        to specify the join condition.
+                    </para>
+                </listitem>
+            </itemizedlist>
+
+        </sect3>
+
+        <sect3 id="zend.db.select.building.where">
+
+            <title>Adding a WHERE Clause</title>
+
+            <para>
+                You can specify criteria for restricting rows of the result set
+                using the <code>where()</code> method.  The first argument of
+                this method is a SQL expression, and this expression is used
+                in a SQL <code>WHERE</code> clause in the query.
+            </para>
+
+            <example id="zend.db.select.building.where.example">
+                <title>Example of the where() method</title>
+                <programlisting role="php"><![CDATA[<?php
+
+// Build this query:
+//   SELECT product_id, product_name, price
+//   FROM "products"
+//   WHERE price > 100.00
+
+$select = $db->select()
+    ->from(
+        'products',
+        array('product_id', 'product_name', 'price'))
+    ->where('price > 100.00');]]></programlisting>
+            </example>
+
+            <note>
+                <para>
+                    No quoting is applied to expressions given to the
+                    <code>where()</code> or <code>orWhere()</code> methods.
+                    If you have column names that need to be quoted, you must use
+                    <code>quoteIdentifier()</code> as you form the string for the
+                    condition.
+                </para>
+            </note>
+
+            <para>
+                The second argument to the <code>where()</code> method is
+                optional.  It is a value to substitute into the expression.
+                Zend_Db_Select quotes the value and substitutes it for a
+                question-mark ("<code>?</code>") symbol in the expression.
+            </para>
+
+            <para>
+                This method accepts only one parameter.
+                If you have an expression into which you need to substitute
+                multiple variables, you must format the string manually,
+                interpolating variables and performing quoting yourself.
+            </para>
+
+            <example id="zend.db.select.building.where.example-param">
+                <title>Example of a parameter in the where() method</title>
+                <programlisting role="php"><![CDATA[<?php
+
+// Build this query:
+//   SELECT product_id, product_name, price
+//   FROM "products"
+//   WHERE (price > 100.00)
+
+$minimumPrice = 100;
+
+$select = $db->select()
+    ->from(
+        'products',
+        array('product_id', 'product_name', 'price'))
+    ->where('price > ?', $minimumPrice);]]></programlisting>
+            </example>
+
+            <para>
+                You can invoke the <code>where()</code> method multiple times
+                on the same Zend_Db_Select object.  The resulting query combines
+                the multiple terms together using <code>AND</code> between them.
+            </para>
+
+            <example id="zend.db.select.building.where.example-and">
+                <title>Example of multiple where() methods</title>
+                <programlisting role="php"><![CDATA[<?php
+
+// Build this query:
+//   SELECT product_id, product_name, price
+//   FROM "products"
+//   WHERE (price > 100.00)
+//     AND (price < 500.00)
+
+$minimumPrice = 100;
+$maximumPrice = 500;
+
+$select = $db->select()
+    ->from('products',
+        array('product_id', 'product_name', 'price'))
+    ->where('price > ?', $minimumPrice)
+    ->where('price < ?', $maximumPrice);]]></programlisting>
+            </example>
+
+            <para>
+                If you need to combine terms together using <code>OR</code>,
+                use the <code>orWhere()</code> method.  This method is used
+                in the same way as the <code>where()</code> method, except
+                that the term specified is preceded by <code>OR</code>,
+                instead of <code>AND</code>.
+            </para>
+
+            <example id="zend.db.select.building.where.example-or">
+                <title>Example of the orWhere() method</title>
+                <programlisting role="php"><![CDATA[<?php
+
+// Build this query:
+//   SELECT product_id, product_name, price
+//   FROM "products"
+//   WHERE (price < 100.00)
+//     OR (price > 500.00)
+
+$minimumPrice = 100;
+$maximumPrice = 500;
+
+$select = $db->select()
+    ->from('products',
+        array('product_id', 'product_name', 'price'))
+    ->where('price < ?', $minimumPrice)
+    ->orWhere('price > ?', $maximumPrice);]]></programlisting>
+            </example>
+
+            <para>
+                Zend_Db_Select automatically puts parentheses around each
+                expression you specify using the <code>where()</code> or
+                <code>orWhere()</code> methods.  This helps to ensure that
+                Boolean operator precedence does not cause unexpected
+                results.
+            </para>
+
+            <example id="zend.db.select.building.where.example-parens">
+                <title>Example of parenthesizing Boolean expressions</title>
+                <programlisting role="php"><![CDATA[<?php
+
+// Build this query:
+//   SELECT product_id, product_name, price
+//   FROM "products"
+//   WHERE (price < 100.00 OR price > 500.00)
+//     AND (product_name = 'Apple')
+
+$minimumPrice = 100;
+$maximumPrice = 500;
+$prod = 'Apple';
+
+$select = $db->select()
+    ->from('products',
+        array('product_id', 'product_name', 'price'))
+    ->where("price < $minimumPrice OR price > $maximumPrice")
+    ->where('product_name = ?', $prod);]]></programlisting>
+            </example>
+
+            <para>
+                In the example above, the results would be quite different
+                without the parentheses, because <code>AND</code> has higher
+                precedence than <code>OR</code>.  Zend_Db_Select applies the
+                parentheses so the effect is that each expression in successive
+                calls to the <code>where()</code> bind more tightly than the
+                <code>AND</code> that combines the expressions.
+            </para>
+
+        </sect3>
+
+        <sect3 id="zend.db.select.building.group">
+
+            <title>Adding a GROUP BY Clause</title>
+
+            <para>
+                In SQL, the <code>GROUP BY</code> clause allows you
+                to reduce the rows of a query result set to one row per
+                unique value found in the column(s) named in the
+                <code>GROUP BY</code> clause.
+            </para>
+
+            <para>
+                In Zend_Db_Select, you can specify the column(s) to use
+                for calculating the groups of rows using the
+                <code>group()</code> method.  The argument to this
+                method is a column or an array of columns to use in
+                the <code>GROUP BY</code> clause.
+            </para>
+
+            <example id="zend.db.select.building.group.example">
+                <title>Example of the group() method</title>
+                <programlisting role="php"><![CDATA[<?php
+
+// Build this query:
+//   SELECT p."product_id", COUNT(*) AS line_items_per_product
+//   FROM "products" AS p JOIN "line_items" AS l
+//     ON p.product_id = l.product_id
+//   GROUP BY p.product_id
+
+$select = $db->select()
+    ->from(array('p' => 'products'),
+        array('product_id'))
+    ->join(array('l' => 'line_items'),
+        'p.product_id = l.product_id',
+        array('line_items_per_product' => 'COUNT(*)'))
+    ->group('p.product_id');]]></programlisting>
+            </example>
+
+            <para>
+                Like the columns array in the <code>from()</code> method, you
+                can use correlation names in the column name strings, and the
+                column is quoted as an identifier unless the string contains
+                parentheses or is an object of type Zend_Db_Expr.
+            </para>
+
+        </sect3>
+
+        <sect3 id="zend.db.select.building.having">
+
+            <title>Adding a HAVING Clause</title>
+
+            <para>
+                In SQL, the <code>HAVING</code> clause applies a restriction
+                condition on groups of rows.  This is similar to how a
+                <code>WHERE</code> clause applies a restriction condition on rows.
+                But the two clauses are different because <code>WHERE</code>
+                conditions are applied before groups are defined, whereas
+                <code>HAVING</code> conditions are applied after groups are
+                defined.
+            </para>
+
+            <para>
+                In Zend_Db_Select, you can specify conditions for restricting
+                groups using the <code>having()</code> method.  Its usage is
+                similar to that of the <code>where()</code> method.
+                The first argument is a string containing a SQL expression.
+                The optional second argument is a value that is used to replace
+                a positional parameter placeholder in the SQL expression.
+                Expressions given in multiple invocations of the
+                <code>having()</code> method are combined using the Boolean
+                <code>AND</code> operator, or the <code>OR</code> operator if
+                you use the <code>orHaving()</code> method.
+            </para>
+
+            <example id="zend.db.select.building.having.example">
+                <title>Example of the having() method</title>
+                <programlisting role="php"><![CDATA[<?php
+
+// Build this query:
+//   SELECT p."product_id", COUNT(*) AS line_items_per_product
+//   FROM "products" AS p JOIN "line_items" AS l
+//     ON p.product_id = l.product_id
+//   GROUP BY p.product_id
+//   HAVING line_items_per_product > 10
+
+$select = $db->select()
+    ->from(array('p' => 'products'),
+        array('product_id'))
+    ->join(array('l' => 'line_items'),
+        'p.product_id = l.product_id',
+        array('line_items_per_product' => 'COUNT(*)'))
+    ->group('p.product_id')
+    ->having('line_items_per_product > 10');]]></programlisting>
+            </example>
+
+            <note>
+                <para>
+                    No quoting is applied to expressions given to the
+                    <code>having()</code> or <code>orHaving()</code> methods.
+                    If you have column names that need to be quoted, you must use
+                    <code>quoteIdentifier()</code> as you form the string for the
+                    condition.
+                </para>
+            </note>
+
+        </sect3>
+
+        <sect3 id="zend.db.select.building.order">
+
+            <title>Adding an ORDER BY Clause</title>
+
+            <para>
+                In SQL, the <code>ORDER BY</code> clause specifies one or more
+                columns or expressions by which the result set of a query is
+                sorted.  If multiple columns are listed, the secondary columns
+                are used to resolve ties; the sort order is determined by the
+                secondary columns if the preceding columns contain identical
+                values.  The default sorting is from least value to greatest
+                value.  You can also sort by greatest value to least value for
+                a given column in the list by specifying the keyword
+                <code>DESC</code> after that column.
+            </para>
+
+            <para>
+                In Zend_Db_Select, you can use the <code>order()</code> method
+                to specify a column or an array of columns by which to sort.
+                Each element of the array is a string naming a column.
+                optionally with the <code>ASC</code> <code>DESC</code> keyword
+                following it, separated by a space.
+            </para>
+
+            <para>
+                Like in the <code>from()</code> and <code>group()</code>
+                methods, column names are quoted as identifiers, unless they
+                contain contain parentheses or are an object of type
+                Zend_Db_Expr.
+            </para>
+
+            <example id="zend.db.select.building.order.example">
+                <title>Example of the order() method</title>
+                <programlisting role="php"><![CDATA[<?php
+
+// Build this query:
+//   SELECT p."product_id", COUNT(*) AS line_items_per_product
+//   FROM "products" AS p JOIN "line_items" AS l
+//     ON p.product_id = l.product_id
+//   GROUP BY p.product_id
+//   ORDER BY "line_items_per_product" DESC, "product_id"
+
+$select = $db->select()
+    ->from(array('p' => 'products'),
+        array('product_id'))
+    ->join(array('l' => 'line_items'),
+        'p.product_id = l.product_id',
+        array('line_items_per_product' => 'COUNT(*)'))
+    ->group('p.product_id')
+    ->order(array('line_items_per_product DESC', 'product_id'));]]></programlisting>
+            </example>
+
+        </sect3>
+
+        <sect3 id="zend.db.select.building.limit">
+
+            <title>Adding a LIMIT Clause</title>
+
+            <para>
+                Some RDBMS brands extend SQL with a query clause known as the
+                <code>LIMIT</code> clause.  This clause reduces the number of
+                rows in the result set to at most a number you specify.
+                You can also specify to skip a number of rows before starting
+                to output.
+                This feature makes it easy to take a subset of a result set,
+                for example when displaying query results on progressive pages
+                of output.
+            </para>
+
+            <para>
+                In Zend_Db_Select, you can use the <code>limit()</code> method
+                to specify the count of rows and the number of rows to skip.
+                The first argument to this method is the desired count of rows.
+                The second argument is the number of rows to skip.
+            </para>
+
+            <example id="zend.db.select.building.limit.example">
+                <title>Example of the limit() method</title>
+                <programlisting role="php"><![CDATA[<?php
+
+// Build this query:
+//   SELECT p."product_id", p."product_name"
+//   FROM "products" AS p
+//   LIMIT 10, 20
+
+$select = $db->select()
+    ->from(array('p' => 'products'), array('product_id', 'product_name'))
+    ->limit(10, 20);]]></programlisting>
+            </example>
+
+            <note>
+                <para>
+                    The <code>LIMIT</code> syntax is not supported by all RDBMS
+                    brands.  Some RDBMS require different syntax to support
+                    similar functionality.  Each Zend_Db_Adapter_Abstract class
+                    includes a method to produce SQL appropriate for that RDBMS.
+                </para>
+            </note>
+
+            <para>
+                Use the <code>limitPage()</code> method for an alternative way
+                to specify row count and offset.  This method allows you to
+                limit the result set to one of a series of fixed-length subsets
+                of rows from the query's total result set.  In other words, you
+                specify the length of a "page" of results, and the ordinal
+                number of the single page of results you want the query to return.
+                The page number is the first argument of the
+                <code>limitPage()</code> method, and the page length is the
+                second argument.  Both arguments are required; they have no
+                default values.
+            </para>
+
+            <example id="zend.db.select.building.limit.example2">
+                <title>Example of the limitPage() method</title>
+                <programlisting role="php"><![CDATA[<?php
+
+// Build this query:
+//   SELECT p."product_id", p."product_name"
+//   FROM "products" AS p
+//   LIMIT 10, 20
+
+$select = $db->select()
+    ->from(array('p' => 'products'), array('product_id', 'product_name'))
+    ->limitPage(2, 10);]]></programlisting>
+            </example>
+
+        </sect3>
+
+        <sect3 id="zend.db.select.building.distinct">
+
+            <title>Adding the DISTINCT Query Modifier</title>
+
+            <para>
+                The <code>distinct()</code> method enables you to add the
+                <code>DISTINCT</code> keyword to your SQL query.
+            </para>
+
+            <example id="zend.db.select.building.distinct.example">
+                <title>Example of the distinct() method</title>
+                <programlisting role="php"><![CDATA[<?php
+
+// Build this query:
+//   SELECT DISTINCT p."product_name"
+//   FROM "products" AS p
+
+$select = $db->select()
+    ->distinct()
+    ->from(array('p' => 'products'), 'product_name');]]></programlisting>
+            </example>
+
+        </sect3>
+
+        <sect3 id="zend.db.select.building.for-update">
+
+            <title>Adding the FOR UPDATE Query Modifier</title>
+
+            <para>
+                The <code>forUpdate()</code> method enables you to add the
+                <code>FOR UPDATE</code> modifier to your SQL query.
+            </para>
+
+            <example id="zend.db.select.building.for-update.example">
+                <title>Example of forUpdate() method</title>
+                <programlisting role="php"><![CDATA[<?php
+
+// Build this query:
+//   SELECT FOR UPDATE p.*
+//   FROM "products" AS p
+
+$select = $db->select()
+    ->forUpdate()
+    ->from(array('p' => 'products'));]]></programlisting>
+            </example>
+
+        </sect3>
+
+    </sect2>
+
+    <sect2 id="zend.db.select.execute">
+
+        <title>Executing Select Queries</title>
+
+        <para>
+            This section describes how to execute the query represented by a
+            Zend_Db_Select object.
+        </para>
+
+        <sect3 id="zend.db.select.execute.query-adapter">
+
+            <title>Executing Select Queries from the Db Adapter</title>
+
+            <para>
+                You can execute the query represented by the Zend_Db_Select
+                object by passing it as the first argument to the
+                <code>query()</code> method of a Zend_Db_Adapter_Abstract
+                object.  Use the Zend_Db_Select objects instead of a string
+                query.
+            </para>
+
+            <para>
+                The <code>query()</code> method returns an object of type
+                Zend_Db_Statement or PDOStatement, depending on the adapter type.
+            </para>
+
+            <example id="zend.db.select.execute.query-adapter.example">
+                <title>Example using the Db adapter's query() method</title>
+                <programlisting role="php"><![CDATA[<?php
+
+$select = $db->select()
+  ->from('products');
+
+$stmt = $db->query($select);
+$result = $stmt->fetchAll();]]></programlisting>
+            </example>
+
+        </sect3>
+
+        <sect3 id="zend.db.select.execute.query-select">
+
+            <title>Executing Select Queries from the Object</title>
+
+            <para>
+                As an alternative to using the <code>query()</code> method
+                of the adapter object, you can use the <code>query()</code>
+                method of the Zend_Db_Select object.
+                Both methods return an object of type Zend_Db_Statement or
+                PDOStatement, depending on the adapter type.
+            </para>
+
+            <example id="zend.db.select.execute.query-select.example">
+                <title>Example using the Select object's query method</title>
+                <programlisting role="php"><![CDATA[<?php
+
+$select = $db->select()
+    ->from('products');
+
+$stmt = $select->query();
+$result = $stmt->fetchAll();]]></programlisting>
+            </example>
+
+        </sect3>
+
+        <sect3 id="zend.db.select.execute.tostring">
+
+            <title>Converting a Select Object to a SQL String</title>
+
+            <para>
+                If you need access to a string representation of the SQL
+                query corresponding to the Zend_Db_Select object, use
+                the <code>__toString()</code> method.
+            </para>
+
+            <example id="zend.db.select.execute.tostring.example">
+                <title>Example of the __toString() method</title>
+                <programlisting role="php"><![CDATA[<?php
+
+$select = $db->select()
+    ->from('products');
+
+$sql = $select->__toString();
+echo "$sql\n";
+
+// The output is the string:
+//   SELECT * FROM "products"]]></programlisting>
+            </example>
+
+        </sect3>
+
+    </sect2>
+
+    <sect2 id="zend.db.select.other">
+
+        <title>Other methods</title>
+
+        <para>
+            This section describes other methods of the Zend_Db_Select class
+            that are not covered above:  <code>getPart()</code> and
+            <code>reset()</code>.
+        </para>
+
+        <sect3 id="zend.db.select.other.get-part">
+
+            <title>Retrieving Parts of the Select Object</title>
+
+            <para>
+                The <code>getPart()</code> method returns a representation
+                of one part of your SQL query.  For example, you can use this
+                method to return the array of expressions for the
+                <code>WHERE</code> clause, or the array of columns
+                (or column expressions) that are in the <code>SELECT</code>
+                list, or the values of the count and offset for the
+                <code>LIMIT</code> clause.
+            </para>
+
+            <para>
+                The return value is not a string containing a fragment of SQL
+                syntax.  The return value is an internal representation, which
+                is typically an array structure containing values and
+                expressions.  Each part of the query has a different structure.
+            </para>
+
+            <para>
+                The single argument to the <code>getPart()</code> method is
+                a string that identifies which part of the Select query to
+                return.  For example, the string <code>'from'</code>
+                identifies the part of the Select object that stores
+                information about the tables in the <code>FROM</code> clause,
+                including joined tables.
+            </para>
+
+            <para>
+                The Zend_Db_Select class defines constants you can use for
+                parts of the SQL query.  You can use these constant definitions,
+                or you can the literal strings.
+            </para>
+
+            <table id="zend.db.select.other.get-part.table">
+                <title>Constants used by getPart() and reset()</title>
+                <tgroup cols="2">
+                    <thead>
+                        <row>
+                            <entry>Constant</entry>
+                            <entry>String value</entry>
+                        </row>
+                    </thead>
+                    <tbody>
+                        <row>
+                            <entry><code>Zend_Db_Select::DISTINCT</code></entry>
+                            <entry><code>'distinct'</code></entry>
+                        </row>
+                        <row>
+                            <entry><code>Zend_Db_Select::FOR_UPDATE</code></entry>
+                            <entry><code>'forupdate'</code></entry>
+                        </row>
+                        <row>
+                            <entry><code>Zend_Db_Select::COLUMNS</code></entry>
+                            <entry><code>'columns'</code></entry>
+                        </row>
+                        <row>
+                            <entry><code>Zend_Db_Select::FROM</code></entry>
+                            <entry><code>'from'</code></entry>
+                        </row>
+                        <row>
+                            <entry><code>Zend_Db_Select::WHERE</code></entry>
+                            <entry><code>'where'</code></entry>
+                        </row>
+                        <row>
+                            <entry><code>Zend_Db_Select::GROUP</code></entry>
+                            <entry><code>'group'</code></entry>
+                        </row>
+                        <row>
+                            <entry><code>Zend_Db_Select::HAVING</code></entry>
+                            <entry><code>'having'</code></entry>
+                        </row>
+                        <row>
+                            <entry><code>Zend_Db_Select::ORDER</code></entry>
+                            <entry><code>'order'</code></entry>
+                        </row>
+                        <row>
+                            <entry><code>Zend_Db_Select::LIMIT_COUNT</code></entry>
+                            <entry><code>'limitcount'</code></entry>
+                        </row>
+                        <row>
+                            <entry><code>Zend_Db_Select::LIMIT_OFFSET</code></entry>
+                            <entry><code>'limitoffset'</code></entry>
+                        </row>
+                    </tbody>
+                </tgroup>
+            </table>
+
+            <example id="zend.db.select.other.get-part.example">
+                <title>Example of the getPart() method</title>
+                <programlisting role="php"><![CDATA[<?php
+
+$select = $db->select()
+    ->from('products')
+    ->order('product_id');
+
+// You can use a string literal to specify the part
+$orderData = $select->getPart( 'order' );
+
+// You can use a constant to specify the same part
+$orderData = $select->getPart( Zend_Db_Select::ORDER );
+
+// The return value may be an array structure, not a string.
+// Each part has a different structure.
+print_r( $orderData );]]></programlisting>
+            </example>
+
+        </sect3>
+
+        <sect3 id="zend.db.select.other.reset">
+
+            <title>Resetting Parts of the Select Object</title>
+
+            <para>
+                The <code>reset()</code> method enables you to clear one
+                specified part of the SQL query, or else clear all parts of
+                the SQL query if you omit the argument.
+            </para>
+
+            <para>
+                The single argument is optional.  You can specify the part
+                of the query to clear, using the same strings you used in
+                the argument to the <code>getPart()</code> method.
+                The part of the query you specify is reset to a default state.
+            </para>
+
+            <para>
+                If you omit the parameter, <code>reset()</code> changes all
+                parts of the query to their default state.  This makes the
+                Zend_Db_Select object equivalent to a new object, as though you
+                had just instantiated it.
+            </para>
+
+            <example id="zend.db.select.other.reset.example">
+                <title>Example of the reset() method</title>
+                <programlisting role="php"><![CDATA[<?php
+
+// Build this query:
+//   SELECT p.*
+//   FROM "products" AS p
+//   ORDER BY "product_name"
+
+$select = $db->select()
+    ->from(array('p' => 'products')
+    ->order('product_name');
+
+// Changed requirement, instead order by a different columns:
+//   SELECT p.*
+//   FROM "products" AS p
+//   ORDER BY "product_id"
+
+// Clear one part so we can redefine it
+$select->reset( Zend_Db_Select::ORDER );
+
+// And specify a different column
+$select->order('product_id');
+
+// Clear all parts of the query
+$select->reset();]]></programlisting>
+            </example>
+
+        </sect3>
+
+    </sect2>
+
+</sect1>
+<!--
+vim:se ts=4 sw=4 et:
+-->

+ 74 - 148
documentation/manual/pt-br/module_specs/Zend_Pdf-Create.xml

@@ -1,148 +1,74 @@
-<sect1 id="zend.pdf.create">
-
-    <title>Criando e Carregando documentos PDF.</title>
-
-    <para>
-
-     A classe <code>Zend_Pdf</code> representa o próprio documento PDF e provê
-
-     funcionalidades para manupulação do documento.
-
-    </para>
-
-
-
-    <para>
-
-    Para criar um novo documento, um objeto <code>Zend_Pdf</code> deve ser instanciado.
-
-    </para>
-
-
-
-    <para>
-
-    A classe <code>Zend_Pdf</code> também provê dois métodos estáticos para carregar um PDF existente.
-
-    Os métodos são o <code>Zend_Pdf::load()</code> e o <code>Zend_Pdf::parse()</code>.
-
-    Ambos retornam um objeto Zend_Pdf como resultado, ou uma exceção se algum erro ocorrer.
-
-    </para>
-
-
-
-    <example id="zend.pdf.create.example-1">
-
-        <title>Criar um novo documento PDF ou Carregar um já existente.</title>
-
-        <programlisting role="php"><![CDATA[<?php
-
-...
-
-// Create new PDF document.
-
-$pdf1 = new Zend_Pdf();
-
-
-
-// Load PDF document from a file.
-
-$pdf2 = Zend_Pdf::load($fileName);
-
-
-
-// Load PDF document from a string.
-
-$pdf3 = Zend_Pdf::parse($pdfString);
-
-...]]>
-
-      </programlisting>
-
-    </example>
-
-
-
-    <para>
-
-    O formato de arquivo PDF suporta a atualização incremental do documento. Dessa forma, toda vez que um documento
-
-    é atualizado uma nova revisão do documento é criada.
-
-    O módulo Zend_Pdf suporta a recuperação da revisão especificada.
-
-    </para>
-
-    <para>
-
-    A revisão pode ser especificada como o segundo parâmetro dos métodos <code>Zend_Pdf::load()</code> e
-
-    <code>Zend_Pdf::parse()</code> ou solicitada através de <code>Zend_Pdf::rollback()</code>
-
-        <footnote>
-
-            <para>
-
-            O método <code>Zend_Pdf::rollback()</code> deve ser chamado antes que qualquer mudança seja
-
-            aplicada ao documento.
-
-            De outra forma o coportamento do método é indefinido.
-
-            </para>
-
-        </footnote>
-
-    call.
-
-    </para>
-
-
-
-    <example id="zend.pdf.create.example-2">
-
-        <title>Solicitando uma revisão específica do documento PDF.</title>
-
-        <programlisting role="php"><![CDATA[<?php
-
-...
-
-// Load PDF previouse revision of the document.
-
-$pdf1 = Zend_Pdf::load($fileName, 1);
-
-
-
-// Load PDF previouse revision of the document.
-
-$pdf2 = Zend_Pdf::parse($pdfString, 1);
-
-
-
-// Load first revision of the document.
-
-$pdf3 = Zend_Pdf::load($fileName);
-
-$revisions = $pdf3->revisions();
-
-$pdf3->rollback($revisions - 1);
-
-...]]>
-
-        </programlisting>
-
-    </example>
-
-
-
-
-
-</sect1>
-
-<!--
-
-vim:se ts=4 sw=4 et:
-
--->
-
+<sect1 id="zend.pdf.create">
+    <title>Criando e Carregando documentos PDF.</title>
+    <para>
+     A classe <code>Zend_Pdf</code> representa o próprio documento PDF e provê
+     funcionalidades para manupulação do documento.
+    </para>
+
+    <para>
+    Para criar um novo documento, um objeto <code>Zend_Pdf</code> deve ser instanciado.
+    </para>
+
+    <para>
+    A classe <code>Zend_Pdf</code> também provê dois métodos estáticos para carregar um PDF existente.
+    Os métodos são o <code>Zend_Pdf::load()</code> e o <code>Zend_Pdf::parse()</code>.
+    Ambos retornam um objeto Zend_Pdf como resultado, ou uma exceção se algum erro ocorrer.
+    </para>
+
+    <example id="zend.pdf.create.example-1">
+        <title>Criar um novo documento PDF ou Carregar um já existente.</title>
+        <programlisting role="php"><![CDATA[<?php
+...
+// Create new PDF document.
+$pdf1 = new Zend_Pdf();
+
+// Load PDF document from a file.
+$pdf2 = Zend_Pdf::load($fileName);
+
+// Load PDF document from a string.
+$pdf3 = Zend_Pdf::parse($pdfString);
+...]]>
+      </programlisting>
+    </example>
+
+    <para>
+    O formato de arquivo PDF suporta a atualização incremental do documento. Dessa forma, toda vez que um documento
+    é atualizado uma nova revisão do documento é criada.
+    O módulo Zend_Pdf suporta a recuperação da revisão especificada.
+    </para>
+    <para>
+    A revisão pode ser especificada como o segundo parâmetro dos métodos <code>Zend_Pdf::load()</code> e
+    <code>Zend_Pdf::parse()</code> ou solicitada através de <code>Zend_Pdf::rollback()</code>
+        <footnote>
+            <para>
+            O método <code>Zend_Pdf::rollback()</code> deve ser chamado antes que qualquer mudança seja
+            aplicada ao documento.
+            De outra forma o coportamento do método é indefinido.
+            </para>
+        </footnote>
+    call.
+    </para>
+
+    <example id="zend.pdf.create.example-2">
+        <title>Solicitando uma revisão específica do documento PDF.</title>
+        <programlisting role="php"><![CDATA[<?php
+...
+// Load PDF previouse revision of the document.
+$pdf1 = Zend_Pdf::load($fileName, 1);
+
+// Load PDF previouse revision of the document.
+$pdf2 = Zend_Pdf::parse($pdfString, 1);
+
+// Load first revision of the document.
+$pdf3 = Zend_Pdf::load($fileName);
+$revisions = $pdf3->revisions();
+$pdf3->rollback($revisions - 1);
+...]]>
+        </programlisting>
+    </example>
+
+
+</sect1>
+<!--
+vim:se ts=4 sw=4 et:
+-->

+ 785 - 1570
documentation/manual/pt-br/module_specs/Zend_Pdf-Drawing.xml

@@ -1,1570 +1,785 @@
-<sect1 id="zend.pdf.drawing">
-
-    <title>Drawing.</title>
-
-
-
-    <sect2 id="zend.pdf.drawing.geometry">
-
-        <title>Geometria.</title>
-
-        <para>
-
-        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).
-
-        </para>
-
-        <para>
-
-        O tamanho da página pode ser recuperado de um objeto página:
-
-        </para>
-
-        <para>
-
-            <programlisting role="php"><![CDATA[<?php
-
-$width  = $pdfPage->getWidth();
-
-$height = $pdfPage->getHeight();]]>
-
-            </programlisting>
-
-        </para>
-
-    </sect2>
-
-
-
-    <sect2 id="zend.pdf.drawing.color">
-
-        <title>Colors.</title>
-
-        <para>
-
-        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 <code>Zend_Pdf_Color</code> for requisitado.
-
-        As classes <code>Zend_Pdf_Color_GrayScale</code>, <code>Zend_Pdf_Color_Rgb</code> e
-
-        <code>Zend_Pdf_Color_Cmyk</code> fornecem a seguinte funcionalidade:
-
-        </para>
-
-        <programlisting role="php"><![CDATA[<?php
-
-// $grayLevel (float number). 0.0 (black) - 1.0 (white)
-
-$color1 = new Zend_Pdf_Color_GrayScale($grayLevel);
-
-
-
-// $r, $g, $b (float numbers). 0.0 (minimum intensity) - 1.0 (maximum intensity)
-
-$color2 = new Zend_Pdf_Color_Rgb($r, $g, $b);
-
-
-
-// $c, $m, $y, $k (float numbers). 0.0 (minimum intensity) - 1.0 (maximum intensity)
-
-$color3 = new Zend_Pdf_Color_Cmyk($c, $m, $y, $k);]]>
-
-        </programlisting>
-
-
-
-        <para>
-
-        O estilo de cores do HTML também são fornecidos na classe <code>Zend_Pdf_Color_Html</code>:
-
-        </para>
-
-        <programlisting role="php"><![CDATA[<?php
-
-$color1 = new Zend_Pdf_Color_Html('#3366FF');
-
-$color2 = new Zend_Pdf_Color_Html('silver');
-
-$color3 = new Zend_Pdf_Color_Html('forestgreen');]]>
-
-        </programlisting>
-
-    </sect2>
-
-
-
-
-
-    <sect2 id="zend.pdf.drawing.shape-drawing">
-
-        <title>Desenhando Formas.</title>
-
-        <para>
-
-        Todas as operações de desenho podem ser feitas no contexto de uma página PDF.
-
-        </para>
-
-        <para>
-
-        A classe <code>Zend_Pdf_Page</code> provê um conjunto de formas básicas para desenho:
-
-        </para>
-
-        <programlisting role="php"><![CDATA[<?php
-
-/**
-
- * Draw a line from x1,y1 to x2,y2.
-
- *
-
- * @param float $x1
-
- * @param float $y1
-
- * @param float $x2
-
- * @param float $y2
-
- */
-
-public function drawLine($x1, $y1, $x2, $y2);]]>
-
-        </programlisting>
-
-        <programlisting role="php"><![CDATA[<?php
-
-/**
-
- * Draw a rectangle.
-
- *
-
- * Fill types:
-
- * Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE - fill rectangle and stroke (default)
-
- * Zend_Pdf_Page::SHAPE_DRAW_STROKE      - stroke rectangle
-
- * Zend_Pdf_Page::SHAPE_DRAW_FILL        - fill rectangle
-
- *
-
- * @param float $x1
-
- * @param float $y1
-
- * @param float $x2
-
- * @param float $y2
-
- * @param integer $fillType
-
- */
-
-public function drawRectangle($x1, $y1, $x2, $y2, $fillType = Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE);]]>
-
-        </programlisting>
-
-        <programlisting role="php"><![CDATA[<?php
-
-/**
-
- * Draw a polygon.
-
- *
-
- * If $fillType is Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE or Zend_Pdf_Page::SHAPE_DRAW_FILL,
-
- * then polygon is automatically closed.
-
- * See detailed description of these methods in a PDF documentation
-
- * (section 4.4.2 Path painting Operators, Filling)
-
- *
-
- * @param array $x  - array of float (the X co-ordinates of the vertices)
-
- * @param array $y  - array of float (the Y co-ordinates of the vertices)
-
- * @param integer $fillType
-
- * @param integer $fillMethod
-
- */
-
-public function drawPolygon($x, $y,
-
-                            $fillType = Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE,
-
-                            $fillMethod = Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING);]]>
-
-        </programlisting>
-
-        <programlisting role="php"><![CDATA[<?php
-
-/**
-
- * Draw a circle centered on x, y with a radius of radius.
-
- *
-
- * Angles are specified in radians
-
- *
-
- * Method signatures:
-
- * drawCircle($x, $y, $radius);
-
- * drawCircle($x, $y, $radius, $fillType);
-
- * drawCircle($x, $y, $radius, $startAngle, $endAngle);
-
- * drawCircle($x, $y, $radius, $startAngle, $endAngle, $fillType);
-
- *
-
- *
-
- * It's not a really circle, because PDF supports only cubic Bezier curves.
-
- * But very good approximation.
-
- * It differs from a real circle on a maximum 0.00026 radiuses
-
- * (at PI/8, 3*PI/8, 5*PI/8, 7*PI/8, 9*PI/8, 11*PI/8, 13*PI/8 and 15*PI/8 angles).
-
- * At 0, PI/4, PI/2, 3*PI/4, PI, 5*PI/4, 3*PI/2 and 7*PI/4 it's exactly a tangent to a circle.
-
- *
-
- * @param float $x
-
- * @param float $y
-
- * @param float $radius
-
- * @param mixed $param4
-
- * @param mixed $param5
-
- * @param mixed $param6
-
- */
-
-public function  drawCircle($x, $y, $radius, $param4 = null, $param5 = null, $param6 = null);]]>
-
-        </programlisting>
-
-        <programlisting role="php"><![CDATA[<?php
-
-/**
-
- * Draw an ellipse inside the specified rectangle.
-
- *
-
- * Method signatures:
-
- * drawEllipse($x1, $y1, $x2, $y2);
-
- * drawEllipse($x1, $y1, $x2, $y2, $fillType);
-
- * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle);
-
- * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle, $fillType);
-
- *
-
- * Angles are specified in radians
-
- *
-
- * @param float $x1
-
- * @param float $y1
-
- * @param float $x2
-
- * @param float $y2
-
- * @param mixed $param5
-
- * @param mixed $param6
-
- * @param mixed $param7
-
- */
-
-public function drawEllipse($x1, $y1, $x2, $y2, $param5 = null, $param6 = null, $param7 = null);]]>
-
-        </programlisting>
-
-    </sect2>
-
-
-
-    <sect2 id="zend.pdf.drawing.text-drawing">
-
-        <title>Desenhando Texto.</title>
-
-        <para>
-
-        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).
-
-        </para>
-
-        <programlisting role="php"><![CDATA[<?php
-
-/**
-
- * Draw a line of text at the specified position.
-
- *
-
- * @param string $text
-
- * @param float $x
-
- * @param float $y
-
- * @param string $charEncoding (optional) Character encoding of source text.
-
- *   Defaults to current locale.
-
- * @throws Zend_Pdf_Exception
-
- */
-
-public function drawText($text, $x, $y, $charEncoding = '');]]>
-
-        </programlisting>
-
-        <example id="zend.pdf.drawing.text-drawing.example-1">
-
-            <title>Desenhar um texo na página.</title>
-
-            <programlisting role="php"><![CDATA[<?php
-
-...
-
-$pdfPage->drawText('Hello world!', 72, 720);
-
-...]]>
-
-            </programlisting>
-
-        </example>
-
-        <para>
-
-        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        <code><ulink url="http://www.php.net/manual/function.iconv.php">iconv()</ulink></code> do PHP:
-
-        </para>
-
-        <example id="zend.pdf.drawing.text-drawing.example-2">
-
-            <title>Desenhar uma string codificada em UTF-8 em uma página.</title>
-
-            <programlisting role="php"><![CDATA[<?php
-
-...
-
-// Read a UTF-8-encoded string from disk
-
-$unicodeString = fread($fp, 1024);
-
-
-
-// Draw the string on the page
-
-$pdfPage->drawText($unicodeString, 72, 720, 'UTF-8');
-
-...]]>
-
-            </programlisting>
-
-        </example>
-
-    </sect2>
-
-
-
-    <sect2 id="zend.pdf.drawing.using-fonts">
-
-        <title>Using fonts.</title>
-
-        <para>
-
-        O método <code>Zend_Pdf_Page::drawText()</code> usa a fonte atual da página, que é configurada através do
-
-        método <code>Zend_Pdf_Page::setFont()</code>:
-
-        </para>
-
-        <programlisting role="php"><![CDATA[<?php
-
-/**
-
- * Set current font.
-
- *
-
- * @param Zend_Pdf_Resource_Font $font
-
- * @param float $fontSize
-
- */
-
-public function setFont(Zend_Pdf_Resource_Font $font, $fontSize);]]>
-
-        </programlisting>
-
-        <para>
-
-        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.
-
-        </para>
-
-        <para>
-
-        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):
-
-        <code>Zend_Pdf_Font::fontWithName($fontName)</code> para as 14 fontes padrão ou
-
-        <code>end_Pdf_Font::fontWithPath($filePath)</code> para fontes personalizadas.
-
-        </para>
-
-        <example id="zend.pdf.drawing.using-fonts.example-1">
-
-            <title>Criar uma fonte padrão.</title>
-
-            <programlisting role="php"><![CDATA[<?php
-
-...
-
-// Create new font
-
-$font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA);
-
-
-
-// Apply font
-
-$pdfPage->setFont($font, 36);
-
-...]]>
-
-            </programlisting>
-
-        </example>
-
-        <para>
-
-        As constantes para as 14 fontes PDF padrão são definidas na classe <code>Zend_Pdf_Font</code>:
-
-        <itemizedlist>
-
-            <listitem>
-
-                <para>Zend_Pdf_Font::FONT_COURIER</para>
-
-            </listitem>
-
-            <listitem>
-
-                <para>Zend_Pdf_Font::FONT_COURIER_BOLD</para>
-
-            </listitem>
-
-            <listitem>
-
-                <para>Zend_Pdf_Font::FONT_COURIER_ITALIC</para>
-
-            </listitem>
-
-            <listitem>
-
-                <para>Zend_Pdf_Font::FONT_COURIER_BOLD_ITALIC</para>
-
-            </listitem>
-
-            <listitem>
-
-                <para>Zend_Pdf_Font::FONT_TIMES</para>
-
-            </listitem>
-
-            <listitem>
-
-                <para>Zend_Pdf_Font::FONT_TIMES_BOLD</para>
-
-            </listitem>
-
-            <listitem>
-
-                <para>Zend_Pdf_Font::FONT_TIMES_ITALIC</para>
-
-            </listitem>
-
-            <listitem>
-
-                <para>Zend_Pdf_Font::FONT_TIMES_BOLD_ITALIC</para>
-
-            </listitem>
-
-            <listitem>
-
-                <para>Zend_Pdf_Font::FONT_HELVETICA</para>
-
-            </listitem>
-
-            <listitem>
-
-                <para>Zend_Pdf_Font::FONT_HELVETICA_BOLD</para>
-
-            </listitem>
-
-            <listitem>
-
-                <para>Zend_Pdf_Font::FONT_HELVETICA_ITALIC</para>
-
-            </listitem>
-
-            <listitem>
-
-                <para>Zend_Pdf_Font::FONT_HELVETICA_BOLD_ITALIC</para>
-
-            </listitem>
-
-            <listitem>
-
-                <para>Zend_Pdf_Font::FONT_SYMBOL</para>
-
-            </listitem>
-
-            <listitem>
-
-                <para>Zend_Pdf_Font::FONT_ZAPFDINGBATS</para>
-
-            </listitem>
-
-        </itemizedlist>
-
-        </para>
-
-        <para>
-
-        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>
-
-        <para>
-
-        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:
-
-        </para>
-
-        <example id="zend.pdf.drawing.using-fonts.example-2">
-
-            <title>Criar uma fonte TrueType.</title>
-
-            <programlisting role="php"><![CDATA[<?php
-
-...
-
-// Create new font
-
-$goodDogCoolFont = Zend_Pdf_Font::fontWithPath('/path/to/GOODDC__.TTF');
-
-
-
-// Apply font
-
-$pdfPage->setFont($goodDogCoolFont, 36);
-
-...]]>
-
-            </programlisting>
-
-        </example>
-
-        <para>
-
-        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:
-
-        </para>
-
-        <example id="zend.pdf.drawing.using-fonts.example-3">
-
-            <title>Criar uma fonte TrueType, mas não embarca-la no documento PDF.</title>
-
-            <programlisting role="php"><![CDATA[<?php
-
-...
-
-// Create new font
-
-$goodDogCoolFont = Zend_Pdf_Font::fontWithPath('/path/to/GOODDC__.TTF',
-
-                                               Zend_Pdf_Font::EMBED_DONT_EMBED);
-
-
-
-// Apply font
-
-$pdfPage->setFont($goodDogCoolFont, 36);
-
-...]]>
-
-            </programlisting>
-
-        </example>
-
-        <para>
-
-        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.
-
-        </para>
-
-        <para>
-
-        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.
-
-        </para>
-
-        <para>
-
-        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:
-
-        </para>
-
-        <example id="zend.pdf.drawing.using-fonts.example-4">
-
-            <title>Não lançar uma exceção para fontes que não podem ser embarcadas.</title>
-
-            <programlisting role="php"><![CDATA[<?php
-
-...
-
-$font = Zend_Pdf_Font::fontWithPath('/path/to/unEmbeddableFont.ttf',
-
-                                    Zend_Pdf_Font::EMBED_SUPPRESS_EMBED_EXCEPTION);
-
-...]]>
-
-            </programlisting>
-
-        </example>
-
-        <para>
-
-        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.
-
-        </para>
-
-        <para>
-
-        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:
-
-        </para>
-
-        <example id="zend.pdf.drawing.using-fonts.example-5">
-
-            <title>Não comprimir uma fonte embarcada.</title>
-
-            <programlisting role="php"><![CDATA[<?php
-
-...
-
-$font = Zend_Pdf_Font::fontWithPath('/path/to/someReallyBigFont.ttf',
-
-                                    Zend_Pdf_Font::EMBED_DONT_COMPRESS);
-
-...]]>
-
-            </programlisting>
-
-        </example>
-
-        <para>
-
-        Finalmente, quando necessário, você pode combinar as opções de embarque usando o operador binário OR:
-
-        </para>
-
-        <example id="zend.pdf.drawing.using-fonts.example-6">
-
-            <title>Combinando opções de embarque de fonte.</title>
-
-            <programlisting role="php"><![CDATA[<?php
-
-...
-
-$font = Zend_Pdf_Font::fontWithPath($someUserSelectedFontPath,
-
-                                    (Zend_Pdf_Font::EMBED_SUPPRESS_EMBED_EXCEPTION |
-
-                                     Zend_Pdf_Font::EMBED_DONT_COMPRESS));
-
-...]]>
-
-            </programlisting>
-
-        </example>
-
-    </sect2>
-
-
-
-    <sect2 id="zend.pdf.drawing.image-drawing">
-
-        <title>Desenhando Imagens.</title>
-
-        <para>
-
-        A classe <code>Zend_Pdf_Page</code> fornece o método drawImage() para o desenho de imagens:
-
-        </para>
-
-        <programlisting role="php"><![CDATA[<?php
-
-/**
-
- * Draw an image at the specified position on the page.
-
- *
-
- * @param Zend_Pdf_Resource_Image $image
-
- * @param float $x1
-
- * @param float $y1
-
- * @param float $x2
-
- * @param float $y2
-
- */
-
-public function drawImage(Zend_Pdf_Resource_Image $image, $x1, $y1, $x2, $y2);]]>
-
-        </programlisting>
-
-        <para>
-
-        Objetos de imagem devem ser criaos com o método <code>Zend_Pdf_Image::imageWithPath($filePath)</code> (imagens JPG, PNG e
-
-        TIFF são suportadas agora):
-
-        </para>
-
-        <example id="zend.pdf.drawing.image-drawing.example-1">
-
-            <title>Desenhando imagens.</title>
-
-            <programlisting role="php"><![CDATA[<?php
-
-...
-
-// load image
-
-$image = Zend_Pdf_Image::imageWithPath('my_image.jpg');
-
-
-
-$pdfPage->drawImage($image, 100, 100, 400, 300);
-
-...]]>
-
-            </programlisting>
-
-        </example>
-
-
-
-        <para>
-
-            <emphasis>Importante! O suporte a JPEG requer que a extensão PHP GD esteja configurada.</emphasis>
-
-            <emphasis>Importante! O suporte a PNG requer que extensão ZLIB esteja configurada para trabalhar com
-
-            imagens com canal Alpha.</emphasis>
-
-        </para>
-
-        <para>
-
-            Consulte a documentação PHP informações detalhadas
-
-            (<ulink url="http://www.php.net/manual/en/ref.image.php">http://www.php.net/manual/en/ref.image.php</ulink>).
-
-            (<ulink url="http://www.php.net/manual/en/ref.zlib.php">http://www.php.net/manual/en/ref.zlib.php</ulink>).
-
-        </para>
-
-    </sect2>
-
-
-
-    <sect2 id="zend.pdf.drawing.line-drawing-style">
-
-        <title>Estilo de desenho de linhas.</title>
-
-        <para>
-
-        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 <code>Zend_Pdf_Page</code>:
-
-        </para>
-
-        <programlisting role="php"><![CDATA[<?php
-
-/** Set line color. */
-
-public function setLineColor(Zend_Pdf_Color $color);
-
-
-
-/** Set line width. */
-
-public function setLineWidth(float $width);
-
-
-
-/**
-
- * Set line dashing pattern.
-
- *
-
- * Pattern is an array of floats: array(on_length, off_length, on_length, off_length, ...)
-
- * Phase is shift from the beginning of line.
-
- *
-
- * @param array $pattern
-
- * @param array $phase
-
- */
-
-public function setLineDashingPattern($pattern, $phase = 0);]]>
-
-        </programlisting>
-
-    </sect2>
-
-
-
-    <sect2 id="zend.pdf.drawing.fill-style">
-
-        <title>Estilo de preenchimento.</title>
-
-        <para>
-
-        Os métodos <code>Zend_Pdf_Page::drawRectangle()</code>, <code>Zend_Pdf_Page::drawPoligon()</code>,
-
-        <code>Zend_Pdf_Page::drawCircle()</code> e <code>Zend_Pdf_Page::drawEllipse()</code> usam o argumento
-
-        <code>$fillType</code> como um parâmetro opcional. Ele pode ser:
-
-        </para>
-
-
-
-        <itemizedlist>
-
-            <listitem>
-
-                <para>Zend_Pdf_Page::SHAPE_DRAW_STROKE - pincelamento</para>
-
-            </listitem>
-
-            <listitem>
-
-                <para>Zend_Pdf_Page::SHAPE_DRAW_FILL - apenas preenchimento</para>
-
-            </listitem>
-
-            <listitem>
-
-                <para>Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE - preenchimento e pincelamento (comportamento padrão)</para>
-
-            </listitem>
-
-        </itemizedlist>
-
-
-
-        <para>
-
-        Os métodos <code>Zend_Pdf_Page::drawPoligon()</code> também recebem um parâmetro adicional <code>$fillMethod</code>:
-
-        </para>
-
-        <itemizedlist>
-
-            <listitem>
-
-                <para>Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING (comportamento padrão)</para>
-
-                <para>
-
-                A <citetitle>PDF reference</citetitle> escreve esta regra como:
-
-                <blockquote>
-
-                    <para>
-
-                    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.
-
-                </para>
-
-            </blockquote>
-
-            </para>
-
-            </listitem>
-
-            <listitem>
-
-                <para>Zend_Pdf_Page::FILL_METHOD_EVEN_ODD</para>
-
-                <para>
-
-                <citetitle>PDF reference</citetitle> describes this rule as follows:
-
-                <blockquote>
-
-                    <para>
-
-                    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.
-
-                    </para>
-
-                </blockquote>
-
-            </para>
-
-            </listitem>
-
-        </itemizedlist>
-
-    </sect2>
-
-
-
-    <sect2 id="zend.pdf.drawing.rotations">
-
-        <title>Rotações.</title>
-
-        <para>
-
-        A página PDF pode ser rotacionada antes do uso de qualquer operação de desenho.
-
-        Isso pode ser feito pelo método <code>Zend_Pdf_Page::rotate()</code>:
-
-        </para>
-
-        <programlisting role="php"><![CDATA[<?php
-
-/**
-
- * Rotate the page around ($x, $y) point by specified angle (in radians).
-
- *
-
- * @param float $angle
-
- */
-
-public function rotate($x, $y, $angle);]]>
-
-        </programlisting>
-
-    </sect2>
-
-
-
-    <sect2 id="zend.pdf.drawing.save-restore">
-
-        <title>Salvar/restaurar estados gráficos.</title>
-
-        <para>
-
-        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.
-
-        </para>
-
-        <para>
-
-        Existem dois métodos na classe  <code>Zend_Pdf_Page</code> para essas operações:
-
-        </para>
-
-        <programlisting role="php"><![CDATA[<?php
-
-/**
-
- * Save the graphics state of this page.
-
- * This takes a snapshot of the currently applied style, position, clipping area and
-
- * any rotation/translation/scaling that has been applied.
-
- */
-
-public function saveGS();
-
-
-
-/**
-
- * Restore the graphics state that was saved with the last call to saveGS().
-
- */
-
-public function restoreGS();]]>
-
-        </programlisting>
-
-    </sect2>
-
-
-
-    <sect2 id="zend.pdf.drawing.clipping">
-
-        <title>Recorte de área de desenho .</title>
-
-        <para>
-
-        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.
-
-        </para>
-
-        <para>
-
-        A classe <code>Zend_Pdf_Page</code> fornece um conjunto de métodos para operações de recorte.
-
-        </para>
-
-        <programlisting role="php"><![CDATA[<?php
-
-/**
-
- * Intersect current clipping area with a rectangle.
-
- *
-
- * @param float $x1
-
- * @param float $y1
-
- * @param float $x2
-
- * @param float $y2
-
- */
-
-public function clipRectangle($x1, $y1, $x2, $y2);]]>
-
-        </programlisting>
-
-        <programlisting role="php"><![CDATA[<?php
-
-/**
-
- * Intersect current clipping area with a polygon.
-
- *
-
- * @param array $x  - array of float (the X co-ordinates of the vertices)
-
- * @param array $y  - array of float (the Y co-ordinates of the vertices)
-
- * @param integer $fillMethod
-
- */
-
-public function clipPolygon($x, $y, $fillMethod = Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING);]]>
-
-        </programlisting>
-
-        <programlisting role="php"><![CDATA[<?php
-
-/**
-
- * Intersect current clipping area with a circle.
-
- *
-
- * @param float $x
-
- * @param float $y
-
- * @param float $radius
-
- * @param float $startAngle
-
- * @param float $endAngle
-
- */
-
-public function clipCircle($x, $y, $radius, $startAngle = null, $endAngle = null);]]>
-
-        </programlisting>
-
-        <programlisting role="php"><![CDATA[<?php
-
-/**
-
- * Intersect current clipping area with an ellipse.
-
- *
-
- * Method signatures:
-
- * drawEllipse($x1, $y1, $x2, $y2);
-
- * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle);
-
- *
-
- * @todo process special cases with $x2-$x1 == 0 or $y2-$y1 == 0
-
- *
-
- * @param float $x1
-
- * @param float $y1
-
- * @param float $x2
-
- * @param float $y2
-
- * @param float $startAngle
-
- * @param float $endAngle
-
- */
-
-public function clipEllipse($x1, $y1, $x2, $y2, $startAngle = null, $endAngle = null);]]>
-
-        </programlisting>
-
-    </sect2>
-
-
-
-    <sect2 id="zend.pdf.drawing.styles">
-
-        <title>Estilos.</title>
-
-        <para>
-
-        A classe <code>Zend_Pdf_Style</code> fornece funcionalidades de estilo.
-
-        </para>
-
-        <para>
-
-        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:
-
-        </para>
-
-        <programlisting role="php"><![CDATA[<?php
-
-/**
-
- * Set the style to use for future drawing operations on this page
-
- *
-
- * @param Zend_Pdf_Style $style
-
- */
-
-public function setStyle(Zend_Pdf_Style $style);
-
-
-
-/**
-
- * Return the style, applied to the page.
-
- *
-
- * @return Zend_Pdf_Style|null
-
- */
-
-public function getStyle();]]>
-
-        </programlisting>
-
-
-
-        <para>
-
-        A classe <code>Zend_Pdf_Style</code> fornece um conjunto de métodos para configurar ou recuperar
-
-        diferentes parâmetros do estado gráfico:
-
-        </para>
-
-        <programlisting role="php"><![CDATA[<?php
-
-/**
-
- * Set line color.
-
- *
-
- * @param Zend_Pdf_Color $color
-
- */
-
-public function setLineColor(Zend_Pdf_Color $color);]]>
-
-        </programlisting>
-
-        <programlisting role="php"><![CDATA[<?php
-
-/**
-
- * Get line color.
-
- *
-
- * @return Zend_Pdf_Color|null
-
- */
-
-public function getLineColor();]]>
-
-        </programlisting>
-
-        <programlisting role="php"><![CDATA[<?php
-
-/**
-
- * Set line width.
-
- *
-
- * @param float $width
-
- */
-
-public function setLineWidth($width);]]>
-
-        </programlisting>
-
-        <programlisting role="php"><![CDATA[<?php
-
-/**
-
- * Get line width.
-
- *
-
- * @return float
-
- */
-
-public function getLineWidth();]]>
-
-        </programlisting>
-
-        <programlisting role="php"><![CDATA[<?php
-
-/**
-
- * Set line dashing pattern
-
- *
-
- * @param array $pattern
-
- * @param float $phase
-
- */
-
-public function setLineDashingPattern($pattern, $phase = 0);]]>
-
-        </programlisting>
-
-        <programlisting role="php"><![CDATA[<?php
-
-/**
-
- * Get line dashing pattern
-
- *
-
- * @return array
-
- */
-
-public function getLineDashingPattern();]]>
-
-        </programlisting>
-
-        <programlisting role="php"><![CDATA[<?php
-
-/**
-
- * Get line dashing phase
-
- *
-
- * @return float
-
- */
-
-public function getLineDashingPhase();]]>
-
-        </programlisting>
-
-        <programlisting role="php"><![CDATA[<?php
-
-/**
-
- * Set fill color.
-
- *
-
- * @param Zend_Pdf_Color $color
-
- */
-
-public function setFillColor(Zend_Pdf_Color $color);]]>
-
-        </programlisting>
-
-        <programlisting role="php"><![CDATA[<?php
-
-/**
-
- * Get fill color.
-
- *
-
- * @return Zend_Pdf_Color|null
-
- */
-
-public function getFillColor();]]>
-
-        </programlisting>
-
-        <programlisting role="php"><![CDATA[<?php
-
-/**
-
- * Set current font.
-
- *
-
- * @param Zend_Pdf_Resource_Font $font
-
- * @param float $fontSize
-
- */
-
-public function setFont(Zend_Pdf_Resource_Font $font, $fontSize);]]>
-
-        </programlisting>
-
-        <programlisting role="php"><![CDATA[<?php
-
-/**
-
- * Modify current font size
-
- *
-
- * @param float $fontSize
-
- */
-
-public function setFontSize($fontSize);]]>
-
-        </programlisting>
-
-        <programlisting role="php"><![CDATA[<?php
-
-/**
-
- * Get current font.
-
- *
-
- * @return Zend_Pdf_Resource_Font $font
-
- */
-
-public function getFont();]]>
-
-        </programlisting>
-
-        <programlisting role="php"><![CDATA[<?php
-
-/**
-
- * Get current font size
-
- *
-
- * @return float $fontSize
-
- */
-
-public function getFontSize();]]>
-
-        </programlisting>
-
-    </sect2>
-
-
-
-</sect1>
-
-<!--
-
-vim:se ts=4 sw=4 et:
-
--->
-
+<sect1 id="zend.pdf.drawing">
+    <title>Drawing.</title>
+
+    <sect2 id="zend.pdf.drawing.geometry">
+        <title>Geometria.</title>
+        <para>
+        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).
+        </para>
+        <para>
+        O tamanho da página pode ser recuperado de um objeto página:
+        </para>
+        <para>
+            <programlisting role="php"><![CDATA[<?php
+$width  = $pdfPage->getWidth();
+$height = $pdfPage->getHeight();]]>
+            </programlisting>
+        </para>
+    </sect2>
+
+    <sect2 id="zend.pdf.drawing.color">
+        <title>Colors.</title>
+        <para>
+        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 <code>Zend_Pdf_Color</code> for requisitado.
+        As classes <code>Zend_Pdf_Color_GrayScale</code>, <code>Zend_Pdf_Color_Rgb</code> e
+        <code>Zend_Pdf_Color_Cmyk</code> fornecem a seguinte funcionalidade:
+        </para>
+        <programlisting role="php"><![CDATA[<?php
+// $grayLevel (float number). 0.0 (black) - 1.0 (white)
+$color1 = new Zend_Pdf_Color_GrayScale($grayLevel);
+
+// $r, $g, $b (float numbers). 0.0 (minimum intensity) - 1.0 (maximum intensity)
+$color2 = new Zend_Pdf_Color_Rgb($r, $g, $b);
+
+// $c, $m, $y, $k (float numbers). 0.0 (minimum intensity) - 1.0 (maximum intensity)
+$color3 = new Zend_Pdf_Color_Cmyk($c, $m, $y, $k);]]>
+        </programlisting>
+
+        <para>
+        O estilo de cores do HTML também são fornecidos na classe <code>Zend_Pdf_Color_Html</code>:
+        </para>
+        <programlisting role="php"><![CDATA[<?php
+$color1 = new Zend_Pdf_Color_Html('#3366FF');
+$color2 = new Zend_Pdf_Color_Html('silver');
+$color3 = new Zend_Pdf_Color_Html('forestgreen');]]>
+        </programlisting>
+    </sect2>
+
+
+    <sect2 id="zend.pdf.drawing.shape-drawing">
+        <title>Desenhando Formas.</title>
+        <para>
+        Todas as operações de desenho podem ser feitas no contexto de uma página PDF.
+        </para>
+        <para>
+        A classe <code>Zend_Pdf_Page</code> provê um conjunto de formas básicas para desenho:
+        </para>
+        <programlisting role="php"><![CDATA[<?php
+/**
+ * Draw a line from x1,y1 to x2,y2.
+ *
+ * @param float $x1
+ * @param float $y1
+ * @param float $x2
+ * @param float $y2
+ */
+public function drawLine($x1, $y1, $x2, $y2);]]>
+        </programlisting>
+        <programlisting role="php"><![CDATA[<?php
+/**
+ * Draw a rectangle.
+ *
+ * Fill types:
+ * Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE - fill rectangle and stroke (default)
+ * Zend_Pdf_Page::SHAPE_DRAW_STROKE      - stroke rectangle
+ * Zend_Pdf_Page::SHAPE_DRAW_FILL        - fill rectangle
+ *
+ * @param float $x1
+ * @param float $y1
+ * @param float $x2
+ * @param float $y2
+ * @param integer $fillType
+ */
+public function drawRectangle($x1, $y1, $x2, $y2, $fillType = Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE);]]>
+        </programlisting>
+        <programlisting role="php"><![CDATA[<?php
+/**
+ * Draw a polygon.
+ *
+ * If $fillType is Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE or Zend_Pdf_Page::SHAPE_DRAW_FILL,
+ * then polygon is automatically closed.
+ * See detailed description of these methods in a PDF documentation
+ * (section 4.4.2 Path painting Operators, Filling)
+ *
+ * @param array $x  - array of float (the X co-ordinates of the vertices)
+ * @param array $y  - array of float (the Y co-ordinates of the vertices)
+ * @param integer $fillType
+ * @param integer $fillMethod
+ */
+public function drawPolygon($x, $y,
+                            $fillType = Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE,
+                            $fillMethod = Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING);]]>
+        </programlisting>
+        <programlisting role="php"><![CDATA[<?php
+/**
+ * Draw a circle centered on x, y with a radius of radius.
+ *
+ * Angles are specified in radians
+ *
+ * Method signatures:
+ * drawCircle($x, $y, $radius);
+ * drawCircle($x, $y, $radius, $fillType);
+ * drawCircle($x, $y, $radius, $startAngle, $endAngle);
+ * drawCircle($x, $y, $radius, $startAngle, $endAngle, $fillType);
+ *
+ *
+ * It's not a really circle, because PDF supports only cubic Bezier curves.
+ * But very good approximation.
+ * It differs from a real circle on a maximum 0.00026 radiuses
+ * (at PI/8, 3*PI/8, 5*PI/8, 7*PI/8, 9*PI/8, 11*PI/8, 13*PI/8 and 15*PI/8 angles).
+ * At 0, PI/4, PI/2, 3*PI/4, PI, 5*PI/4, 3*PI/2 and 7*PI/4 it's exactly a tangent to a circle.
+ *
+ * @param float $x
+ * @param float $y
+ * @param float $radius
+ * @param mixed $param4
+ * @param mixed $param5
+ * @param mixed $param6
+ */
+public function  drawCircle($x, $y, $radius, $param4 = null, $param5 = null, $param6 = null);]]>
+        </programlisting>
+        <programlisting role="php"><![CDATA[<?php
+/**
+ * Draw an ellipse inside the specified rectangle.
+ *
+ * Method signatures:
+ * drawEllipse($x1, $y1, $x2, $y2);
+ * drawEllipse($x1, $y1, $x2, $y2, $fillType);
+ * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle);
+ * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle, $fillType);
+ *
+ * Angles are specified in radians
+ *
+ * @param float $x1
+ * @param float $y1
+ * @param float $x2
+ * @param float $y2
+ * @param mixed $param5
+ * @param mixed $param6
+ * @param mixed $param7
+ */
+public function drawEllipse($x1, $y1, $x2, $y2, $param5 = null, $param6 = null, $param7 = null);]]>
+        </programlisting>
+    </sect2>
+
+    <sect2 id="zend.pdf.drawing.text-drawing">
+        <title>Desenhando Texto.</title>
+        <para>
+        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).
+        </para>
+        <programlisting role="php"><![CDATA[<?php
+/**
+ * Draw a line of text at the specified position.
+ *
+ * @param string $text
+ * @param float $x
+ * @param float $y
+ * @param string $charEncoding (optional) Character encoding of source text.
+ *   Defaults to current locale.
+ * @throws Zend_Pdf_Exception
+ */
+public function drawText($text, $x, $y, $charEncoding = '');]]>
+        </programlisting>
+        <example id="zend.pdf.drawing.text-drawing.example-1">
+            <title>Desenhar um texo na página.</title>
+            <programlisting role="php"><![CDATA[<?php
+...
+$pdfPage->drawText('Hello world!', 72, 720);
+...]]>
+            </programlisting>
+        </example>
+        <para>
+        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        <code><ulink url="http://www.php.net/manual/function.iconv.php">iconv()</ulink></code> do PHP:
+        </para>
+        <example id="zend.pdf.drawing.text-drawing.example-2">
+            <title>Desenhar uma string codificada em UTF-8 em uma página.</title>
+            <programlisting role="php"><![CDATA[<?php
+...
+// Read a UTF-8-encoded string from disk
+$unicodeString = fread($fp, 1024);
+
+// Draw the string on the page
+$pdfPage->drawText($unicodeString, 72, 720, 'UTF-8');
+...]]>
+            </programlisting>
+        </example>
+    </sect2>
+
+    <sect2 id="zend.pdf.drawing.using-fonts">
+        <title>Using fonts.</title>
+        <para>
+        O método <code>Zend_Pdf_Page::drawText()</code> usa a fonte atual da página, que é configurada através do
+        método <code>Zend_Pdf_Page::setFont()</code>:
+        </para>
+        <programlisting role="php"><![CDATA[<?php
+/**
+ * Set current font.
+ *
+ * @param Zend_Pdf_Resource_Font $font
+ * @param float $fontSize
+ */
+public function setFont(Zend_Pdf_Resource_Font $font, $fontSize);]]>
+        </programlisting>
+        <para>
+        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.
+        </para>
+        <para>
+        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):
+        <code>Zend_Pdf_Font::fontWithName($fontName)</code> para as 14 fontes padrão ou
+        <code>end_Pdf_Font::fontWithPath($filePath)</code> para fontes personalizadas.
+        </para>
+        <example id="zend.pdf.drawing.using-fonts.example-1">
+            <title>Criar uma fonte padrão.</title>
+            <programlisting role="php"><![CDATA[<?php
+...
+// Create new font
+$font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA);
+
+// Apply font
+$pdfPage->setFont($font, 36);
+...]]>
+            </programlisting>
+        </example>
+        <para>
+        As constantes para as 14 fontes PDF padrão são definidas na classe <code>Zend_Pdf_Font</code>:
+        <itemizedlist>
+            <listitem>
+                <para>Zend_Pdf_Font::FONT_COURIER</para>
+            </listitem>
+            <listitem>
+                <para>Zend_Pdf_Font::FONT_COURIER_BOLD</para>
+            </listitem>
+            <listitem>
+                <para>Zend_Pdf_Font::FONT_COURIER_ITALIC</para>
+            </listitem>
+            <listitem>
+                <para>Zend_Pdf_Font::FONT_COURIER_BOLD_ITALIC</para>
+            </listitem>
+            <listitem>
+                <para>Zend_Pdf_Font::FONT_TIMES</para>
+            </listitem>
+            <listitem>
+                <para>Zend_Pdf_Font::FONT_TIMES_BOLD</para>
+            </listitem>
+            <listitem>
+                <para>Zend_Pdf_Font::FONT_TIMES_ITALIC</para>
+            </listitem>
+            <listitem>
+                <para>Zend_Pdf_Font::FONT_TIMES_BOLD_ITALIC</para>
+            </listitem>
+            <listitem>
+                <para>Zend_Pdf_Font::FONT_HELVETICA</para>
+            </listitem>
+            <listitem>
+                <para>Zend_Pdf_Font::FONT_HELVETICA_BOLD</para>
+            </listitem>
+            <listitem>
+                <para>Zend_Pdf_Font::FONT_HELVETICA_ITALIC</para>
+            </listitem>
+            <listitem>
+                <para>Zend_Pdf_Font::FONT_HELVETICA_BOLD_ITALIC</para>
+            </listitem>
+            <listitem>
+                <para>Zend_Pdf_Font::FONT_SYMBOL</para>
+            </listitem>
+            <listitem>
+                <para>Zend_Pdf_Font::FONT_ZAPFDINGBATS</para>
+            </listitem>
+        </itemizedlist>
+        </para>
+        <para>
+        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>
+        <para>
+        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:
+        </para>
+        <example id="zend.pdf.drawing.using-fonts.example-2">
+            <title>Criar uma fonte TrueType.</title>
+            <programlisting role="php"><![CDATA[<?php
+...
+// Create new font
+$goodDogCoolFont = Zend_Pdf_Font::fontWithPath('/path/to/GOODDC__.TTF');
+
+// Apply font
+$pdfPage->setFont($goodDogCoolFont, 36);
+...]]>
+            </programlisting>
+        </example>
+        <para>
+        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:
+        </para>
+        <example id="zend.pdf.drawing.using-fonts.example-3">
+            <title>Criar uma fonte TrueType, mas não embarca-la no documento PDF.</title>
+            <programlisting role="php"><![CDATA[<?php
+...
+// Create new font
+$goodDogCoolFont = Zend_Pdf_Font::fontWithPath('/path/to/GOODDC__.TTF',
+                                               Zend_Pdf_Font::EMBED_DONT_EMBED);
+
+// Apply font
+$pdfPage->setFont($goodDogCoolFont, 36);
+...]]>
+            </programlisting>
+        </example>
+        <para>
+        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.
+        </para>
+        <para>
+        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.
+        </para>
+        <para>
+        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:
+        </para>
+        <example id="zend.pdf.drawing.using-fonts.example-4">
+            <title>Não lançar uma exceção para fontes que não podem ser embarcadas.</title>
+            <programlisting role="php"><![CDATA[<?php
+...
+$font = Zend_Pdf_Font::fontWithPath('/path/to/unEmbeddableFont.ttf',
+                                    Zend_Pdf_Font::EMBED_SUPPRESS_EMBED_EXCEPTION);
+...]]>
+            </programlisting>
+        </example>
+        <para>
+        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.
+        </para>
+        <para>
+        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:
+        </para>
+        <example id="zend.pdf.drawing.using-fonts.example-5">
+            <title>Não comprimir uma fonte embarcada.</title>
+            <programlisting role="php"><![CDATA[<?php
+...
+$font = Zend_Pdf_Font::fontWithPath('/path/to/someReallyBigFont.ttf',
+                                    Zend_Pdf_Font::EMBED_DONT_COMPRESS);
+...]]>
+            </programlisting>
+        </example>
+        <para>
+        Finalmente, quando necessário, você pode combinar as opções de embarque usando o operador binário OR:
+        </para>
+        <example id="zend.pdf.drawing.using-fonts.example-6">
+            <title>Combinando opções de embarque de fonte.</title>
+            <programlisting role="php"><![CDATA[<?php
+...
+$font = Zend_Pdf_Font::fontWithPath($someUserSelectedFontPath,
+                                    (Zend_Pdf_Font::EMBED_SUPPRESS_EMBED_EXCEPTION |
+                                     Zend_Pdf_Font::EMBED_DONT_COMPRESS));
+...]]>
+            </programlisting>
+        </example>
+    </sect2>
+
+    <sect2 id="zend.pdf.drawing.image-drawing">
+        <title>Desenhando Imagens.</title>
+        <para>
+        A classe <code>Zend_Pdf_Page</code> fornece o método drawImage() para o desenho de imagens:
+        </para>
+        <programlisting role="php"><![CDATA[<?php
+/**
+ * Draw an image at the specified position on the page.
+ *
+ * @param Zend_Pdf_Resource_Image $image
+ * @param float $x1
+ * @param float $y1
+ * @param float $x2
+ * @param float $y2
+ */
+public function drawImage(Zend_Pdf_Resource_Image $image, $x1, $y1, $x2, $y2);]]>
+        </programlisting>
+        <para>
+        Objetos de imagem devem ser criaos com o método <code>Zend_Pdf_Image::imageWithPath($filePath)</code> (imagens JPG, PNG e
+        TIFF são suportadas agora):
+        </para>
+        <example id="zend.pdf.drawing.image-drawing.example-1">
+            <title>Desenhando imagens.</title>
+            <programlisting role="php"><![CDATA[<?php
+...
+// load image
+$image = Zend_Pdf_Image::imageWithPath('my_image.jpg');
+
+$pdfPage->drawImage($image, 100, 100, 400, 300);
+...]]>
+            </programlisting>
+        </example>
+
+        <para>
+            <emphasis>Importante! O suporte a JPEG requer que a extensão PHP GD esteja configurada.</emphasis>
+            <emphasis>Importante! O suporte a PNG requer que extensão ZLIB esteja configurada para trabalhar com
+            imagens com canal Alpha.</emphasis>
+        </para>
+        <para>
+            Consulte a documentação PHP informações detalhadas
+            (<ulink url="http://www.php.net/manual/en/ref.image.php">http://www.php.net/manual/en/ref.image.php</ulink>).
+            (<ulink url="http://www.php.net/manual/en/ref.zlib.php">http://www.php.net/manual/en/ref.zlib.php</ulink>).
+        </para>
+    </sect2>
+
+    <sect2 id="zend.pdf.drawing.line-drawing-style">
+        <title>Estilo de desenho de linhas.</title>
+        <para>
+        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 <code>Zend_Pdf_Page</code>:
+        </para>
+        <programlisting role="php"><![CDATA[<?php
+/** Set line color. */
+public function setLineColor(Zend_Pdf_Color $color);
+
+/** Set line width. */
+public function setLineWidth(float $width);
+
+/**
+ * Set line dashing pattern.
+ *
+ * Pattern is an array of floats: array(on_length, off_length, on_length, off_length, ...)
+ * Phase is shift from the beginning of line.
+ *
+ * @param array $pattern
+ * @param array $phase
+ */
+public function setLineDashingPattern($pattern, $phase = 0);]]>
+        </programlisting>
+    </sect2>
+
+    <sect2 id="zend.pdf.drawing.fill-style">
+        <title>Estilo de preenchimento.</title>
+        <para>
+        Os métodos <code>Zend_Pdf_Page::drawRectangle()</code>, <code>Zend_Pdf_Page::drawPoligon()</code>,
+        <code>Zend_Pdf_Page::drawCircle()</code> e <code>Zend_Pdf_Page::drawEllipse()</code> usam o argumento
+        <code>$fillType</code> como um parâmetro opcional. Ele pode ser:
+        </para>
+
+        <itemizedlist>
+            <listitem>
+                <para>Zend_Pdf_Page::SHAPE_DRAW_STROKE - pincelamento</para>
+            </listitem>
+            <listitem>
+                <para>Zend_Pdf_Page::SHAPE_DRAW_FILL - apenas preenchimento</para>
+            </listitem>
+            <listitem>
+                <para>Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE - preenchimento e pincelamento (comportamento padrão)</para>
+            </listitem>
+        </itemizedlist>
+
+        <para>
+        Os métodos <code>Zend_Pdf_Page::drawPoligon()</code> também recebem um parâmetro adicional <code>$fillMethod</code>:
+        </para>
+        <itemizedlist>
+            <listitem>
+                <para>Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING (comportamento padrão)</para>
+                <para>
+                A <citetitle>PDF reference</citetitle> escreve esta regra como:
+                <blockquote>
+                    <para>
+                    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.
+                </para>
+            </blockquote>
+            </para>
+            </listitem>
+            <listitem>
+                <para>Zend_Pdf_Page::FILL_METHOD_EVEN_ODD</para>
+                <para>
+                <citetitle>PDF reference</citetitle> describes this rule as follows:
+                <blockquote>
+                    <para>
+                    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.
+                    </para>
+                </blockquote>
+            </para>
+            </listitem>
+        </itemizedlist>
+    </sect2>
+
+    <sect2 id="zend.pdf.drawing.rotations">
+        <title>Rotações.</title>
+        <para>
+        A página PDF pode ser rotacionada antes do uso de qualquer operação de desenho.
+        Isso pode ser feito pelo método <code>Zend_Pdf_Page::rotate()</code>:
+        </para>
+        <programlisting role="php"><![CDATA[<?php
+/**
+ * Rotate the page around ($x, $y) point by specified angle (in radians).
+ *
+ * @param float $angle
+ */
+public function rotate($x, $y, $angle);]]>
+        </programlisting>
+    </sect2>
+
+    <sect2 id="zend.pdf.drawing.save-restore">
+        <title>Salvar/restaurar estados gráficos.</title>
+        <para>
+        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.
+        </para>
+        <para>
+        Existem dois métodos na classe  <code>Zend_Pdf_Page</code> para essas operações:
+        </para>
+        <programlisting role="php"><![CDATA[<?php
+/**
+ * Save the graphics state of this page.
+ * This takes a snapshot of the currently applied style, position, clipping area and
+ * any rotation/translation/scaling that has been applied.
+ */
+public function saveGS();
+
+/**
+ * Restore the graphics state that was saved with the last call to saveGS().
+ */
+public function restoreGS();]]>
+        </programlisting>
+    </sect2>
+
+    <sect2 id="zend.pdf.drawing.clipping">
+        <title>Recorte de área de desenho .</title>
+        <para>
+        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.
+        </para>
+        <para>
+        A classe <code>Zend_Pdf_Page</code> fornece um conjunto de métodos para operações de recorte.
+        </para>
+        <programlisting role="php"><![CDATA[<?php
+/**
+ * Intersect current clipping area with a rectangle.
+ *
+ * @param float $x1
+ * @param float $y1
+ * @param float $x2
+ * @param float $y2
+ */
+public function clipRectangle($x1, $y1, $x2, $y2);]]>
+        </programlisting>
+        <programlisting role="php"><![CDATA[<?php
+/**
+ * Intersect current clipping area with a polygon.
+ *
+ * @param array $x  - array of float (the X co-ordinates of the vertices)
+ * @param array $y  - array of float (the Y co-ordinates of the vertices)
+ * @param integer $fillMethod
+ */
+public function clipPolygon($x, $y, $fillMethod = Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING);]]>
+        </programlisting>
+        <programlisting role="php"><![CDATA[<?php
+/**
+ * Intersect current clipping area with a circle.
+ *
+ * @param float $x
+ * @param float $y
+ * @param float $radius
+ * @param float $startAngle
+ * @param float $endAngle
+ */
+public function clipCircle($x, $y, $radius, $startAngle = null, $endAngle = null);]]>
+        </programlisting>
+        <programlisting role="php"><![CDATA[<?php
+/**
+ * Intersect current clipping area with an ellipse.
+ *
+ * Method signatures:
+ * drawEllipse($x1, $y1, $x2, $y2);
+ * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle);
+ *
+ * @todo process special cases with $x2-$x1 == 0 or $y2-$y1 == 0
+ *
+ * @param float $x1
+ * @param float $y1
+ * @param float $x2
+ * @param float $y2
+ * @param float $startAngle
+ * @param float $endAngle
+ */
+public function clipEllipse($x1, $y1, $x2, $y2, $startAngle = null, $endAngle = null);]]>
+        </programlisting>
+    </sect2>
+
+    <sect2 id="zend.pdf.drawing.styles">
+        <title>Estilos.</title>
+        <para>
+        A classe <code>Zend_Pdf_Style</code> fornece funcionalidades de estilo.
+        </para>
+        <para>
+        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:
+        </para>
+        <programlisting role="php"><![CDATA[<?php
+/**
+ * Set the style to use for future drawing operations on this page
+ *
+ * @param Zend_Pdf_Style $style
+ */
+public function setStyle(Zend_Pdf_Style $style);
+
+/**
+ * Return the style, applied to the page.
+ *
+ * @return Zend_Pdf_Style|null
+ */
+public function getStyle();]]>
+        </programlisting>
+
+        <para>
+        A classe <code>Zend_Pdf_Style</code> fornece um conjunto de métodos para configurar ou recuperar
+        diferentes parâmetros do estado gráfico:
+        </para>
+        <programlisting role="php"><![CDATA[<?php
+/**
+ * Set line color.
+ *
+ * @param Zend_Pdf_Color $color
+ */
+public function setLineColor(Zend_Pdf_Color $color);]]>
+        </programlisting>
+        <programlisting role="php"><![CDATA[<?php
+/**
+ * Get line color.
+ *
+ * @return Zend_Pdf_Color|null
+ */
+public function getLineColor();]]>
+        </programlisting>
+        <programlisting role="php"><![CDATA[<?php
+/**
+ * Set line width.
+ *
+ * @param float $width
+ */
+public function setLineWidth($width);]]>
+        </programlisting>
+        <programlisting role="php"><![CDATA[<?php
+/**
+ * Get line width.
+ *
+ * @return float
+ */
+public function getLineWidth();]]>
+        </programlisting>
+        <programlisting role="php"><![CDATA[<?php
+/**
+ * Set line dashing pattern
+ *
+ * @param array $pattern
+ * @param float $phase
+ */
+public function setLineDashingPattern($pattern, $phase = 0);]]>
+        </programlisting>
+        <programlisting role="php"><![CDATA[<?php
+/**
+ * Get line dashing pattern
+ *
+ * @return array
+ */
+public function getLineDashingPattern();]]>
+        </programlisting>
+        <programlisting role="php"><![CDATA[<?php
+/**
+ * Get line dashing phase
+ *
+ * @return float
+ */
+public function getLineDashingPhase();]]>
+        </programlisting>
+        <programlisting role="php"><![CDATA[<?php
+/**
+ * Set fill color.
+ *
+ * @param Zend_Pdf_Color $color
+ */
+public function setFillColor(Zend_Pdf_Color $color);]]>
+        </programlisting>
+        <programlisting role="php"><![CDATA[<?php
+/**
+ * Get fill color.
+ *
+ * @return Zend_Pdf_Color|null
+ */
+public function getFillColor();]]>
+        </programlisting>
+        <programlisting role="php"><![CDATA[<?php
+/**
+ * Set current font.
+ *
+ * @param Zend_Pdf_Resource_Font $font
+ * @param float $fontSize
+ */
+public function setFont(Zend_Pdf_Resource_Font $font, $fontSize);]]>
+        </programlisting>
+        <programlisting role="php"><![CDATA[<?php
+/**
+ * Modify current font size
+ *
+ * @param float $fontSize
+ */
+public function setFontSize($fontSize);]]>
+        </programlisting>
+        <programlisting role="php"><![CDATA[<?php
+/**
+ * Get current font.
+ *
+ * @return Zend_Pdf_Resource_Font $font
+ */
+public function getFont();]]>
+        </programlisting>
+        <programlisting role="php"><![CDATA[<?php
+/**
+ * Get current font size
+ *
+ * @return float $fontSize
+ */
+public function getFontSize();]]>
+        </programlisting>
+    </sect2>
+
+</sect1>
+<!--
+vim:se ts=4 sw=4 et:
+-->

+ 66 - 132
documentation/manual/pt-br/module_specs/Zend_Pdf-Introduction.xml

@@ -1,133 +1,67 @@
-<sect1 id="zend.pdf.introduction">
-
-    <!-- @todo review and revise upon completion of refactoring -->
-
-    <title>Introdução.</title>
-
-    <para>
-
-    O módulo Zend_Pdf é um motor para manipulação de PDF (Portable Document Format) totalmente escrito em PHP 5.
-
-    Ele pode carregar documentos existentes, criar novos documentos, modificar e salvar documentos modificados.
-
-    Dessa forma, este módulo pode ajudar qualquer aplicação baseada em PHP a preparar dinamicamente documentos
-
-    em PDF através da modificação de um template já existente ou pela geração de um documento a partir de rabiscos.
-
-
-
-    O módulo Zend_Pdf dá suporte às seguintes características:
-
-    <itemizedlist>
-
-        <listitem>
-
-            <para>
-
-            Criação de um novo documento ou carregar um já existente.
-
-            <footnote>
-
-                <para>
-
-                Documentos PDF V1.4 (Acrobat 5) agora tem suporte para carga (loading).
-
-                </para>
-
-            </footnote>
-
-            </para>
-
-        </listitem>
-
-        <listitem>
-
-            <para>
-
-            Recuperação de revisão específica do documento.
-
-            </para>
-
-        </listitem>
-
-        <listitem>
-
-            <para>
-
-            Manipulação das páginas do documento. Mudança de ordem, adição de novas páginas e remoção de páginas do documento.
-
-            </para>
-
-        </listitem>
-
-        <listitem>
-
-            <para>
-
-            Diferentes formas primitivas de desenho (linhas, retângulos, polígonos, círculos, elipses e áreas).
-
-            </para>
-
-        </listitem>
-
-        <listitem>
-
-            <para>
-
-            Desenho de texto usando qualquer uma das 14 fontes padrões (built-in) ou suas próprias fontes TrueType personalizadas.
-
-            </para>
-
-        </listitem>
-
-        <listitem>
-
-            <para>
-
-            Rotações.
-
-            </para>
-
-        </listitem>
-
-        <listitem>
-
-            <para>
-
-            Desenho de imagens.
-
-            <footnote>
-
-                <para>
-
-                Imagens nos formatos JPG, PNG [até 8bit por canal+Alpha] e TIFF são suportadas.
-
-                </para>
-
-            </footnote>
-
-            </para>
-
-        </listitem>
-
-        <listitem>
-
-            <para>
-
-             Atualização incremental dos arquivos PFD.
-
-            </para>
-
-        </listitem>
-
-    </itemizedlist>
-
-    </para>
-
-</sect1>
-
-<!--
-
-vim:se ts=4 sw=4 et:
-
+<sect1 id="zend.pdf.introduction">
+    <!-- @todo review and revise upon completion of refactoring -->
+    <title>Introdução.</title>
+    <para>
+    O módulo Zend_Pdf é um motor para manipulação de PDF (Portable Document Format) totalmente escrito em PHP 5.
+    Ele pode carregar documentos existentes, criar novos documentos, modificar e salvar documentos modificados.
+    Dessa forma, este módulo pode ajudar qualquer aplicação baseada em PHP a preparar dinamicamente documentos
+    em PDF através da modificação de um template já existente ou pela geração de um documento a partir de rabiscos.
+
+    O módulo Zend_Pdf dá suporte às seguintes características:
+    <itemizedlist>
+        <listitem>
+            <para>
+            Criação de um novo documento ou carregar um já existente.
+            <footnote>
+                <para>
+                Documentos PDF V1.4 (Acrobat 5) agora tem suporte para carga (loading).
+                </para>
+            </footnote>
+            </para>
+        </listitem>
+        <listitem>
+            <para>
+            Recuperação de revisão específica do documento.
+            </para>
+        </listitem>
+        <listitem>
+            <para>
+            Manipulação das páginas do documento. Mudança de ordem, adição de novas páginas e remoção de páginas do documento.
+            </para>
+        </listitem>
+        <listitem>
+            <para>
+            Diferentes formas primitivas de desenho (linhas, retângulos, polígonos, círculos, elipses e áreas).
+            </para>
+        </listitem>
+        <listitem>
+            <para>
+            Desenho de texto usando qualquer uma das 14 fontes padrões (built-in) ou suas próprias fontes TrueType personalizadas.
+            </para>
+        </listitem>
+        <listitem>
+            <para>
+            Rotações.
+            </para>
+        </listitem>
+        <listitem>
+            <para>
+            Desenho de imagens.
+            <footnote>
+                <para>
+                Imagens nos formatos JPG, PNG [até 8bit por canal+Alpha] e TIFF são suportadas.
+                </para>
+            </footnote>
+            </para>
+        </listitem>
+        <listitem>
+            <para>
+             Atualização incremental dos arquivos PFD.
+            </para>
+        </listitem>
+    </itemizedlist>
+    </para>
+</sect1>
+<!--
+vim:se ts=4 sw=4 et:
 -->

+ 120 - 240
documentation/manual/pt-br/module_specs/Zend_Pdf-Pages.xml

@@ -1,240 +1,120 @@
-<sect1 id="zend.pdf.pages">
-
-    <title>Document pages.</title>
-
-    <sect2 id="zend.pdf.pages.creation">
-
-        <title>Page creation.</title>
-
-        <para>
-
-            A abstração da página de um documento PDF é representada pela classe <code>Zend_Pdf_Page</code>.
-
-        </para>
-
-
-
-        <para>
-
-            Páginas PDF podem ser carregadas de um PDF existente, ou criadas.
-
-        </para>
-
-
-
-        <para>
-
-            Uma nova página pode ser obtida através da criação de um novo objeto <code>Zend_Pdf_Page</code> ou pela chamada
-
-            ao método <code>Zend_Pdf::newPage()</code>, que retorna um objeto <code>Zend_Pdf_Page</code>. A diferença é que
-
-            o método <code>Zend_Pdf::newPage()</code> cria uma nova página já anexada ao documento. Isso faz com que,
-
-            diferentemente das páginas não anexadas, a página criada por este método não possa ser usada em outros documentos
-
-            PDF. Entretanto, ela tem uma performance um pouco melhor.
-
-            <footnote>
-
-                <para>
-
-                Esta é uma limitação da versão 1.0 do módulo Zend_Pdf. Esta limitação será eliminada nas versões futuras, mas
-
-                páginas não anexadas sempre terão um desempenho melhor no compartilhamento de páginas entre diversos
-
-                documentos.
-
-                </para>
-
-            </footnote>. A escolha sobre qual abordagem utilizar é sua.
-
-        </para>
-
-
-
-        <para>
-
-        O método <code>Zend_Pdf::newPage()</code> e o construtor <code>Zend_Pdf_Page</code> recebem o mesmo conjunto de
-
-        parâmetros de definição do tamanho da página. Os parâmetros são ou o tamanho da página ($x, $y) em pontos (1/72 inch),
-
-        ou uma constante prédefinida, que é tratada como um tipo de página:
-
-            <itemizedlist>
-
-                <listitem>
-
-                    <para>Zend_Pdf_Page::SIZE_A4</para>
-
-                </listitem>
-
-                <listitem>
-
-                    <para>Zend_Pdf_Page::SIZE_A4_LANDSCAPE</para>
-
-                </listitem>
-
-                <listitem>
-
-                    <para>Zend_Pdf_Page::SIZE_LETTER</para>
-
-                </listitem>
-
-                <listitem>
-
-                    <para>Zend_Pdf_Page::SIZE_LETTER_LANDSCAPE</para>
-
-                </listitem>
-
-            </itemizedlist>
-
-        </para>
-
-
-
-        <para>
-
-            As páginas de um documento são armazenadas na variável pública <code>$pages</code> da classe <code>Zend_Pdf</code>.
-
-            Este atributo é sempre um array de objetos <code>Zend_Pdf_Page</code>. Ele define completamente o conjunto e a ordem
-
-            das páginas do documento e pode ser manipulado como qualquer array:
-
-        </para>
-
-
-
-        <example id="zend.pdf.pages.example-1">
-
-            <title>Gerenciamento de páginas de documentos PDF.</title>
-
-            <programlisting role="php"><![CDATA[<?php
-
-    ...
-
-    // Reverse page order
-
-    $pdf->pages = array_reverse($pdf->pages);
-
-    ...
-
-    // Add new page
-
-    $pdf->pages[] = new Zend_Pdf_Page(Zend_Pdf_Page::SIZE_A4);
-
-    // Add new page
-
-    $pdf->pages[] = $pdf->newPage(Zend_Pdf_Page::SIZE_A4);
-
-
-
-    // Remove specified page.
-
-    unset($pdf->pages[$id]);
-
-
-
-    ...]]>
-
-            </programlisting>
-
-        </example>
-
-    </sect2>
-
-
-
-    <sect2 id="zend.pdf.pages.cloning">
-
-        <title>Clonde de Páginas.</title>
-
-        <para>
-
-            Páginas PDF podem ser clonadas através da criação de um novo objeto <code>Zend_Pdf_Page</code> com uma página
-
-            já existente como parâmetro:
-
-        </para>
-
-
-
-        <example id="zend.pdf.pages.example-2">
-
-            <title>Clonando páginas existentes.</title>
-
-            <programlisting role="php"><![CDATA[<?php
-
-    ...
-
-    // Store template page in a separate variable
-
-    $template = $pdf->pages[$templatePageIndex];
-
-    ...
-
-    // Add new page
-
-    $page1 = new Zend_Pdf_Page($template);
-
-    $pdf->pages[] = $page1;
-
-    ...
-
-
-
-    // Add another page
-
-    $page2 = new Zend_Pdf_Page($template);
-
-    $pdf->pages[] = $page2;
-
-    ...
-
-
-
-    // Remove source template page from the documents.
-
-    unset($pdf->pages[$templatePageIndex]);
-
-
-
-    ...]]>
-
-            </programlisting>
-
-        </example>
-
-
-
-        <para>
-
-            É útil caso você precisa criar diversas páginas usando um template.
-
-        </para>
-
-
-
-        <caution>
-
-            <para>
-
-               Importante! Uma página clonada compartilha alguns recursos do PDF com a página template, então ela só pode
-
-               ser usada no mesmo documento como uma página template. Um documento modificado pode ser salvo como um novo
-
-               documento.
-
-            </para>
-
-        </caution>
-
-    </sect2>
-
-</sect1>
-
-<!--
-
-vim:se ts=4 sw=4 et:
-
--->
-
+<sect1 id="zend.pdf.pages">
+    <title>Document pages.</title>
+    <sect2 id="zend.pdf.pages.creation">
+        <title>Page creation.</title>
+        <para>
+            A abstração da página de um documento PDF é representada pela classe <code>Zend_Pdf_Page</code>.
+        </para>
+
+        <para>
+            Páginas PDF podem ser carregadas de um PDF existente, ou criadas.
+        </para>
+
+        <para>
+            Uma nova página pode ser obtida através da criação de um novo objeto <code>Zend_Pdf_Page</code> ou pela chamada
+            ao método <code>Zend_Pdf::newPage()</code>, que retorna um objeto <code>Zend_Pdf_Page</code>. A diferença é que
+            o método <code>Zend_Pdf::newPage()</code> cria uma nova página já anexada ao documento. Isso faz com que,
+            diferentemente das páginas não anexadas, a página criada por este método não possa ser usada em outros documentos
+            PDF. Entretanto, ela tem uma performance um pouco melhor.
+            <footnote>
+                <para>
+                Esta é uma limitação da versão 1.0 do módulo Zend_Pdf. Esta limitação será eliminada nas versões futuras, mas
+                páginas não anexadas sempre terão um desempenho melhor no compartilhamento de páginas entre diversos
+                documentos.
+                </para>
+            </footnote>. A escolha sobre qual abordagem utilizar é sua.
+        </para>
+
+        <para>
+        O método <code>Zend_Pdf::newPage()</code> e o construtor <code>Zend_Pdf_Page</code> recebem o mesmo conjunto de
+        parâmetros de definição do tamanho da página. Os parâmetros são ou o tamanho da página ($x, $y) em pontos (1/72 inch),
+        ou uma constante prédefinida, que é tratada como um tipo de página:
+            <itemizedlist>
+                <listitem>
+                    <para>Zend_Pdf_Page::SIZE_A4</para>
+                </listitem>
+                <listitem>
+                    <para>Zend_Pdf_Page::SIZE_A4_LANDSCAPE</para>
+                </listitem>
+                <listitem>
+                    <para>Zend_Pdf_Page::SIZE_LETTER</para>
+                </listitem>
+                <listitem>
+                    <para>Zend_Pdf_Page::SIZE_LETTER_LANDSCAPE</para>
+                </listitem>
+            </itemizedlist>
+        </para>
+
+        <para>
+            As páginas de um documento são armazenadas na variável pública <code>$pages</code> da classe <code>Zend_Pdf</code>.
+            Este atributo é sempre um array de objetos <code>Zend_Pdf_Page</code>. Ele define completamente o conjunto e a ordem
+            das páginas do documento e pode ser manipulado como qualquer array:
+        </para>
+
+        <example id="zend.pdf.pages.example-1">
+            <title>Gerenciamento de páginas de documentos PDF.</title>
+            <programlisting role="php"><![CDATA[<?php
+    ...
+    // Reverse page order
+    $pdf->pages = array_reverse($pdf->pages);
+    ...
+    // Add new page
+    $pdf->pages[] = new Zend_Pdf_Page(Zend_Pdf_Page::SIZE_A4);
+    // Add new page
+    $pdf->pages[] = $pdf->newPage(Zend_Pdf_Page::SIZE_A4);
+
+    // Remove specified page.
+    unset($pdf->pages[$id]);
+
+    ...]]>
+            </programlisting>
+        </example>
+    </sect2>
+
+    <sect2 id="zend.pdf.pages.cloning">
+        <title>Clonde de Páginas.</title>
+        <para>
+            Páginas PDF podem ser clonadas através da criação de um novo objeto <code>Zend_Pdf_Page</code> com uma página
+            já existente como parâmetro:
+        </para>
+
+        <example id="zend.pdf.pages.example-2">
+            <title>Clonando páginas existentes.</title>
+            <programlisting role="php"><![CDATA[<?php
+    ...
+    // Store template page in a separate variable
+    $template = $pdf->pages[$templatePageIndex];
+    ...
+    // Add new page
+    $page1 = new Zend_Pdf_Page($template);
+    $pdf->pages[] = $page1;
+    ...
+
+    // Add another page
+    $page2 = new Zend_Pdf_Page($template);
+    $pdf->pages[] = $page2;
+    ...
+
+    // Remove source template page from the documents.
+    unset($pdf->pages[$templatePageIndex]);
+
+    ...]]>
+            </programlisting>
+        </example>
+
+        <para>
+            É útil caso você precisa criar diversas páginas usando um template.
+        </para>
+
+        <caution>
+            <para>
+               Importante! Uma página clonada compartilha alguns recursos do PDF com a página template, então ela só pode
+               ser usada no mesmo documento como uma página template. Um documento modificado pode ser salvo como um novo
+               documento.
+            </para>
+        </caution>
+    </sect2>
+</sect1>
+<!--
+vim:se ts=4 sw=4 et:
+-->

+ 198 - 396
documentation/manual/pt-br/module_specs/Zend_Pdf-Properties.xml

@@ -1,397 +1,199 @@
-<sect1 id="zend.pdf.info">
-
-    <!-- @todo review and revise upon completion of refactoring -->
-
-    <title>Informação do Documento e Metadados.</title>
-
-    <para>
-
-        Um documento PDF deve incluir informações gerais como o título do documento, autor, e datas de criação e modificação.
-
-    </para>
-
-    <para>
-
-        Historicamente essas informações são armazenadas com o uso de estruturas especiais. Esta estrutura está
-
-        disponível para leitura e escrita como um array associativo usando a propriedade pública <code>properties</code>
-
-        dos obejtos Zend_Pdf:
-
-            <programlisting role="php"><![CDATA[<?php
-
-$pdf = Zend_Pdf::load($pdfPath);
-
-
-
-echo $pdf->properties['Title'] . "\n";
-
-echo $pdf->properties['Author'] . "\n";
-
-
-
-$pdf->properties['Title'] = 'New Title.';
-
-$pdf->save($pdfPath);
-
-]]>
-
-            </programlisting>
-
-
-
-    </para>
-
-    <para>
-
-
-
-        As seguintes chaves são definidas pelo padrão PDF v1.4 (Acrobat 5):
-
-
-
-        <itemizedlist>
-
-            <listitem>
-
-                <para>
-
-                    <emphasis>Title</emphasis> - texto, opcional, o título do documento.
-
-                </para>
-
-            </listitem>
-
-            <listitem>
-
-                <para>
-
-                    <emphasis>Author</emphasis> - texto, opcional, o nome da pessoa que criou o documento.
-
-                </para>
-
-            </listitem>
-
-            <listitem>
-
-                <para>
-
-                    <emphasis>Subject</emphasis> - texto, opcional, o assunto do documento.
-
-                </para>
-
-            </listitem>
-
-            <listitem>
-
-                <para>
-
-                    <emphasis>Keywords</emphasis> -  texto, opcional, palavras-chave associadas ao documento.
-
-                </para>
-
-            </listitem>
-
-            <listitem>
-
-                <para>
-
-                    <emphasis>Creator</emphasis> -  texto, opcional, se o documento foi convertido para o formato PDF a
-
-                    partir de outro formato, o nome da aplicação (por exemplo, Adobe FrameMaker®) que criou o documento original.
-
-                </para>
-
-            </listitem>
-
-            <listitem>
-
-                <para>
-
-                    <emphasis>Producer</emphasis> -  texto, opcional, se o documento foi convertido para o formato PDF a
-
-                    partir de outro formato, o nome da aplicação (por exemplo, Adobe Distiller®) que converteu o converteu.
-
-                </para>
-
-            </listitem>
-
-            <listitem>
-
-                <para>
-
-                    <emphasis>CreationDate</emphasis> -  texto, opcional, a data e a hora na qual o documento foi criado, na seguinte forma:
-
-                    "D:YYYYMMDDHHmmSSOHH'mm'", onde:
-
-                    <itemizedlist>
-
-                        <listitem>
-
-                            <para>
-
-                                <emphasis>YYYY</emphasis> é o ano.
-
-                            </para>
-
-                        </listitem>
-
-                        <listitem>
-
-                            <para>
-
-                                <emphasis>MM</emphasis> é o mês.
-
-                            </para>
-
-                        </listitem>
-
-                        <listitem>
-
-                            <para>
-
-                                <emphasis>DD</emphasis> é o dia (01–31).
-
-                            </para>
-
-                        </listitem>
-
-                        <listitem>
-
-                            <para>
-
-                                <emphasis>HH</emphasis> é a hora (00–23).
-
-                            </para>
-
-                        </listitem>
-
-                        <listitem>
-
-                            <para>
-
-                                <emphasis>mm</emphasis> é o minuto(00–59).
-
-                            </para>
-
-                        </listitem>
-
-                        <listitem>
-
-                            <para>
-
-                                <emphasis>SS</emphasis> é o segundo (00–59).
-
-                            </para>
-
-                        </listitem>
-
-                        <listitem>
-
-                            <para>
-
-                                <emphasis>O</emphasis> é a relação da hora local com a hora Universal(UT),
-
-                                denotada pelos caracteres +, −, ou Z (veja abaixo).
-
-                            </para>
-
-                        </listitem>
-
-                        <listitem>
-
-                            <para>
-
-                                <emphasis>HH</emphasis> seguido por ' é o valor absoluto da diferença da hora Universal
-
-                                em horas (00–23).
-
-                            </para>
-
-                        </listitem>
-
-                        <listitem>
-
-                            <para>
-
-                                <emphasis>mm</emphasis>  seguido por ' é o valor absoluto da diferença da hora Universal
-
-                                em minutos (00–59).
-
-                            </para>
-
-                        </listitem>
-
-                    </itemizedlist>
-
-                    O apóstrofo (') depois do HH e do  mm é parte da sintaxe. Todos os campos depois do ano
-
-                    são opcionais . (O préfixo D:, embora também seja opcional, é fortemente recomendado.)
-
-                    Os valores padrões para MM e DD são, para ambos, 01; todos os outros campos numéricos
-
-                    têm valor padrão zero. Um sinal positivo(+) no valor de um campo significa que a hora local
-
-                    é mais tarde que a hora Universal, e um sinal negativo(−) indica que é mais cedo. A letra Z
-
-                    indica que a hora é igual a hora Universal. Se nenhuma informação for específicada, a relação
-
-                    da hora com a hora Universal é considerada desconhecida. Sendo ou não conhecido o fuso
-
-                    horário, o resto da data deve ser especificado em "local time".
-
-                </para>
-
-                <para>
-
-                    Por exemplo, 23 de Dezembro de 1998, 7:52 da noite, U.S. Pacific Standard Time, é
-
-                    representado pela string "D:199812231952−08'00'".
-
-                </para>
-
-            </listitem>
-
-            <listitem>
-
-                <para>
-
-                    <emphasis>ModDate</emphasis> - texto, opcional, a data e a hora da atualização mais recente no
-
-                    documento, na mesma forma de <emphasis>CreationDate</emphasis>.
-
-                </para>
-
-            </listitem>
-
-            <listitem>
-
-                <para>
-
-                    <emphasis>Trapped</emphasis> - boolean, opcional, indica se o documento foi modificado para a
-
-                    inclusão de informações "trapped".
-
-                    <itemizedlist>
-
-                        <listitem>
-
-                            <para>
-
-                                <emphasis>true</emphasis> - The document has been fully trapped; no further trapping is needed.
-
-                            </para>
-
-                        </listitem>
-
-                        <listitem>
-
-                            <para>
-
-                                <emphasis>false</emphasis> - The document has not yet been trapped; any desired trapping must still be done.
-
-                            </para>
-
-                        </listitem>
-
-                        <listitem>
-
-                            <para>
-
-                                <emphasis>null</emphasis> - Either it is unknown whether the document has been
-
-                                trapped or it has been partly but not yet fully trapped; some
-
-                                additional trapping may still be needed.
-
-                            </para>
-
-                        </listitem>
-
-                    </itemizedlist>
-
-                </para>
-
-            </listitem>
-
-        </itemizedlist>
-
-    </para>
-
-
-
-    <para>
-
-        Desde a versão de PDF v 1.6 os metadados podem ser armazenados no documento XML especial anexado
-
-        ao documento PDF
-
-        (XMP - <ulink url="http://www.adobe.com/products/xmp/">Extensible Metadata Platform</ulink>).
-
-    </para>
-
-
-
-    <para>
-
-        Este documento XML pode ser recuperado e anexado ao PDF com os métodos <code>Zend_Pdf::getMetadata()</code> e
-
-        <code>Zend_Pdf::setMetadata($metadata)</code>:
-
-            <programlisting role="php"><![CDATA[<?php
-
-$pdf = Zend_Pdf::load($pdfPath);
-
-$metadata = $pdf->getMetadata();
-
-$metadataDOM = new DOMDocument();
-
-$metadataDOM->loadXML($metadata);
-
-
-
-$xpath = new DOMXPath($metadataDOM);
-
-$pdfPreffixNamespaceURI = $xpath->query('/rdf:RDF/rdf:Description')->item(0)->lookupNamespaceURI('pdf');
-
-$xpath->registerNamespace('pdf', $pdfPreffixNamespaceURI);
-
-
-
-$titleNode = $xpath->query('/rdf:RDF/rdf:Description/pdf:Title')->item(0);
-
-$title = $titleNode->nodeValue;
-
-...
-
-
-
-$titleNode->nodeValue = 'New title';
-
-$pdf->setMetadata($metadataDOM->saveXML());
-
-$pdf->save($pdfPath);
-
-]]>
-
-            </programlisting>
-
-    </para>
-
-
-
-    <para>
-
-        Propriedades comuns são duplicadas na estrutura Info e nos Metadados do documento (se presente).
-
-        Agora é responsabilidade  da aplicação do usuário mantê-los sincronizados.
-
-    </para>
-
-</sect1>
-
-<!--
-
-vim:se ts=4 sw=4 et:
-
+<sect1 id="zend.pdf.info">
+    <!-- @todo review and revise upon completion of refactoring -->
+    <title>Informação do Documento e Metadados.</title>
+    <para>
+        Um documento PDF deve incluir informações gerais como o título do documento, autor, e datas de criação e modificação.
+    </para>
+    <para>
+        Historicamente essas informações são armazenadas com o uso de estruturas especiais. Esta estrutura está
+        disponível para leitura e escrita como um array associativo usando a propriedade pública <code>properties</code>
+        dos obejtos Zend_Pdf:
+            <programlisting role="php"><![CDATA[<?php
+$pdf = Zend_Pdf::load($pdfPath);
+
+echo $pdf->properties['Title'] . "\n";
+echo $pdf->properties['Author'] . "\n";
+
+$pdf->properties['Title'] = 'New Title.';
+$pdf->save($pdfPath);
+]]>
+            </programlisting>
+
+    </para>
+    <para>
+
+        As seguintes chaves são definidas pelo padrão PDF v1.4 (Acrobat 5):
+
+        <itemizedlist>
+            <listitem>
+                <para>
+                    <emphasis>Title</emphasis> - texto, opcional, o título do documento.
+                </para>
+            </listitem>
+            <listitem>
+                <para>
+                    <emphasis>Author</emphasis> - texto, opcional, o nome da pessoa que criou o documento.
+                </para>
+            </listitem>
+            <listitem>
+                <para>
+                    <emphasis>Subject</emphasis> - texto, opcional, o assunto do documento.
+                </para>
+            </listitem>
+            <listitem>
+                <para>
+                    <emphasis>Keywords</emphasis> -  texto, opcional, palavras-chave associadas ao documento.
+                </para>
+            </listitem>
+            <listitem>
+                <para>
+                    <emphasis>Creator</emphasis> -  texto, opcional, se o documento foi convertido para o formato PDF a
+                    partir de outro formato, o nome da aplicação (por exemplo, Adobe FrameMaker®) que criou o documento original.
+                </para>
+            </listitem>
+            <listitem>
+                <para>
+                    <emphasis>Producer</emphasis> -  texto, opcional, se o documento foi convertido para o formato PDF a
+                    partir de outro formato, o nome da aplicação (por exemplo, Adobe Distiller®) que converteu o converteu.
+                </para>
+            </listitem>
+            <listitem>
+                <para>
+                    <emphasis>CreationDate</emphasis> -  texto, opcional, a data e a hora na qual o documento foi criado, na seguinte forma:
+                    "D:YYYYMMDDHHmmSSOHH'mm'", onde:
+                    <itemizedlist>
+                        <listitem>
+                            <para>
+                                <emphasis>YYYY</emphasis> é o ano.
+                            </para>
+                        </listitem>
+                        <listitem>
+                            <para>
+                                <emphasis>MM</emphasis> é o mês.
+                            </para>
+                        </listitem>
+                        <listitem>
+                            <para>
+                                <emphasis>DD</emphasis> é o dia (01–31).
+                            </para>
+                        </listitem>
+                        <listitem>
+                            <para>
+                                <emphasis>HH</emphasis> é a hora (00–23).
+                            </para>
+                        </listitem>
+                        <listitem>
+                            <para>
+                                <emphasis>mm</emphasis> é o minuto(00–59).
+                            </para>
+                        </listitem>
+                        <listitem>
+                            <para>
+                                <emphasis>SS</emphasis> é o segundo (00–59).
+                            </para>
+                        </listitem>
+                        <listitem>
+                            <para>
+                                <emphasis>O</emphasis> é a relação da hora local com a hora Universal(UT),
+                                denotada pelos caracteres +, −, ou Z (veja abaixo).
+                            </para>
+                        </listitem>
+                        <listitem>
+                            <para>
+                                <emphasis>HH</emphasis> seguido por ' é o valor absoluto da diferença da hora Universal
+                                em horas (00–23).
+                            </para>
+                        </listitem>
+                        <listitem>
+                            <para>
+                                <emphasis>mm</emphasis>  seguido por ' é o valor absoluto da diferença da hora Universal
+                                em minutos (00–59).
+                            </para>
+                        </listitem>
+                    </itemizedlist>
+                    O apóstrofo (') depois do HH e do  mm é parte da sintaxe. Todos os campos depois do ano
+                    são opcionais . (O préfixo D:, embora também seja opcional, é fortemente recomendado.)
+                    Os valores padrões para MM e DD são, para ambos, 01; todos os outros campos numéricos
+                    têm valor padrão zero. Um sinal positivo(+) no valor de um campo significa que a hora local
+                    é mais tarde que a hora Universal, e um sinal negativo(−) indica que é mais cedo. A letra Z
+                    indica que a hora é igual a hora Universal. Se nenhuma informação for específicada, a relação
+                    da hora com a hora Universal é considerada desconhecida. Sendo ou não conhecido o fuso
+                    horário, o resto da data deve ser especificado em "local time".
+                </para>
+                <para>
+                    Por exemplo, 23 de Dezembro de 1998, 7:52 da noite, U.S. Pacific Standard Time, é
+                    representado pela string "D:199812231952−08'00'".
+                </para>
+            </listitem>
+            <listitem>
+                <para>
+                    <emphasis>ModDate</emphasis> - texto, opcional, a data e a hora da atualização mais recente no
+                    documento, na mesma forma de <emphasis>CreationDate</emphasis>.
+                </para>
+            </listitem>
+            <listitem>
+                <para>
+                    <emphasis>Trapped</emphasis> - boolean, opcional, indica se o documento foi modificado para a
+                    inclusão de informações "trapped".
+                    <itemizedlist>
+                        <listitem>
+                            <para>
+                                <emphasis>true</emphasis> - The document has been fully trapped; no further trapping is needed.
+                            </para>
+                        </listitem>
+                        <listitem>
+                            <para>
+                                <emphasis>false</emphasis> - The document has not yet been trapped; any desired trapping must still be done.
+                            </para>
+                        </listitem>
+                        <listitem>
+                            <para>
+                                <emphasis>null</emphasis> - Either it is unknown whether the document has been
+                                trapped or it has been partly but not yet fully trapped; some
+                                additional trapping may still be needed.
+                            </para>
+                        </listitem>
+                    </itemizedlist>
+                </para>
+            </listitem>
+        </itemizedlist>
+    </para>
+
+    <para>
+        Desde a versão de PDF v 1.6 os metadados podem ser armazenados no documento XML especial anexado
+        ao documento PDF
+        (XMP - <ulink url="http://www.adobe.com/products/xmp/">Extensible Metadata Platform</ulink>).
+    </para>
+
+    <para>
+        Este documento XML pode ser recuperado e anexado ao PDF com os métodos <code>Zend_Pdf::getMetadata()</code> e
+        <code>Zend_Pdf::setMetadata($metadata)</code>:
+            <programlisting role="php"><![CDATA[<?php
+$pdf = Zend_Pdf::load($pdfPath);
+$metadata = $pdf->getMetadata();
+$metadataDOM = new DOMDocument();
+$metadataDOM->loadXML($metadata);
+
+$xpath = new DOMXPath($metadataDOM);
+$pdfPreffixNamespaceURI = $xpath->query('/rdf:RDF/rdf:Description')->item(0)->lookupNamespaceURI('pdf');
+$xpath->registerNamespace('pdf', $pdfPreffixNamespaceURI);
+
+$titleNode = $xpath->query('/rdf:RDF/rdf:Description/pdf:Title')->item(0);
+$title = $titleNode->nodeValue;
+...
+
+$titleNode->nodeValue = 'New title';
+$pdf->setMetadata($metadataDOM->saveXML());
+$pdf->save($pdfPath);
+]]>
+            </programlisting>
+    </para>
+
+    <para>
+        Propriedades comuns são duplicadas na estrutura Info e nos Metadados do documento (se presente).
+        Agora é responsabilidade  da aplicação do usuário mantê-los sincronizados.
+    </para>
+</sect1>
+<!--
+vim:se ts=4 sw=4 et:
 -->

+ 40 - 80
documentation/manual/pt-br/module_specs/Zend_Pdf-Save.xml

@@ -1,80 +1,40 @@
-<sect1 id="zend.pdf.save">
-
-    <title>Salvar mudanças no documento PDF.</title>
-
-    <para>
-
-    Existem dois métodos que fornecem a persistência para mudanças feitas no documento PDF. Eles são os métodos
-
-    <code>Zend_Pdf::save()</code>e o <code>Zend_Pdf::render()</code>.
-
-    </para>
-
-
-
-    <para>
-
-    O <code>Zend_Pdf::save($filename, $updateOnly = false)</code> salva do documento PDF em um arquivo. Se o argumento $updateOnly
-
-    for verdadeiro, então apenas os novos segmentos do PDF serão acrescentados ao arquivo. De outra forma, o arquivo é sobrescrito.
-
-    </para>
-
-
-
-    <para>
-
-    O <code>Zend_Pdf::render($newSegmentOnly = false)</code> retorna o documento PDF como um texto(string). Se
-
-    $newSegmentOnly for verdadeiro, então apenas os novos segmentos do PDF serão retornados.
-
-    </para>
-
-
-
-    <example id="zend.pdf.save.example-1">
-
-        <title>Salvar um documento PDF.</title>
-
-        <programlisting role="php"><![CDATA[<?php
-
-...
-
-// Load PDF document.
-
-$pdf = Zend_Pdf::load($fileName);
-
-...
-
-// Update document
-
-$pdf->save($fileName, true);
-
-// Save document as a new file
-
-$pdf->save($newFileName);
-
-
-
-// Return PDF document as a string.
-
-$pdfString = $pdf->render();
-
-
-
-...]]>
-
-        </programlisting>
-
-    </example>
-
-
-
-</sect1>
-
-<!--
-
-vim:se ts=4 sw=4 et:
-
--->
-
+<sect1 id="zend.pdf.save">
+    <title>Salvar mudanças no documento PDF.</title>
+    <para>
+    Existem dois métodos que fornecem a persistência para mudanças feitas no documento PDF. Eles são os métodos
+    <code>Zend_Pdf::save()</code>e o <code>Zend_Pdf::render()</code>.
+    </para>
+
+    <para>
+    O <code>Zend_Pdf::save($filename, $updateOnly = false)</code> salva do documento PDF em um arquivo. Se o argumento $updateOnly
+    for verdadeiro, então apenas os novos segmentos do PDF serão acrescentados ao arquivo. De outra forma, o arquivo é sobrescrito.
+    </para>
+
+    <para>
+    O <code>Zend_Pdf::render($newSegmentOnly = false)</code> retorna o documento PDF como um texto(string). Se
+    $newSegmentOnly for verdadeiro, então apenas os novos segmentos do PDF serão retornados.
+    </para>
+
+    <example id="zend.pdf.save.example-1">
+        <title>Salvar um documento PDF.</title>
+        <programlisting role="php"><![CDATA[<?php
+...
+// Load PDF document.
+$pdf = Zend_Pdf::load($fileName);
+...
+// Update document
+$pdf->save($fileName, true);
+// Save document as a new file
+$pdf->save($newFileName);
+
+// Return PDF document as a string.
+$pdfString = $pdf->render();
+
+...]]>
+        </programlisting>
+    </example>
+
+</sect1>
+<!--
+vim:se ts=4 sw=4 et:
+-->

+ 155 - 310
documentation/manual/pt-br/module_specs/Zend_View-Helpers-HeadStyle.xml

@@ -1,310 +1,155 @@
-<sect3 id="zend.view.helpers.initial.headstyle">
-
-    <title>HeadStyle Helper</title>
-
-
-
-    <para>
-
-        O elemento HTML <code>&lt;style&gt;</code> é usado para incluir
-
-        folhas de estilo CSS de forma inline no elemento HTML <code>&lt;head&gt;</code>.
-
-    </para>
-
-
-
-    <note>
-
-        <title>Use o HeadLink para "linkar" arquivos CSS</title>
-
-
-
-        <para>
-
-            O <link linkend="zend.view.helpers.initial.headlink">HeadLink</link>
-
-            deve ser usado para criar elementos <code>&lt;link&gt;</code> para
-
-            a inclusão de folhas de estilo externas. <code>HeadScript</code> é usado quando
-
-            você deseja definir folhas de estilo inline.
-
-        </para>
-
-    </note>
-
-
-
-    <para>
-
-        O assistente <code>HeadStyle</code> dá suporte aos seguintes métodos para a configuração
-
-        e adição de declarações de folhas de estilo:
-
-    </para>
-
-
-
-    <itemizedlist>
-
-        <listitem><para><code>appendStyle($content, $attributes =
-
-                    array())</code></para></listitem>
-
-        <listitem><para><code>offsetSetStyle($index, $content, $attributes =
-
-                    array())</code></para></listitem>
-
-        <listitem><para><code>prependStyle($content, $attributes =
-
-                    array())</code></para></listitem>
-
-        <listitem><para><code>setStyle($content, $attributes =
-
-                    array())</code></para></listitem>
-
-    </itemizedlist>
-
-
-
-    <para>
-
-        Em todos os casos, <code>$content</code> é a verdadeira declaração CSS.
-
-        $attributes são quaisquer atributos adicionais que você dejesa prover para a
-
-        tag <code>style</code>: lang, title, media, ou dir são todos admissíveis.
-
-    </para>
-
-
-
-    <para>
-
-        <code>HeadStyle</code> também permite a captura de declarações de estilo; isso
-
-        pode ser útil se você quiser criar as declarações através de programação,
-
-        e então colocalas em outro lugar. A utilização disso será mostrada em um exemplo abaixo.
-
-    </para>
-
-
-
-    <para>
-
-        Finalmente, você pode usar o método <code>headStyle()</code> para
-
-        acrescentar rapidamente elementos de declaração; a assinatura para isso é
-
-        <code>headStyle($content$placement = 'APPEND', $attributes = array())</code>.
-
-        <code>$placement</code> deve ser 'APPEND', 'PREPEND', ou 'SET'.
-
-    </para>
-
-
-
-    <para>
-
-        <code>HeadStyle</code> sobrescreve <code>append()</code>,
-
-        <code>offsetSet()</code>, <code>prepend()</code>, e <code>set()</code>
-
-        para forçar o uso dos métodos especiais listados acima. Internamente
-
-        ele armazena cada item como um token <code>stdClass</code> , que depois
-
-        é serializado usando o método <code>itemToString()</code>. Isso permite
-
-        que você faça verificações nos itens da pilha, e opcionalmente modifique
-
-        estes itens simplesmente modificando o objeto retornado.
-
-    </para>
-
-
-
-    <para>
-
-        O assistente <code>HeadStyle</code> é uma implementação concreta
-
-        do assistente <link linkend="zend.view.helpers.initial.placeholder">Placeholder</link>.
-
-    </para>
-
-
-
-    <example id="zend.view.helpers.initial.headstyle.basicusage">
-
-        <title>Uso Básico do Assistente HeadStyle</title>
-
-
-
-        <para>
-
-            Você pode especificar uma nova tag de estilo a qualquer momento:
-
-        </para>
-
-
-
-        <programlisting role="php"><![CDATA[
-
-<?php // adding scripts
-
-$this->headStyle()->appendStyle($styles);
-
-?>
-
-]]></programlisting>
-
-
-
-        <para>
-
-            A ordenação é muito importante no CSS; você talvez tenha que
-
-            assegurar que as declarações sejam carregadas em uma ordem específica
-
-            devido à ordem do CSS; use as diretivas append, prepend, e offsetSet
-
-            para lhe auxiliar nessa tarefa:
-
-        </para>
-
-
-
-        <programlisting role="php"><![CDATA[
-
-<?php // Putting styles in order
-
-
-
-// place at a particular offset:
-
-$this->headStyle()->offsetSetStyle(100, $customStyles);
-
-
-
-// place at end:
-
-$this->headStyle()->appendStyle($finalStyles);
-
-
-
-// place at beginning
-
-$this->headStyle()->prependStyle($firstStyles);
-
-?>
-
-]]></programlisting>
-
-
-
-        <para>
-
-            When you're finally ready to output all style declarations in your
-
-            layout script, simply echo the helper:
-
-        </para>
-
-
-
-        <programlisting role="php"><![CDATA[
-
-<?= $this->headStyle() ?>
-
-]]></programlisting>
-
-    </example>
-
-
-
-    <example id="zend.view.helpers.initial.headstyle.capture">
-
-        <title>Capturing Style Declarations Using the HeadStyle Helper</title>
-
-
-
-        <para>
-
-            Sometimes you need to generate CSS style declarations
-
-            programmatically.  While you could use string concatenation,
-
-            heredocs, and the like, often it's easier just to do so by creating
-
-            the styles and sprinkling in PHP tags. <code>HeadStyle</code> lets
-
-            you do just that, capturing it to the stack:
-
-        </para>
-
-
-
-        <programlisting role="php"><![CDATA[
-
-<?php $this->headStyle()->captureStart() ?>
-
-body {
-
-    background-color: <?= $this->bgColor ?>;
-
-}
-
-<?php $this->headStyle()->captureEnd() ?>
-
-]]></programlisting>
-
-
-
-        <para>
-
-            The following assumptions are made:
-
-        </para>
-
-
-
-        <itemizedlist>
-
-            <listitem><para>
-
-                    The style declarations will be appended to the stack. If you
-
-                    wish for them to replace the stack or be added to the top,
-
-                    you will need to pass 'SET' or 'PREPEND', respectively, as
-
-                    the first argument to <code>captureStart()</code>.
-
-            </para></listitem>
-
-
-
-            <listitem><para>
-
-                    If you wish to specify any additional attributes for the
-
-                    <code>&lt;style&gt;</code> tag, pass them in an array as
-
-                    the third argument to <code>captureStart()</code>.
-
-            </para></listitem>
-
-        </itemizedlist>
-
-    </example>
-
-</sect3>
-
-<!--
-
-vim:se ts=4 sw=4 et:
-
--->
-
+<sect3 id="zend.view.helpers.initial.headstyle">
+    <title>HeadStyle Helper</title>
+
+    <para>
+        O elemento HTML <code>&lt;style&gt;</code> é usado para incluir
+        folhas de estilo CSS de forma inline no elemento HTML <code>&lt;head&gt;</code>.
+    </para>
+
+    <note>
+        <title>Use o HeadLink para "linkar" arquivos CSS</title>
+
+        <para>
+            O <link linkend="zend.view.helpers.initial.headlink">HeadLink</link>
+            deve ser usado para criar elementos <code>&lt;link&gt;</code> para
+            a inclusão de folhas de estilo externas. <code>HeadScript</code> é usado quando
+            você deseja definir folhas de estilo inline.
+        </para>
+    </note>
+
+    <para>
+        O assistente <code>HeadStyle</code> dá suporte aos seguintes métodos para a configuração
+        e adição de declarações de folhas de estilo:
+    </para>
+
+    <itemizedlist>
+        <listitem><para><code>appendStyle($content, $attributes =
+                    array())</code></para></listitem>
+        <listitem><para><code>offsetSetStyle($index, $content, $attributes =
+                    array())</code></para></listitem>
+        <listitem><para><code>prependStyle($content, $attributes =
+                    array())</code></para></listitem>
+        <listitem><para><code>setStyle($content, $attributes =
+                    array())</code></para></listitem>
+    </itemizedlist>
+
+    <para>
+        Em todos os casos, <code>$content</code> é a verdadeira declaração CSS.
+        $attributes são quaisquer atributos adicionais que você dejesa prover para a
+        tag <code>style</code>: lang, title, media, ou dir são todos admissíveis.
+    </para>
+
+    <para>
+        <code>HeadStyle</code> também permite a captura de declarações de estilo; isso
+        pode ser útil se você quiser criar as declarações através de programação,
+        e então colocalas em outro lugar. A utilização disso será mostrada em um exemplo abaixo.
+    </para>
+
+    <para>
+        Finalmente, você pode usar o método <code>headStyle()</code> para
+        acrescentar rapidamente elementos de declaração; a assinatura para isso é
+        <code>headStyle($content$placement = 'APPEND', $attributes = array())</code>.
+        <code>$placement</code> deve ser 'APPEND', 'PREPEND', ou 'SET'.
+    </para>
+
+    <para>
+        <code>HeadStyle</code> sobrescreve <code>append()</code>,
+        <code>offsetSet()</code>, <code>prepend()</code>, e <code>set()</code>
+        para forçar o uso dos métodos especiais listados acima. Internamente
+        ele armazena cada item como um token <code>stdClass</code> , que depois
+        é serializado usando o método <code>itemToString()</code>. Isso permite
+        que você faça verificações nos itens da pilha, e opcionalmente modifique
+        estes itens simplesmente modificando o objeto retornado.
+    </para>
+
+    <para>
+        O assistente <code>HeadStyle</code> é uma implementação concreta
+        do assistente <link linkend="zend.view.helpers.initial.placeholder">Placeholder</link>.
+    </para>
+
+    <example id="zend.view.helpers.initial.headstyle.basicusage">
+        <title>Uso Básico do Assistente HeadStyle</title>
+
+        <para>
+            Você pode especificar uma nova tag de estilo a qualquer momento:
+        </para>
+
+        <programlisting role="php"><![CDATA[
+<?php // adding scripts
+$this->headStyle()->appendStyle($styles);
+?>
+]]></programlisting>
+
+        <para>
+            A ordenação é muito importante no CSS; você talvez tenha que
+            assegurar que as declarações sejam carregadas em uma ordem específica
+            devido à ordem do CSS; use as diretivas append, prepend, e offsetSet
+            para lhe auxiliar nessa tarefa:
+        </para>
+
+        <programlisting role="php"><![CDATA[
+<?php // Putting styles in order
+
+// place at a particular offset:
+$this->headStyle()->offsetSetStyle(100, $customStyles);
+
+// place at end:
+$this->headStyle()->appendStyle($finalStyles);
+
+// place at beginning
+$this->headStyle()->prependStyle($firstStyles);
+?>
+]]></programlisting>
+
+        <para>
+            When you're finally ready to output all style declarations in your
+            layout script, simply echo the helper:
+        </para>
+
+        <programlisting role="php"><![CDATA[
+<?= $this->headStyle() ?>
+]]></programlisting>
+    </example>
+
+    <example id="zend.view.helpers.initial.headstyle.capture">
+        <title>Capturing Style Declarations Using the HeadStyle Helper</title>
+
+        <para>
+            Sometimes you need to generate CSS style declarations
+            programmatically.  While you could use string concatenation,
+            heredocs, and the like, often it's easier just to do so by creating
+            the styles and sprinkling in PHP tags. <code>HeadStyle</code> lets
+            you do just that, capturing it to the stack:
+        </para>
+
+        <programlisting role="php"><![CDATA[
+<?php $this->headStyle()->captureStart() ?>
+body {
+    background-color: <?= $this->bgColor ?>;
+}
+<?php $this->headStyle()->captureEnd() ?>
+]]></programlisting>
+
+        <para>
+            The following assumptions are made:
+        </para>
+
+        <itemizedlist>
+            <listitem><para>
+                    The style declarations will be appended to the stack. If you
+                    wish for them to replace the stack or be added to the top,
+                    you will need to pass 'SET' or 'PREPEND', respectively, as
+                    the first argument to <code>captureStart()</code>.
+            </para></listitem>
+
+            <listitem><para>
+                    If you wish to specify any additional attributes for the
+                    <code>&lt;style&gt;</code> tag, pass them in an array as
+                    the third argument to <code>captureStart()</code>.
+            </para></listitem>
+        </itemizedlist>
+    </example>
+</sect3>
+<!--
+vim:se ts=4 sw=4 et:
+-->

+ 99 - 198
documentation/manual/pt-br/module_specs/Zend_View-Introduction.xml

@@ -1,199 +1,100 @@
-<sect1 id="zend.view.introduction">
-
-
-
-    <title>Introdução</title>
-
-
-
-    <para>
-
-        Zend_View é uma classe para trabalhar com a parte de visualização do padrão de projeto MVC.  Basicamente ela existe para  separar o script de visualização dos controladores e modelos.  Ela fornece um sistema de assistentes, filtros de saída e escape de variáveis.
-
-    </para>
-
-
-
-    <para>
-
-        Zend_View é um sistema de template agnóstico; você pode usar o PHP como sua linguagem de template, ou criar instâncias de outros sistemas de template e manipulá-las dentro do seu script de visualização.
-
-    </para>
-
-
-
-    <para>
-
-        Essencialmente, o funcionamento do Zend_View acontece em duas etapas principais:
-
-
-
-        1.  Seu script controlador cria uma instância de Zend_View, atribuindo-lhe variáveis.
-
-
-
-        2. O controlador instrui o Zend_View a rederizar uma determinada visualização , passando o controle ao script de visualização, responsável pela geração da saída a ser visualizada.
-
-    </para>
-
-
-
-    <sect2 id="zend.view.introduction.controller">
-
-
-
-        <title>Script Controlador</title>
-
-
-
-        <para>
-
-            Neste exemplo simples, suponhamos que seu controlador tenha uma listagem contendo dados sobre livros, que queremos renderizar para uma visualização. O controlador poderia ser algo como isto:
-
-        </para>
-
-
-
-        <programlisting role="php"><![CDATA[<?php
-
-// use um modelo para obter dados sobre autores e títulos dos livros.
-
-$data = array(
-
-    array(
-
-        'author' => 'Hernando de Soto',
-
-        'title' => 'The Mystery of Capitalism'
-
-    ),
-
-    array(
-
-        'author' => 'Henry Hazlitt',
-
-        'title' => 'Economics in One Lesson'
-
-    ),
-
-    array(
-
-        'author' => 'Milton Friedman',
-
-        'title' => 'Free to Choose'
-
-    )
-
-);
-
-
-
-// atribua os dados à instância de Zend_View
-
-Zend_Loader::loadClass('Zend_View');
-
-$view = new Zend_View();
-
-$view->books = $data;
-
-
-
-// renderize uma visualização chamada "booklist.php"
-
-echo $view->render('booklist.php');
-
-?>]]>
-
-        </programlisting>
-
-
-
-    </sect2>
-
-
-
-    <sect2 id="zend.view.introduction.view">
-
-
-
-        <title>Script Visualizador</title>
-
-
-
-        <para>
-
-            Agora necessitaremos do script de visualização associado, "booklist.php". Trata-se de um script PHP como qualquer outro, com uma exceção:  ele executa dentro do escopo da instância de Zend_View instance, o que implica que as referências a $this apontam para as propriedades e métodos da instância Zend_View.  (Variáveis atribuídas à instância pelo controlador são propriedades públicas da instância de Zend_View.)  Deste modo, um script de visualição muito básico poderia se parecer com isto:
-
-        </para>
-
-
-
-        <programlisting role="php"><![CDATA[<?php if ($this->books): ?>
-
-
-
-    <!-- Uma tabela contendo alguns livros. -->
-
-    <table>
-
-        <tr>
-
-            <th>Autor</th>
-
-            <th>Título</th>
-
-        </tr>
-
-
-
-        <?php foreach ($this->books as $key => $val): ?>
-
-        <tr>
-
-            <td><?php echo $this->escape($val['author']) ?></td>
-
-            <td><?php echo $this->escape($val['title']) ?></td>
-
-        </tr>
-
-        <?php endforeach; ?>
-
-
-
-    </table>
-
-
-
-<?php else: ?>
-
-
-
-    <p>Não existem livros a serem exibidos.</p>
-
-
-
-<?php endif; ?>]]>
-
-        </programlisting>
-
-
-
-        <para>
-
-            Observe a forma como empregamos o método "escape()" para escapar o conteúdo das variáveis para a saída.
-
-        </para>
-
-
-
-    </sect2>
-
-
-
-</sect1>
-
-<!--
-
-vim:se ts=4 sw=4 et:
-
+<sect1 id="zend.view.introduction">
+
+    <title>Introdução</title>
+
+    <para>
+        Zend_View é uma classe para trabalhar com a parte de visualização do padrão de projeto MVC.  Basicamente ela existe para  separar o script de visualização dos controladores e modelos.  Ela fornece um sistema de assistentes, filtros de saída e escape de variáveis.
+    </para>
+
+    <para>
+        Zend_View é um sistema de template agnóstico; você pode usar o PHP como sua linguagem de template, ou criar instâncias de outros sistemas de template e manipulá-las dentro do seu script de visualização.
+    </para>
+
+    <para>
+        Essencialmente, o funcionamento do Zend_View acontece em duas etapas principais:
+
+        1.  Seu script controlador cria uma instância de Zend_View, atribuindo-lhe variáveis.
+
+        2. O controlador instrui o Zend_View a rederizar uma determinada visualização , passando o controle ao script de visualização, responsável pela geração da saída a ser visualizada.
+    </para>
+
+    <sect2 id="zend.view.introduction.controller">
+
+        <title>Script Controlador</title>
+
+        <para>
+            Neste exemplo simples, suponhamos que seu controlador tenha uma listagem contendo dados sobre livros, que queremos renderizar para uma visualização. O controlador poderia ser algo como isto:
+        </para>
+
+        <programlisting role="php"><![CDATA[<?php
+// use um modelo para obter dados sobre autores e títulos dos livros.
+$data = array(
+    array(
+        'author' => 'Hernando de Soto',
+        'title' => 'The Mystery of Capitalism'
+    ),
+    array(
+        'author' => 'Henry Hazlitt',
+        'title' => 'Economics in One Lesson'
+    ),
+    array(
+        'author' => 'Milton Friedman',
+        'title' => 'Free to Choose'
+    )
+);
+
+// atribua os dados à instância de Zend_View
+Zend_Loader::loadClass('Zend_View');
+$view = new Zend_View();
+$view->books = $data;
+
+// renderize uma visualização chamada "booklist.php"
+echo $view->render('booklist.php');
+?>]]>
+        </programlisting>
+
+    </sect2>
+
+    <sect2 id="zend.view.introduction.view">
+
+        <title>Script Visualizador</title>
+
+        <para>
+            Agora necessitaremos do script de visualização associado, "booklist.php". Trata-se de um script PHP como qualquer outro, com uma exceção:  ele executa dentro do escopo da instância de Zend_View instance, o que implica que as referências a $this apontam para as propriedades e métodos da instância Zend_View.  (Variáveis atribuídas à instância pelo controlador são propriedades públicas da instância de Zend_View.)  Deste modo, um script de visualição muito básico poderia se parecer com isto:
+        </para>
+
+        <programlisting role="php"><![CDATA[<?php if ($this->books): ?>
+
+    <!-- Uma tabela contendo alguns livros. -->
+    <table>
+        <tr>
+            <th>Autor</th>
+            <th>Título</th>
+        </tr>
+
+        <?php foreach ($this->books as $key => $val): ?>
+        <tr>
+            <td><?php echo $this->escape($val['author']) ?></td>
+            <td><?php echo $this->escape($val['title']) ?></td>
+        </tr>
+        <?php endforeach; ?>
+
+    </table>
+
+<?php else: ?>
+
+    <p>Não existem livros a serem exibidos.</p>
+
+<?php endif; ?>]]>
+        </programlisting>
+
+        <para>
+            Observe a forma como empregamos o método "escape()" para escapar o conteúdo das variáveis para a saída.
+        </para>
+
+    </sect2>
+
+</sect1>
+<!--
+vim:se ts=4 sw=4 et:
 -->