Да, безусловно, можно избежать промежуточного преобразования в JSON. Используя инструмент глубокой копии, такой как Dozer , вы можете преобразовать карту непосредственно в POJO. Ниже приведен упрощенный пример:
Пример POJO:
public class MyPojo implements Serializable {
private static final long serialVersionUID = 1L;
private String id;
private String name;
private Integer age;
private Double savings;
public MyPojo() {
super();
}
// Getters/setters
@Override
public String toString() {
return String.format(
"MyPojo[id = %s, name = %s, age = %s, savings = %s]", getId(),
getName(), getAge(), getSavings());
}
}
Пример кода преобразования:
public class CopyTest {
@Test
public void testCopyMapToPOJO() throws Exception {
final Map map = new HashMap(4);
map.put("id", "5");
map.put("name", "Bob");
map.put("age", "23");
map.put("savings", "2500.39");
map.put("extra", "foo");
final DozerBeanMapper mapper = new DozerBeanMapper();
final MyPojo pojo = mapper.map(map, MyPojo.class);
System.out.println(pojo);
}
}
Выход:
MyPojo [id = 5, name = Bob, age = 23, saving = 2500.39]
blockquote>Примечание: если вы измените исходную карту на
Map
, вы можете скопировать более произвольно глубокие вложенные свойства (сMap
вы получаете только один уровень).
Сообщение Revisited: Tcpdf - Строки таблицы переменной высоты в MultiCell содержат много полезной информации. Это краткий отрывок:
getNumLines ()
... фактически позволяет нам определить, сколько строк будет занимать строка текста при определенной ширине. Фактически, это позволяет нам делать то, что я использовал для возврата MultiCell, без фактического рисования. Это позволяет нам определить максимальную высоту ячейки с помощью одной строки кода:$ linecount = max ($ pdf-> getNumLines ($ row ['cell1data'], 80), $ pdf-> getNumLines ($ row [' cell2data '], 80
Исходя из моего опыта, почти невозможно заранее определить высоту ячейки. Намного проще использовать функции обработки разрывов страницы TCPDF, которые заранее сообщают вам, если вы переходите к разрыву страницы. Вот пример кода:
$yy = $this->pdf->GetY();
$check_pagebreak = $this->pdf->checkPageBreak($height+$padding,$yy,false);
Измените false на true, чтобы разрешить автоматический разрыв страницы, в противном случае вы можете самостоятельно обработать логику разрыва страницы, что я и сделал.
Кроме того, на случай, если вы можете Если это необходимо, вот еще один небольшой совет: рассмотрите возможность использования функций транзакции для создания документа за два прохода. Первый проход используется для определения всех высот и ячеек, разрывов страниц и т. Д. Вы также можете хранить все ваши значения высоты строк и строк на странице в массивах. НА втором проходе,
Я понял :D!!!!!
Создать другой объект pdf2
// pdf2 set x margin to pdf1's xmargin, but y margin to zero
// to make sure that pdf2 has identical settings, you can clone the object (after initializing the main pdf object)
$pdf2 = clone $pdf;
pdf2->addpage
pdf2->writeCell
$height = pdf2->getY()
pdf2->deletePage(pdf2->getPage())
pdf1->checkPageBreak($height);
pdf1->writeCell()
W00tness :D