From 19ea3750222bb116d1c02746dd40fba7699ca4da Mon Sep 17 00:00:00 2001 From: Matus Zamborsky Date: Sun, 9 Apr 2017 12:52:32 +0200 Subject: [PATCH] UNICODE font justification support --- .../pdfboxout/PdfBoxOutputDevice.java | 30 +++++++++++++++---- .../pdfboxout/PdfContentStreamAdapter.java | 26 ++++++++++++++++ 2 files changed, 51 insertions(+), 5 deletions(-) diff --git a/openhtmltopdf-pdfbox/src/main/java/com/openhtmltopdf/pdfboxout/PdfBoxOutputDevice.java b/openhtmltopdf-pdfbox/src/main/java/com/openhtmltopdf/pdfboxout/PdfBoxOutputDevice.java index b5e15eb6e..98590a2b7 100644 --- a/openhtmltopdf-pdfbox/src/main/java/com/openhtmltopdf/pdfboxout/PdfBoxOutputDevice.java +++ b/openhtmltopdf-pdfbox/src/main/java/com/openhtmltopdf/pdfboxout/PdfBoxOutputDevice.java @@ -542,17 +542,37 @@ public void drawStringFast(String s, float x, float y, JustificationInfo info, F _cp.setTextMatrix((float) mx[0], b, c, (float) mx[3], (float) mx[4], (float) mx[5]); if (info != null ) { - // The JustificationInfo numbers need to be normalized using the current document DPI - _cp.setTextSpacing(info.getNonSpaceAdjust() / _dotsPerPoint); - _cp.setSpaceSpacing(info.getSpaceAdjust() / _dotsPerPoint); + // Justification must be done through TJ rendering because Tw param is not working for UNICODE fonts + Object[] array = makeJustificationArray(s, info); + _cp.drawArray(array); } else { _cp.setTextSpacing(0.0f); _cp.setSpaceSpacing(0.0f); + _cp.drawString(s); } - - _cp.drawString(s); + _cp.endText(); } + + private Object[] makeJustificationArray(String s, JustificationInfo info) { + List data = new ArrayList(); + + int len = s.length(); + for (int i = 0; i < len; i++) { + char c = s.charAt(i); + data.add(Character.toString(c)); + if (i != len - 1) { + float offset; + if (c == ' ' || c == '\u00a0' || c == '\u3000') { + offset = info.getSpaceAdjust(); + } else { + offset = info.getNonSpaceAdjust(); + } + data.add((-offset / _dotsPerPoint) * 1000 / (_font.getSize2D() / _dotsPerPoint)); + } + } + return data.toArray(); + } public static class FontRun { String str; diff --git a/openhtmltopdf-pdfbox/src/main/java/com/openhtmltopdf/pdfboxout/PdfContentStreamAdapter.java b/openhtmltopdf-pdfbox/src/main/java/com/openhtmltopdf/pdfboxout/PdfContentStreamAdapter.java index 8225aa390..b56b8f6c1 100644 --- a/openhtmltopdf-pdfbox/src/main/java/com/openhtmltopdf/pdfboxout/PdfContentStreamAdapter.java +++ b/openhtmltopdf-pdfbox/src/main/java/com/openhtmltopdf/pdfboxout/PdfContentStreamAdapter.java @@ -273,6 +273,32 @@ public void drawString(String s) { } } + public void drawArray(Object[] array) { + try { + cs.appendRawCommands("["); + + boolean lastWasNumber = false; + for (Object obj : array) { + if (obj instanceof String) { + drawString((String) obj); + lastWasNumber = false; + } else { + if (lastWasNumber) { + cs.appendRawCommands(' '); + } else { + lastWasNumber = true; + } + + cs.appendRawCommands((Float) obj); + } + } + cs.appendRawCommands("]TJ"); + cs.appendRawCommands('\n'); + } catch (IOException e) { + logAndThrow("drawArray", e); + } + } + public void drawImage(PDImageXObject xobject, float x, float y, float w, float h) { try {