O PDFlibPas desenha texto japonês e chinês descendo a página. SetVerticalWritingMode ativa a escrita vertical, chamadas comuns de DrawText passam a correr para baixo, e GetVerticalWritingMode informa o estado atual. Antes disso existir, dispor texto verticalmente significava colocar cada caractere à mão e torcer para o espaçamento parecer correto
Escrita vertical não é texto horizontal girado noventa graus. Os caracteres permanecem verticais, o avanço corre para baixo em vez de atravessar, e vários caracteres mudam inteiramente de forma — essa é a parte que separa um documento que lê de forma natural daquele que um leitor japonês reconhece imediatamente como produzido por máquina
O que muda dentro do PDF
O texto desenhado assim passa por uma fonte Type0 em modo de escrita vertical carregando as métricas verticais próprias da fonte. Isso importa em duas direções. Um leitor avança cada caractere pela distância que seu designer pretendeu em vez de por um passo uniforme, então a coluna tem o ritmo para o qual a fonte foi desenhada. E copiar o texto para fora devolve os caracteres originais, porque a execução vertical ainda é texto real com mapeamento apropriado em vez de uma sequência de glifos posicionados
Uma fonte que não carrega métricas verticais próprias avança um em por caractere, que é o que um leitor faria com o padrão. Vale a pena conhecer esse fallback porque é a diferença que você verá quando um documento renderiza corretamente com uma fonte CJK apropriada e parece mecanicamente espaçada com uma fonte latina que por acaso contém alguns kana
var
Lib: TPDFlib;
H: Double;
begin
Lib := TPDFlib.Create;
try
Lib.SetOrigin(1);
Lib.AddTrueTypeFont('MS Mincho', 1); // 1 = embed the face
Lib.SetTextSize(12);
Lib.SetVerticalWritingMode(1); // ordinary DrawText now runs down
H := Lib.GetVerticalTextHeight('MS Mincho', 12, '第三章 保守点検');
Lib.DrawText(480, 72, '第三章 保守点検');
Lib.SetVerticalWritingMode(0); // back to horizontal
Lib.DrawText(72, 72 + H, 'Chapter 3');
Lib.SaveToFile('manual-ja.pdf');
finally
Lib.Free;
end;
end;
Por que os colchetes parecem errados em texto vertical?
Porque um colchete tem duas formas e só uma delas pertence a uma coluna. Colchetes, o sinal de vogal longa e os kana pequenos são desenhados de modo diferente quando o texto corre para baixo na página — um parêntese gira para se assentar ao longo da coluna em vez de se deitar atravessado, e o sinal de vogal longa vira um traço vertical. Desenhe as formas horizontais em uma coluna vertical e todas elas ficam deitadas de lado
O PDFlibPas pega as formas da própria característica vertical da fonte, então cada fonte fornece o que seu designer desenhou em vez de uma substituição adivinhada a partir do caractere. Essa distinção importa para a correção: uma tabela de substituição adivinhada está certa para os casos comuns e errada para as fontes que tratam um caractere de modo diferente, e uma fonte que não nomeia formas verticais é desenhada exatamente como antes em vez de ser forçada por uma tabela que nunca pediu
GetVerticalTextHeight mede as formas que serão de fato desenhadas, então uma coluna cujos caracteres mudam de forma ainda é medida corretamente. Medir as formas horizontais e desenhar as verticais é a fonte clássica de colunas que ultrapassam sua caixa em alguns caracteres
Desenhando uma única execução sem mudar o modo
DrawVerticalText desenha uma única execução na vertical, recebendo a posição, o nome da fonte, o tamanho e o texto, e deixa o modo de escrita intacto. Use para a exceção vertical dentro de um documento horizontal — uma lombada, um carimbo, uma única coluna de nomes — em que ligar e desligar um modo global em torno de cada chamada é mais estado do que a tarefa merece
As formas horizontais e verticais de uma mesma fonte são mantidas separadas internamente, então uma página pode carregar ambas sem que uma perturbe a outra. É o que torna prática uma página mista: uma página de livro japonês com corpo vertical e cabeçalhos correntes horizontais, ou um certificado chinês com um título vertical sobre linhas de detalhe horizontais
// One vertical run inside an otherwise horizontal page
Lib.DrawVerticalText(520, 96, 'MS Mincho', 14, '保守点検記録');
// The horizontal text around it is unaffected
Lib.DrawText(72, 96, 'Maintenance inspection record');
Acertando a fonte antes de qualquer outra coisa
A escrita vertical depende inteiramente da fonte. Uma fonte CJK com métricas verticais apropriadas e uma característica vertical produz saída correta sem trabalho adicional; uma fonte sem elas produz caracteres verticais avançando um em de cada vez e nenhuma mudança de forma. Se o texto vertical parecer sutilmente errado, examine a fonte antes de examinar o código
O embutir segue as regras e os custos habituais. Uma fonte CJK completa é grande, então o subsetting não é opcional para documentos que vão a qualquer lugar — as notas sobre otimização de tamanho de PDF e subsetting de fontes cobrem o que esperar, e o guia sobre embutir fontes ausentes em um PDF existente cobre o caso de reparo em que um documento vertical chega sem suas fontes
Onde o texto vertical ainda exige uma decisão de layout sua
A ordem das colunas. O texto vertical japonês corre da direita para a esquerda por coluna, então uma página com duas colunas começa pela borda direita, e nenhuma configuração de modo de escrita consegue inferir isso a partir do texto. O mesmo vale para a ordem das páginas em um documento que se lê da direita para a esquerda como um todo, e para onde furigana, notas de rodapé e legendas de figura ficam
O que a biblioteca garante é que cada execução seja disposta corretamente: formas corretas, avanços corretos, texto extraível. Para onde as execuções vão na página é um problema de layout, e para documentos montados a partir de dados o guia de busca de texto e enumeração de elementos de página é útil para verificar depois se o que caiu na página é o que você pretendia
O PDFlibPas é uma biblioteca PDF nativa em Pascal para Delphi, C++Builder e Lazarus, e a escrita CJK vertical faz parte da API de desenho em vez de um complemento — veja a página do produto PDFlibPas para a lista de recursos de texto e fonte