PDFlibPas dibuja texto en japonés y chino hacia abajo en la página. SetVerticalWritingMode activa la escritura vertical, las llamadas ordinarias a DrawText entonces corren hacia abajo, y GetVerticalWritingMode reporta el estado actual. Antes de que esto existiera, poner texto verticalmente significaba colocar cada carácter a mano y esperar que el espaciado se viera bien
La escritura vertical no es texto horizontal rotado noventa grados. Los caracteres se mantienen de pie, el avance corre hacia abajo en vez 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 uno que un lector japonés reconoce de inmediato como producido por una máquina
Qué cambia dentro del PDF
El texto dibujado así pasa por una fuente Type0 en modo de escritura vertical que lleva las métricas verticales propias de la fuente. Eso importa en dos direcciones. Un lector avanza cada carácter por la distancia que su diseñador pretendió en vez de por un paso uniforme, así que la columna tiene el ritmo para el que la tipografía fue dibujada. Y copiar el texto afuera devuelve los caracteres originales, porque la corrida vertical sigue siendo texto real con un mapeo adecuado en vez de una secuencia de glifos posicionados
Una fuente que no lleva métricas verticales propias avanza un em por carácter, que es lo que haría un lector con el valor por defecto. Conviene conocer ese respaldo porque es la diferencia que verás cuando un documento se renderiza correctamente con una fuente CJK adecuada y se ve espaciada mecánicamente con una fuente latina que resulta contener 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 paréntesis se ven mal en texto vertical?
Porque un paréntesis tiene dos formas y solo una pertenece a una columna. Los paréntesis, la marca de vocal larga y la kana pequeña se dibujan distinto cuando el texto corre hacia abajo en la página — un paréntesis rota para recostarse a lo largo de la columna en vez de atravesarla, y la marca de vocal larga se vuelve un trazo vertical. Dibuja las formas horizontales en una columna vertical y cada una queda acostada de costado
PDFlibPas toma las formas de la característica vertical propia de la fuente, así que cada fuente aporta lo que su diseñador dibujó en vez 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 nombra formas verticales se dibuja exactamente como antes en vez de ser forzada por una tabla que nunca pidió
GetVerticalTextHeight mide las formas que realmente se dibujarán, así que una columna cuyos caracteres cambian de forma se mide correctamente. Medir las formas horizontales y dibujar las verticales es la fuente clásica de columnas que se desbordan de su caja por unos cuantos caracteres
Dibujar una corrida sin cambiar el modo
DrawVerticalText dibuja una sola corrida en vertical, tomando la posición, el nombre de la fuente, el tamaño y el texto, y deja intacto el modo de escritura. Úsalo para la excepción vertical dentro de un documento horizontal — una etiqueta de lomo, un sello, una sola columna de nombres — donde activar y desactivar un modo global alrededor de cada llamada es más estado del que la tarea merece
Las formas horizontales y verticales de una misma fuente se mantienen separadas internamente, así que una página puede llevar ambas sin que una perturbe a la otra. Eso es lo que vuelve práctica una página mixta: una página de libro japonés con cuerpo vertical y encabezados de página horizontales, o un certificado chino con un 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');
Dejar la fuente correcta 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 salida correcta sin más trabajo; una fuente sin ellas produce caracteres erguidos avanzando un em a la 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 costos habituales. Una fuente CJK completa es grande, así que el subsetting no es opcional para los documentos que van a cualquier parte — las notas sobre la optimización del tamaño de archivo PDF y el subsetting de fuentes cubren qué esperar, y el recorrido por la incrustación de fuentes faltantes en un PDF existente cubre el caso de reparación cuando un documento vertical llega sin sus fuentes
Dónde el texto vertical todavía necesita una decisión de maquetación tuya
El orden de columnas. El texto vertical japonés corre de derecha a izquierda por columna, así que una página a dos columnas empieza en el borde derecho, y ningún ajuste de modo de escritura puede inferirlo a partir del texto. Lo mismo aplica al orden de página en un documento que se lee de derecha a izquierda como conjunto, y a dónde se ubican el furigana, las notas al pie y los títulos de figura
Lo que la biblioteca garantiza es que cada corrida se asienta correctamente: formas correctas, avances correctos, texto extraíble. Dónde van las corridas 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 es útil para verificar después que lo que llegó a la página es lo que pretendías
PDFlibPas es una biblioteca PDF nativa en Pascal para Delphi, C++Builder y Lazarus, y la escritura vertical CJK es parte de la API de dibujo en vez de un complemento — consulta la página del producto PDFlibPas para la lista de características de texto y fuentes