Нет глифа для U + 000A в шрифте UbuntuCondensed-Regular в PDFBox 2.0.8 [duplicate]

Вот несколько способов доступа к родительскому контексту внутри дочернего контекста -
  1. Вы можете использовать функцию bind().
  2. Хранить ссылку на контекст / внутри внутри другой переменной (см. пример ниже).
  3. Использовать функции ES6 Arrow .
  4. Изменить код / function design / architecture - для этого вы должны иметь команду над шаблонами проектирования в javascript.

1. Используйте функцию bind()

function MyConstructor(data, transport) {
    this.data = data;
    transport.on('data', ( function () {
        alert(this.data);
    }).bind(this) );
}
// Mock transport object
var transport = {
    on: function(event, callback) {
        setTimeout(callback, 1000);
    }
};
// called as
var obj = new MyConstructor('foo', transport);

Если вы используете underscore.js - http://underscorejs.org/#bind

transport.on('data', _.bind(function () {
    alert(this.data);
}, this));

2 Сохраните ссылку на контекст / внутри внутри другой переменной

function MyConstructor(data, transport) {
  var self = this;
  this.data = data;
  transport.on('data', function() {
    alert(self.data);
  });
}

3 Функция стрелки

function MyConstructor(data, transport) {
  this.data = data;
  transport.on('data', () => {
    alert(this.data);
  });
}
2
задан Mike 'Pomax' Kamermans 1 January 2016 в 08:38
поделиться

2 ответа

Шрифт - это набор глифов. Такого не существует, как «символ ТАБ». Представьте себе, что вы набираете набор с металлическими глифами 100 лет назад, и какой-то парень (который владеет пишущей машиной) спрашивает вас о «глифовой вкладке».

В пишущей машинке нажатие TAB означает «перейти к следующей позиции вкладки», , Шрифт не знает своей собственной позиции, он знает только внешний вид и размер его глифов. Кроме того, в PDF или PDFBox нет понятия «позиции вкладок». PDF или PDFBox не являются текстовыми редакторами.

И даже с редактором слепое нажатие TAB не всегда радует вас, в зависимости от длины текста, который вы только что написали. Сначала вам нужно будет проверить свою позицию, а затем подумать о том, чтобы попасть в TAB или, возможно, дважды нажать ее.

Вместо этого вы должны сделать следующее: после написания столбца данных вы поместите себя в соответствующую позицию X следующего столбца. С курьерским шрифтом (фиксированным) вы также можете сделать это, вычислив длину строки и добавив соответствующий счетчик пробелов.

Это приводит нас к следующей части - недостающему пространству. Ну, используйте другой шрифт, который имеет пробелы, потому что есть глиф пространства: он выглядит невидимым, но имеет фиксированный размер.

И, наконец, также нет такой вещи, как «символ новой строки». Команда Newline - это команда. Вы уже используете «newLineAtOffset», который должен хорошо работать, чтобы позиционировать себя. См. Ответ mkl о том, как это сделать.

4
ответ дан Tilman Hausherr 22 August 2018 в 14:00
поделиться
  • 1
    следующая часть, недостающее пространство - Учитывая исключение OP, я сомневаюсь, что есть настоящая проблема с пространственными глифами. – mkl 1 January 2016 в 10:20
  • 2
    @mkl да, возможно, но никто не знает, какие странные шрифты люди используют. И я хотел опубликовать написание «всех очень запутанных людей». чтобы объяснить разницу между пространством и вкладкой. – Tilman Hausherr 1 January 2016 в 10:23

Причина в том, что PDPageContentStream.showText(String) может только показывать текст , он не может выполнять никаких дополнительных макетов, например, интерпретировать горизонтальные вкладки, разрывы строк или другие управляющие символы; Тильман подробно объяснил это в своем ответе.

Вы могли бы достичь своей цели примерно следующим образом:

contentStream.newLineAtOffset(xPosition, yPosition);
contentStream.showText("Member #: "+ student.getMembershipNumber());
contentStream.newLineAtOffset(200, 0);
contentStream.showText("Grade: " + getStudentGradeInSchool(student.getYearGraduate()));
contentStream.newLineAtOffset(200, 0);
contentStream.showText("Year Joined: " + student.getYearJoined());
contentStream.newLineAtOffset(-400, -12);
contentStream.showText("Name: " + student.getFirstName() + " " + student.getLastName());
contentStream.newLineAtOffset(0, -12);
contentStream.showText("Amount Owed: $" + student.getAmountOwed());
2
ответ дан mkl 22 August 2018 в 14:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: