Я использую PDFBox 2.0.0-SNAPSHOT для создания PDF-файла на Java. Он отлично работает для очень простых символов (например, [a-zA-Z9-0]
), но я получаю ошибки кодирования для более продвинутых символов, таких как ’
(quoteright
). Вот мой код:PDFBox «специальные» символы в Helvetica
PDDocument pdf = new PDDocument();
PDPage page = new PDPage(PDRectangle.A4);
pdf.addPage(page);
PDPageContentStream contents = new PDPageContentStream(pdf, page);
PDFont font = PDType1Font.HELVETICA;
contents.beginText();
contents.setFont(font, 12);
// ...
String text = "’";
contents.showText(text);
contents.endText();
contents.close();
Я получаю это исключение:
не может кодировать U + 2019 в шрифт Helvetica. Type 1 шрифты поддерживают только 8-битные код точки
Я посмотрел поддерживаемые символы для не внедренных шрифтов в разделе D.1 из PDF specification, и этого символ должен быть поддержан.
В самом деле, если я использую this trick, я могу вставить нужный символ:
// ...
// String text = "’";
// contents.showText(text);
byte[] commands = "(x) Tj ".getBytes();
commands[1] = (byte)145; // = 221 octal = quoteright in WinAnsi
contents.appendRawCommands(commands);
// ...
Но это на самом деле не является практичным решением. Помимо неудобства ручного поиска каждого символа, который может быть в строке, метод appendRawCommands
теперь устарел.
Итак, что здесь происходит? От the answer from above подразумевается, что у showText
не должно быть проблем со старым методом drawString
, но что-то явно не работает.
EDIT: Как было предложено в комментариях, вот полный стек след за исключением:
Exception in thread "main" java.lang.IllegalArgumentException: Can't encode U+2019 in font Helvetica. Type 1 fonts only support 8-bit code points
at org.apache.pdfbox.pdmodel.font.PDType1Font.encode(PDType1Font.java:343)
at org.apache.pdfbox.pdmodel.font.PDFont.encode(PDFont.java:285)
at org.apache.pdfbox.pdmodel.font.PDFont.getStringWidth(PDFont.java:314)
at com.fatfractal.test.PDFBoxTest.textWidth(PDFBoxTest.java:148)
at com.fatfractal.test.PDFBoxTest.showFlowingTextAt(PDFBoxTest.java:128)
at com.fatfractal.test.PDFBoxTest.build(PDFBoxTest.java:73)
at com.fatfractal.test.PDFBoxTest.main(PDFBoxTest.java:97)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Возможный дубликат: http://stackoverflow.com/questions/5425251/using-pdfbox-to-write-utf-8-encoded-strings-to-a-pdf –
Это не дубликат, символы I ' о которых говорят в базовых шрифтах в соответствии со спецификацией. – shawkinaw
Вы ссылаетесь на Adobe vs pdfbox, что вы ожидаете от ссылки на источник, например, https: //pdfbox.apache.org/2.0/... Вы знаете, что Adobe не делает PDFBox? Apache поддерживает pdfbox, почему вы ссылаетесь на то, что adobe может делать VS, что может делать pdfbox (когда эти два совершенно разные вещи)? –