Мащабирайте изображението, за да запълните няколко страници с iText

Опитвам се да мащабирам изображение с iText (на нов PDF документ), за да го накарам да запълни ширината на страницата без разтягане, така че да може да отнеме няколко страници.

Намерих много решения, но те бяха доста сложни и не харесвам такова кодиране. Най-доброто решение, което съм намерил досега (от друг въпрос на SO) е използването на PdfTable, но винаги използва една страница, мащабирайки изображението.

// Load image from external storage
Image image = Image.getInstance(path + "/img.png");
// Calculate ratio
float width = PageSize.A4.getWidth();
float heightRatio = image.getHeight() * width / image.getWidth();
Document document = new Document();
document.open();
PdfPTable table = new PdfPTable(1);
table.setWidthPercentage(100);
PdfPCell c = new PdfPCell(image, true);
c.setBorder(PdfPCell.NO_BORDER);
c.setPadding(0);
// Set image dimensions
c.getImage().scaleToFit(width, heightRatio);
table.addCell(c);
document.add(table);
// Write PDF file
document.close();

Някакви предположения?


person afe    schedule 21.12.2015    source източник
comment
В PDF всяка страница има свое собствено платно. Ако изображението е начертано върху платно от една страница, това може да повлияе само на външния вид на същата страница, няма ефект върху другите. Това, което можете да направите, е да нарисувате едно и също изображение на няколко страници с подходящо избрани позиции на изображението. позиция на изображението   -  person mkl    schedule 21.12.2015
comment
Благодаря @Bruno, разбирам. В момента се опитвам да разреша проблема по този начин. Намерих и този отговор на вашите разработчици. itextpdf.com/question/ (поне предполагам от снимката, че сте били вие ;)).   -  person afe    schedule 21.12.2015
comment
Коментарът е предоставен от @mkl, но си прав, човекът на снимката съм аз, а жената до мен е жена ми ;-) Този пример решава ли проблема ти? Не е толкова сложно, нали?   -  person Bruno Lowagie    schedule 21.12.2015
comment
Не, @Bruno, не е, просто се надявах да го направя по по-чист начин. В отговора по-долу моето решение, базирано на същото.   -  person afe    schedule 21.12.2015


Отговори (1)


Добре, най-накрая реших да тръгна по начина, по който не исках, тъй като изглежда, че това е единственият начин: добавяне на едно и също изображение към всяка страница и задаване на правилното вертикално отместване на всяка от тях. Отместването се изчислява като броя на страниците, останали за изчертаване + празнината, която остава празна. За всяка стъпка намалявам броя на страниците, докато не остане нищо за рисуване.

// Open new PDF file
Document document = new Document();
PdfWriter pdfWriter = PdfWriter.getInstance(document, new FileOutputStream(getSharedDirPath() + File.separator + "file.pdf"));

document.open();
PdfContentByte content = pdfWriter.getDirectContent();

// Load image from external folder
Image image = Image.getInstance(path + "/img.png");
image.scaleAbsolute(PageSize.A4);
image.setAbsolutePosition(0, 0);

float width = PageSize.A4.getWidth();
float heightRatio = image.getHeight() * width / image.getWidth();
int nPages = (int) (heightRatio / PageSize.A4.getHeight());
float difference = heightRatio % PageSize.A4.getHeight();

while (nPages >= 0) {
    document.newPage();
    content.addImage(image, width, 0, 0, heightRatio, 0, -((--nPages * PageSize.A4.getHeight()) + difference));
}

// Write PDF file
document.close();

Честно казано, не ми харесва това решение, мислех, че е възможно автоматично да коригирам размерите, както правя в текстов редактор, но в крайна сметка не беше много трудно.....просто ми отне три дни, за да разбера как всичко с PDF работи.

person afe    schedule 21.12.2015
comment
Честно казано не ми харесва това решение - няма причина да не го правя. - person mkl; 21.12.2015
comment
Разбира се, че няма. De gustibus non disputandum est. - person afe; 21.12.2015
comment
няма причина в смисъл на няма принципно по-добър начин да го направите - person mkl; 21.12.2015
comment
Използвам метода scaleToFit(), за да мащабирам изображение в едно измерение, като същевременно запазвам съотношението на страните непокътнато. Например във вашия случай бих направил: image.scaleToFit(PageSize.A4.getWidth(), 10000); Като използвам изключително голяма стойност в посока y, изображението ще се мащабира в посока x и височината ще се адаптира съответно, като се запази съотношението на страните. - person Bruno Lowagie; 21.12.2015
comment
да mkl, разбрах, първо си помислих, че има по-добър начин. @Bruno, ще опитам това. Както и да е, мисля, че е безполезно, тъй като трябва да задам ширина и височина ръчно в извикването на addImage, нали? - person afe; 21.12.2015