PDFlibPas disegna testo giapponese e cinese lungo la pagina. SetVerticalWritingMode attiva la scrittura verticale, le normali chiamate DrawText scorrono quindi verso il basso, e GetVerticalWritingMode riporta lo stato corrente. Prima che questo esistesse, impostare testo verticalmente significava collocare ogni carattere a mano e sperare che la spaziatura sembrasse giusta
La scrittura verticale non è testo orizzontale ruotato di novanta gradi. I caratteri restano dritti, l'avanzamento corre verso il basso invece che in orizzontale, e diversi caratteri cambiano forma del tutto — il che è la parte che separa un documento che si legge in modo naturale da uno che un lettore giapponese riconosce subito come prodotto a macchina
Cosa cambia dentro il PDF
Il testo disegnato in questo modo passa attraverso un font Type0 in modalità scrittura verticale che porta le metriche verticali proprie del carattere. Questo conta in due direzioni. Un lettore fa avanzare ogni carattere della distanza che il suo designer intendeva anziché di un passo uniforme, così la colonna ha il ritmo per cui il carattere era stato disegnato. E copiare il testo fuori restituisce i caratteri originali, perché la sequenza verticale è ancora testo reale con una mappatura corretta anziché una sequenza di glifi posizionati
Un carattere che non porta metriche verticali proprie avanza di un em per carattere, che è ciò che un lettore farebbe con il valore predefinito. Quel fallback vale la pena conoscerlo perché è la differenza che vedrai quando un documento si renderizza correttamente con un carattere CJK appropriato e appare meccanicamente spaziato con un carattere latino che casualmente contiene qualche 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;
Perché le parentesi sembrano sbagliate nel testo verticale?
Perché una parentesi ha due forme e solo una appartiene a una colonna. Parentesi, il segno della vocale lunga e i kana piccoli si disegnano in modo diverso quando il testo corre verso il basso — una parentesi si ruota per stare lungo la colonna invece di stare distesa attraverso di essa, e il segno della vocale lunga diventa un tratto verticale. Disegna le forme orizzontali in una colonna verticale e ognuna di esse giace su un fianco
PDFlibPas prende le forme dalla feature verticale del font, così ogni carattere fornisce ciò che il suo designer ha disegnato anziché una sostituzione indovinata dal carattere. Questa distinzione conta per la correttezza: una tabella di sostituzione indovinata è giusta per i casi comuni e sbagliata per i caratteri che trattano un carattere in modo diverso, e un carattere che non nomina forme verticali viene disegnato esattamente come prima anziché essere forzato attraverso una tabella che non ha mai richiesto
GetVerticalTextHeight misura le forme che saranno effettivamente disegnate, così una colonna i cui caratteri cambiano forma viene ancora misurata correttamente. Misurare le forme orizzontali e disegnare quelle verticali è la classica fonte di colonne che sforano la propria casella di alcuni caratteri
Disegnare una sequenza senza cambiare la modalità
DrawVerticalText disegna una singola sequenza verticalmente, prendendo la posizione, il nome del carattere, la dimensione e il testo, e lascia stare la modalità di scrittura. Usalo per l'eccezione verticale dentro un documento orizzontale — il titolo sul dorso, un timbro, una singola colonna di nomi — dove accendere e spegnere una modalità globale attorno a ogni chiamata è più stato di quanto il compito meriti
Le forme orizzontali e verticali di uno stesso carattere vengono tenute separate internamente, così una pagina può portare entrambe senza che l'una disturbi l'altra. È questo che rende pratica una pagina mista: una pagina di libro giapponese con corpo testo verticale e testate correnti orizzontali, o un certificato cinese con un titolo verticale sopra linee di dettaglio orizzontali
// 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');
Ottenere il carattere giusto prima di ogni altra cosa
La scrittura verticale dipende interamente dal carattere. Un font CJK con metriche verticali proprie e una feature verticale produce output corretto senza ulteriore lavoro; un font senza di essi produce caratteri dritti che avanzano di un em alla volta e nessun cambio di forma. Se il testo verticale sembra sottilmente sbagliato, esamina il font prima di esaminare il codice
L'incorporamento segue le regole abituali e i costi abituali. Un carattere CJK completo è grande, così il subsetting non è facoltativo per i documenti che vanno da qualche parte — le note sull'ottimizzazione della dimensione dei file PDF e subsetting dei font coprono cosa aspettarsi, e la guida sull'incorporamento di font mancanti in un PDF esistente copre il caso di riparazione in cui un documento verticale arriva senza i suoi font
Dove il testo verticale ha ancora bisogno di una decisione di layout da parte tua
L'ordine delle colonne. Il testo verticale giapponese corre da destra a sinistra per colonna, così una pagina a due colonne inizia dal bordo destro, e nessuna impostazione di modalità di scrittura può dedurlo dal testo. Lo stesso vale per l'ordine delle pagine in un documento che nel complesso si legge da destra a sinistra, e per dove stanno furigana, note a piè di pagina e didascalie delle figure
Cosa la libreria garantisce è che ogni sequenza sia disposta correttamente: forme corrette, avanzamenti corretti, testo estraibile. Dove le sequenze vanno sulla pagina è un problema di layout, e per i documenti assemblati dai dati la guida sulla ricerca di testo ed enumerazione degli elementi di pagina è utile per verificare in seguito che ciò che è atterrato sulla pagina sia ciò che intendevi
PDFlibPas è una libreria PDF nativa in Pascal per Delphi, C++Builder e Lazarus, e la scrittura CJK verticale fa parte dell'API di disegno anziché essere un componente aggiuntivo — vedi la pagina prodotto PDFlibPas per la lista delle funzionalità di testo e font