PDFlibPas dibuja texto en japonés y chino de arriba a abajo en la página. SetVerticalWritingMode activa la escritura vertical, las llamadas ordinarias a DrawText entonces discurren hacia abajo, y GetVerticalWritingMode informa del estado actual. Antes de que existiera, disponer texto en vertical significaba colocar cada carácter a mano y esperar que el espaciado quedara bien
La escritura vertical no es texto horizontal girado noventa grados. Los caracteres permanecen erguidos, el avance discurre hacia abajo en lugar de a lo ancho, y varios caracteres cambian de forma por completo —que es la parte que separa un documento que se lee con naturalidad de otro que un lector japonés reconoce enseguida como generado por máquina—
Qué cambia dentro del PDF
El texto dibujado de este modo pasa por una fuente Type0 en modo de escritura vertical que porta las métricas verticales propias de la fuente. Eso importa en dos direcciones. Un lector avanza cada carácter en la distancia que su diseñador previó en lugar de con un paso uniforme, de modo que la columna conserva el ritmo para el que se dibujó la tipografía. Y copiar el texto devuelve los caracteres originales, porque la secuencia vertical sigue siendo texto real con una correspondencia adecuada y no una secuencia de glifos posicionados
Una fuente que no porta métricas verticales propias avanza un em por carácter, que es lo que haría un lector por defecto. Ese comportamiento de respuesta conviene conocerlo, porque es la diferencia que verás cuando un documento se renderice correctamente con una fuente CJK adecuada y quede mecánicamente espaciado con una fuente latina que por casualidad contiene algo de 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 qué los corchetes se ven mal en texto vertical?
Porque un corchete tiene dos formas y solo una de ellas pertenece a una columna. Los corchetes, la marca de vocal larga y el kana pequeño se dibujan de manera distinta cuando el texto discurre hacia abajo en la página —un paréntesis gira para acomodarse a lo largo de la columna en lugar de yacer a través de ella, y la marca de vocal larga se convierte en un trazo vertical—. Dibuja las formas horizontales en una columna vertical y todos quedarán tumbados de lado
PDFlibPas toma las formas de la característica vertical de la propia fuente, así que cada cara aporta lo que dibujó su diseñador en lugar de una sustitución adivinada a partir del carácter. Esa distinción importa para la corrección: una tabla de sustitución adivinada acierta en los casos comunes y falla en las fuentes que tratan un carácter de forma distinta, y una fuente que no declara formas verticales se dibuja exactamente igual que antes en lugar de verse forzada a través de una tabla que nunca pidió
GetVerticalTextHeight mide las formas que realmente se van a dibujar, de modo que una columna cuyos caracteres cambian de forma sigue midiéndose correctamente. Medir las formas horizontales y dibujar las verticales es la causa clásica de columnas que rebasan su caja por unos cuantos caracteres
Dibujar una secuencia sin cambiar el modo
DrawVerticalText dibuja una única secuencia en vertical, tomando la posición, el nombre de la fuente, el cuerpo y el texto, y deja intacto el modo de escritura. Úsalo para la excepción vertical dentro de un documento horizontal —la etiqueta de lomo, un sello, una sola columna de nombres—, donde activar y desactivar un modo global en torno a cada llamada aporta más estado del que la tarea merece
Las formas horizontal y vertical de una misma fuente se mantienen separadas internamente, de modo que una página puede portar ambas sin que una moleste a la otra. Eso es lo que hace práctica una página mixta: una página de libro japonés con cuerpo vertical y cabeceras corridas horizontales, o un certificado chino con título vertical sobre líneas de detalle horizontales
// 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');
Asegurar la fuente antes que cualquier otra cosa
La escritura vertical depende por completo de la fuente. Una fuente CJK con métricas verticales adecuadas y una característica vertical produce una salida correcta sin más trabajo; una fuente que carece de ellas produce caracteres erguidos que avanzan un em cada vez y ningún cambio de forma. Si el texto vertical se ve sutilmente mal, examina la fuente antes de examinar el código
La incrustación sigue las reglas habituales y los costes habituales. Una fuente CJK completa es grande, así que el subsetting no es opcional para documentos que vayan a cualquier sitio: las notas sobre la optimización del tamaño de PDF y el subsetting de fuentes cubren qué cabe esperar, y el recorrido por la incrustación de fuentes ausentes en un PDF existente cubre el caso de reparación en que un documento vertical llega sin sus fuentes
Dónde sigue necesitando el texto vertical una decisión de maquetación por tu parte
El orden de columnas. El texto japonés vertical discurre de derecha a izquierda por columnas, así que una página a dos columnas empieza por el borde derecho, y ningún ajuste del modo de escritura puede inferirlo a partir del texto. Lo mismo se aplica al orden de páginas en un documento que se lee de derecha a izquierda como un todo, y a la ubicación del furigana, las notas al pie y los pies de figura
Lo que la librería garantiza es que cada secuencia queda dispuesta correctamente: formas correctas, avances correctos, texto extraíble. Dónde van las secuencias en la página es un problema de maquetación, y para documentos ensamblados a partir de datos el recorrido por la búsqueda de texto y la enumeración de elementos de página resulta útil para verificar a posteriori que lo que ha llegado a la página es lo que pretendías
PDFlibPas es una librería PDF nativa en Pascal para Delphi, C++Builder y Lazarus, y la escritura vertical CJK forma parte de la API de dibujo en lugar de ser un añadido; consulta la página del producto PDFlibPas para la lista de características de texto y fuentes