bind()
. 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));
function MyConstructor(data, transport) {
var self = this;
this.data = data;
transport.on('data', function() {
alert(self.data);
});
}
function MyConstructor(data, transport) {
this.data = data;
transport.on('data', () => {
alert(this.data);
});
}
Шрифт - это набор глифов. Такого не существует, как «символ ТАБ». Представьте себе, что вы набираете набор с металлическими глифами 100 лет назад, и какой-то парень (который владеет пишущей машиной) спрашивает вас о «глифовой вкладке».
В пишущей машинке нажатие TAB означает «перейти к следующей позиции вкладки», , Шрифт не знает своей собственной позиции, он знает только внешний вид и размер его глифов. Кроме того, в PDF или PDFBox нет понятия «позиции вкладок». PDF или PDFBox не являются текстовыми редакторами.
И даже с редактором слепое нажатие TAB не всегда радует вас, в зависимости от длины текста, который вы только что написали. Сначала вам нужно будет проверить свою позицию, а затем подумать о том, чтобы попасть в TAB или, возможно, дважды нажать ее.
Вместо этого вы должны сделать следующее: после написания столбца данных вы поместите себя в соответствующую позицию X следующего столбца. С курьерским шрифтом (фиксированным) вы также можете сделать это, вычислив длину строки и добавив соответствующий счетчик пробелов.
Это приводит нас к следующей части - недостающему пространству. Ну, используйте другой шрифт, который имеет пробелы, потому что есть глиф пространства: он выглядит невидимым, но имеет фиксированный размер.
И, наконец, также нет такой вещи, как «символ новой строки». Команда Newline - это команда. Вы уже используете «newLineAtOffset», который должен хорошо работать, чтобы позиционировать себя. См. Ответ mkl о том, как это сделать.
Причина в том, что 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());