복붙노트

[SPRING] 이미지에 텍스트를 추가하는 방법은 무엇입니까?

SPRING

이미지에 텍스트를 추가하는 방법은 무엇입니까?

내 프로젝트에서 iText를 사용하여 PDF 문서를 생성합니다.

페이지의 높이가 500pt (1 사용자 단위 = 1 포인트)이고, 페이지에 텍스트를 쓰고 이미지가 뒤따라 간다고 가정합니다.

콘텐츠와 이미지가 450pt 미만을 필요로하는 경우 텍스트가 이미지보다 우선합니다. 내용과 이미지가 450pt를 초과하면 텍스트는 다음 페이지로 전달됩니다.

내 질문은 : 이미지를 작성하기 전에 남은 사용 가능한 공간을 얻으려면 어떻게해야합니까?

해결법

  1. ==============================

    1.먼저, 텍스트와 이미지를 페이지에 추가 할 때 iText는 텍스트 내용과 이미지의 순서를 변경합니다. 다음을 사용하여이를 피할 수 있습니다.

    먼저, 텍스트와 이미지를 페이지에 추가 할 때 iText는 텍스트 내용과 이미지의 순서를 변경합니다. 다음을 사용하여이를 피할 수 있습니다.

    writer.setStrictImageSequence(true);
    

    "커서"의 현재 위치를 알고 싶다면 getVerticalPosition () 메서드를 사용할 수 있습니다. 불행하게도,이 메소드는 그리 우아하지 않습니다. 새 라인을 추가하거나 (true 인 경우) 현재 라인에서 위치를 제공하는 부울 매개 변수가 필요합니다 (false 인 경우).

    나는 왜 당신이 수직 입장을 취하고 싶은지 이해하지 못합니다. 캡션 뒤에 이미지가 있고 캡션과 이미지를 같은 페이지에 넣기를 원하기 때문입니까?

    이 경우 텍스트와 이미지를 표 셀 안에 넣고 iText에 행을 분할하지 않도록 지시 할 수 있습니다. 이 경우 iText는 내용이 현재 페이지에 맞지 않으면 텍스트와 이미지를 올바른 순서로 다음 페이지로 전달합니다.

    최신 정보:

    덧글에 추가 된 추가 정보에 따라 OP가 워터 마킹 된 이미지를 추가하려고합니다.

    실제 요구 사항에 따라이를 달성하기위한 두 가지 접근 방법이 있습니다.

    접근법 1 :

    첫 번째 접근법은 WatermarkedImages1 예제에서 설명합니다. 이 예제에서 우리는 이미지를 추가 할 PdfTemplate과 그 이미지 위에 쓰여진 텍스트를 생성합니다. 그런 다음이 PdfTemplate을 이미지 안에 넣고 단일 document.add () 문을 사용하여 해당 이미지를 워터 마크와 함께 추가 할 수 있습니다.

    이것은 모든 마법을 수행하는 방법입니다 :

    public Image getWatermarkedImage(PdfContentByte cb, Image img, String watermark) throws DocumentException {
        float width = img.getScaledWidth();
        float height = img.getScaledHeight();
        PdfTemplate template = cb.createTemplate(width, height);
        template.addImage(img, width, 0, 0, height, 0, 0);
        ColumnText.showTextAligned(template, Element.ALIGN_CENTER,
                new Phrase(watermark, FONT), width / 2, height / 2, 30);
        return Image.getInstance(template);
    }
    

    다음은 이미지를 추가하는 방법입니다.

    PdfContentByte cb = writer.getDirectContentUnder();
    document.add(getWatermarkedImage(cb, Image.getInstance(IMAGE1), "Bruno"));
    document.add(getWatermarkedImage(cb, Image.getInstance(IMAGE2), "Dog"));
    document.add(getWatermarkedImage(cb, Image.getInstance(IMAGE3), "Fox"));
    Image img = Image.getInstance(IMAGE4);
    img.scaleToFit(400, 700);
    document.add(getWatermarkedImage(cb, img, "Bruno and Ingeborg"));
    

    보시다시피, 우리에게는 하나의 매우 큰 이미지 (내 아내와 저의 사진)가 있습니다. 이 이미지가 페이지에 맞도록 크기를 조정해야합니다. 이것을 피하려면 두 번째 접근법을 살펴보십시오.

    접근법 2 :

    두 번째 방법은 WatermarkedImages2 예제에서 설명합니다. 이 경우 각 이미지를 PdfPCell에 추가합니다. 이 PdfPCell은 이미지를 페이지의 너비에 맞도록 크기를 조정합니다. 워터 마크를 추가하려면 셀 이벤트를 사용합니다.

    class WatermarkedCell implements PdfPCellEvent {
        String watermark;
    
        public WatermarkedCell(String watermark) {
            this.watermark = watermark;
        }
    
        public void cellLayout(PdfPCell cell, Rectangle position,
            PdfContentByte[] canvases) {
            PdfContentByte canvas = canvases[PdfPTable.TEXTCANVAS];
            ColumnText.showTextAligned(canvas, Element.ALIGN_CENTER,
                new Phrase(watermark, FONT),
                (position.getLeft() + position.getRight()) / 2,
                (position.getBottom() + position.getTop()) / 2, 30);
        }
    }
    

    이 셀 이벤트는 다음과 같이 사용할 수 있습니다.

    PdfPCell cell;
    cell = new PdfPCell(Image.getInstance(IMAGE1), true);
    cell.setCellEvent(new WatermarkedCell("Bruno"));
    table.addCell(cell);
    cell = new PdfPCell(Image.getInstance(IMAGE2), true);
    cell.setCellEvent(new WatermarkedCell("Dog"));
    table.addCell(cell);
    cell = new PdfPCell(Image.getInstance(IMAGE3), true);
    cell.setCellEvent(new WatermarkedCell("Fox"));
    table.addCell(cell);
    cell = new PdfPCell(Image.getInstance(IMAGE4), true);
    cell.setCellEvent(new WatermarkedCell("Bruno and Ingeborg"));
    table.addCell(cell);
    

    모든 이미지의 크기가 동일하거나 더 크거나 페이지에 이미지를 맞추는 것에 대해 걱정하지 않으려는 경우이 방법을 사용합니다.

    고려:

    분명히, 두 가지 접근 방식은 디자인 선택 때문에 다른 결과를 낳습니다. 결과 PDF를 비교하여 차이점을 확인하십시오 : watermark_template.pdf 대 watermark_table.pdf

  2. from https://stackoverflow.com/questions/26814958/how-to-add-text-to-an-image by cc-by-sa and MIT license