Когда вы это сделаете:
Document document = new Document();
Затем вы неявно создаете документ, страницы которого имеют размер страницы, известный как A4. То есть: ширина 595 и высота 842 пользовательских единиц.
Если вы добавляете меньшие изображения, они не будут обрезаны. Если вы добавите изображения, которые больше. Изображения будут обрезаны ...
Если вы хотите, чтобы изображение точно соответствовало странице, у вас есть две возможности:
Оба варианта эквивалентны, поскольку iText не изменит разрешение изображений: каждый пиксель будет сохранен.
Вариант 1:
См. мой ответ на вопрос: Добавление карт в iText Java
В этом вопросе я делаю это:
Image img = Image.getInstance(IMG);
Document document = new Document(img);
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
document.open();
img.setAbsolutePosition(0, 0);
document.add(img);
document.close();
Объект Document
принимает параметр Rectangle
как. Этот Rectangle
определяет размер страницы в пользовательских единицах. Поскольку класс Image
является подклассом класса Rectangle
, я могу использовать экземпляр Image
в качестве параметра для создания экземпляра Document
.
Другим вариантом было бы это сделать:
Rectangle pagesize = new Rectangle(img.getScaledWidth(), img.getScaledHeight());
Document document = new Document(pagesize);
Если ваш документ имеет разные страницы, вы должны использовать метод setPageSize()
перед тем, как запускает новую страницу.
Вариант 2:
См. мой ответ на вопрос: Backgroundimage в ландшафте и обложка всего pdf с iTextSharp
Код выглядит так (ну, фактический код немного отличается , но это тоже будет работать):
Document document = new Document(PageSize.A4.rotate());
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
document.open();
Image image = Image.getInstance(IMAGE);
image.scaleAbsolute(PageSize.A4.rotate());
image.setAbsolutePosition(0, 0);
document.add(image);
document.close();
Здесь у меня есть страницы с размером A4 в альбомной ориентации, и я масштабирую изображение так, чтобы оно полностью соответствовало странице. Это опасно, потому что это изменяет соотношение сторон изображения. Это может привести к искажению изображений. Замена scaleAbsolute()
на scaleToFit()
позволит избежать этой проблемы, но у вас будет несколько белых полей, если соотношение сторон изображения отличается от пропорции страницы.
Важно: Примечание. что я использовал setAbsolutePosition(0, 0);
в обоих случаях. Я вводил эту строку так, чтобы нижний левый угол изображения совпал с нижним левым углом страницы. Если вы этого не сделаете, вы увидите край внизу и влево, и ваше изображение будет обрезано в верхнюю и правую стороны.