Добавить несколько изображений в один PDF-файл с iText, используя Java

1

У меня есть следующий код, но этот код добавляет только последнее изображение в pdf.

    try {
        filePath = (filePath != null && filePath.endsWith(".pdf")) ? filePath
                : filePath + ".pdf";
        Document document = new Document();
        PdfWriter writer = PdfWriter.getInstance(document,
                new FileOutputStream(filePath));
        document.open();    
        // document.add(new Paragraph("Image Example"));
        for (String imageIpath : imagePathsList) {

            // Add Image
            Image image1 = Image.getInstance(imageIpath);
            // Fixed Positioning
            image1.setAbsolutePosition(10f, 10f);
            // Scale to new height and new width of image
            image1.scaleAbsolute(600, 800);
            // image1.scalePercent(0.5f);
            // Add to document
            document.add(image1);
            //document.bottom();


        }
        writer.close();

    } catch (Exception e) {
        LOGGER.error(e.getMessage());
    }

Не могли бы вы дать мне подсказку о том, как обновить код, чтобы добавить все изображения в экспортированный pdf файл? imagePathsList содержит все пути изображений, которые я хочу добавить в один PDF файл.

С наилучшими пожеланиями, Аврелиан

  • 0
    Можете ли вы предоставить мне версию Itext, которую вы используете? Возможный дубликат stackoverflow.com/questions/27425738/…
Теги:
image
pdf
itext

2 ответа

4
Лучший ответ

Взгляните на пример MultipleImages, и вы обнаружите, что в вашем коде есть две ошибки:

  1. Вы создаете страницу размером 595 x 842 пользовательских единиц и добавляете каждое изображение на эту страницу независимо от размеров изображения.
  2. Вы утверждаете, что добавлено только одно изображение, но это не так. Вы добавляете все изображения друг к другу на одной странице. Последнее изображение охватывает все предыдущие изображения.

Взгляните на мой код:

public void createPdf(String dest) throws IOException, DocumentException {
    Image img = Image.getInstance(IMAGES[0]);
    Document document = new Document(img);
    PdfWriter.getInstance(document, new FileOutputStream(dest));
    document.open();
    for (String image : IMAGES) {
        img = Image.getInstance(image);
        document.setPageSize(img);
        document.newPage();
        img.setAbsolutePosition(0, 0);
        document.add(img);
    }
    document.close();
}

Я создаю экземпляр Document используя размер первого изображения. Затем я перебираю массив изображений, устанавливая размер страницы следующей страницы на размер каждого изображения, прежде чем запускать newPage() [*]. Затем я добавляю изображение в координату 0, 0, потому что теперь размер изображения будет соответствовать размеру каждой страницы.

[*] Метод newPage() действует только если что-то было добавлено на текущую страницу. Когда вы впервые проходите цикл, ничего еще не добавлено, поэтому ничего не происходит. Вот почему вам нужно установить размер страницы в размере первого изображения при создании экземпляра Document.

  • 0
    спасибо за ваш комментарий.
  • 0
    @ Bruno, я создал pdf, используя приведенный выше код, но после открытия pdf он показывает неверную ошибку формата pdf.
Показать ещё 1 комментарий
0

Android имеет функцию "PdfDocument" для достижения этой цели,

class Main2Activity : AppCompatActivity() {

private var imgFiles: Array<File?>? = null
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main2)

    imgFiles= arrayOfNulls(2)

    imgFiles!![0] = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString() + "/doc1.png")
    imgFiles!![1] = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString() + "/doc3.png")



    val file = getOutputFile(File(Environment.getExternalStorageDirectory().absolutePath)
            , "/output.pdf")

    val fOut = FileOutputStream(file)
    val document = PdfDocument()

    var i = 0
    imgFiles?.forEach {
        i++
        val bitmap = BitmapFactory.decodeFile(it?.path)
        val pageInfo = PdfDocument.PageInfo.Builder(bitmap.width, bitmap.height, i).create()
        val page = document.startPage(pageInfo)
        val canvas = page?.canvas
        val paint = Paint()
        canvas?.drawPaint(paint)
        paint.color = Color.BLUE;
        canvas?.drawBitmap(bitmap, 0f, 0f, null)
        document.finishPage(page)
        bitmap.recycle()
    }
    document.writeTo(fOut)
    document.close()        

}

private fun getOutputFile(path: File, fileName: String): File? {
    if (!path.exists()) {
        path.mkdirs()
    }
    val file = File(path, fileName)
    try {
        if (file.exists()) {
            file.delete()
        }
        file.createNewFile()

    } catch (e: Exception) {
        e.printStackTrace()
    }
    return file
}

}

наконец, разрешить разрешение хранилища в манифесте, это должно работать

Ещё вопросы

Сообщество Overcoder
Наверх
Меню