Изображение в pdf не преобразуется правильно, используя iTextpdf [duplicate]

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

5
задан shivani 24 November 2014 в 13:23
поделиться

1 ответ

Когда вы это сделаете:

Document document = new Document();

Затем вы неявно создаете документ, страницы которого имеют размер страницы, известный как A4. То есть: ширина 595 и высота 842 пользовательских единиц.

Если вы добавляете меньшие изображения, они не будут обрезаны. Если вы добавите изображения, которые больше. Изображения будут обрезаны ...

Если вы хотите, чтобы изображение точно соответствовало странице, у вас есть две возможности:

  1. Адаптировать размер страниц или
  2. Адаптируйте размер изображения.

Оба варианта эквивалентны, поскольку 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); в обоих случаях. Я вводил эту строку так, чтобы нижний левый угол изображения совпал с нижним левым углом страницы. Если вы этого не сделаете, вы увидите край внизу и влево, и ваше изображение будет обрезано в верхнюю и правую стороны.

9
ответ дан Community 18 August 2018 в 05:04
поделиться
  • 1
    как я могу использовать это для размещения нескольких изображений в виде страниц в pdf ??? Я пробовал свой код, как в моем отредактированном вопросе, где я получаю один PDF-файл с одной страницей только с последним изображением. Пожалуйста, проверьте и сообщите мне, где я ошибся с вашим кодом ... – shivani 24 November 2014 в 13:26
  • 2
    Разве не очевидно, что вы должны добавить document.newPage() каждый раз, когда вы добавили изображение в абсолютную позицию на текущей странице? ;-) – Bruno Lowagie 24 November 2014 в 13:27
  • 3
    Извини, я виноват! Это сработало! Я не совсем знаком с игрой с pdf-файлами в android..так, я не знал точно, что еще писать ... Это первый раз ... В любом случае, спасибо большое! – shivani 24 November 2014 в 13:37
  • 4
    идеальный ответ. – Jagadesh Seeram 27 April 2015 в 14:34
  • 5
    Я пробовал все эти методы. Но все это работает очень медленно. Я использую это на android. – Aditya Chaudhary 12 September 2016 в 08:30
Другие вопросы по тегам:

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