我正在嘗試使用TextLayout類進行打印。當我打印一些數學符號時,會出現奇怪的行爲。在Java中打印數學符號會產生錯誤的輸出
下圖顯示了將字符串「First + 2」和「First \ u222A 2」打印到PDF文件的結果。當打印「聯合」符號(\ u222A)時,它看起來像符號後面的字符會覆蓋符號前面的字符。
下面是測試代碼打印不包含\ u222A並做另一個字符串的字符串:
public class PrintTest {
public static void main(String[] args) {
PrinterJob pj = PrinterJob.getPrinterJob();
pj.setPrintable(new Printable() {
public int print(Graphics g, PageFormat pf, int pageIndex) {
if (pageIndex != 0) return NO_SUCH_PAGE;
Graphics2D g2 = (Graphics2D) g;
Font font = new Font("SansSerif", Font.PLAIN, 10);
// Draw string with + char
TextLayout layout = new TextLayout("First + 2", font, g2
.getFontRenderContext());
layout.draw(g2, 40, 80);
// Draw string with union character
layout = new TextLayout("First \u222A 2", font, g2
.getFontRenderContext());
layout.draw(g2, 40, 100);
return PAGE_EXISTS;
}
});
if (pj.printDialog()) {
try {
pj.print();
} catch (PrinterException e) {
System.out.println(e.getMessage());
}
}
}
}
我上運行Java 1.7.0_17 Windows 7 & 8,並在多臺打印機上進行了測試,包括打印到PDF。所有測試都顯示相同的問題。我得到了'聯盟','交叉點'和'排除'符號的相同結果。
我真的被困在這裏。任何幫助將不勝感激。
更新:使用邏輯字體時似乎會出現問題。我測試了所有安裝的邏輯字體('Dialog','DialogInput','Monospaced','SansSerif'和'Serif'),並得到了同樣的問題。當我使用支持這些符號的物理字體('Lucida Sans'和'Arial Unicode MS')進行測試時,我獲得了所需的輸出。
這解決了眼前的問題對我來說,因爲我不依賴於使用邏輯字體。
聯合字符被打印,但後面的字符將打印在其前面的字符上。 – user2302873 2013-05-06 02:35:26
好吧,我同意這很奇怪,並表明我不熟悉的問題。但是在尋求幫助時,請不要將其他字符稱爲「非Unicode」,因爲這是不正確的。你所擁有的是一種不經常使用的Unicode字符,它導致看起來像即時回車(沒有換行符)。我不知道會做什麼。如果您有任何其他方法將此字符輸出到此打印機,那麼這些結果會很有趣。您可以嘗試使用像cutePdf這樣的特殊驅動程序打印到文件,然後查看它的功能。祝你好運。 – arcy 2013-05-06 03:39:10
感謝您輸入rcook。我修改了標題和文字以反映您的意見。我還附上了寫給Nitro PDF Creator時得到的輸出圖像。 – user2302873 2013-05-06 04:14:46