2017-10-20 3 views
-1

PDF를 처음 생성 할 때 PDFBox를 사용하고 있습니다. 내 Java 프로그램에서 생성 된 약 40 개의 객관식 질문으로 구성된 텍스트 문서가 있습니다. 질문 중 일부는 질문 위에 삽입해야하는 작은 이미지와 관련이 있습니다. 이러한 이유로 텍스트 문서를 PDF로 변환하고 이미지를 삽입하려고합니다.PDFBox 이미지를 텍스트 인라인으로 삽입

이미지를 PDF 문서에 삽입 할 수 있었지만 배경처럼 텍스트가 언더 레이로 표시되었습니다. 텍스트와 함께 이미지를 배치하려고합니다 (단어 형식 텍스트 상자 인라인처럼). 삽입 이미지 클래스는 텍스트의 위치에 따라 절대 위치가 필요합니다.

이미지를 어디에서 그릴 수 있습니까? 이미지 위에 기록 된 텍스트 정보 PDFBox에 대한

이 2.0.7.jar

import ExamDatabase.ReadInputFile; 
import java.io.IOException; 
import java.util.ArrayList; 
import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.pdmodel.PDPage; 
import org.apache.pdfbox.pdmodel.PDPageContentStream; 
import org.apache.pdfbox.pdmodel.font.PDFont; 
import org.apache.pdfbox.pdmodel.font.PDType1Font; 
import org.apache.pdfbox.pdmodel.font.PDFontFactory;//???look up 
import org.apache.pdfbox.pdmodel.font.PDTrueTypeFont; 
import org.apache.pdfbox.pdmodel.font.PDType3Font; 
import org.apache.pdfbox.pdmodel.font.PDSimpleFont; 
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; 
import org.apache.pdfbox.pdmodel.graphics.image.PDInlineImage; 

/** 
* 
* @author Steve carr 
*/ 
public class HelloWorldPdf1_1_1 
{ 
    //runs 

    /** 
    * @param args the command line arguments 
    * @throws java.io.IOException 
    */ 
    public static void main(String[] args) throws IOException 
    { 

     ReadInputFile fileI = new ReadInputFile();// read plain text file text file 
     ArrayList<String> localList = fileI.readerNew(); 

     // Create a document and add a page to it 
     try (PDDocument document = new PDDocument()) 
     { 
      PDPage page = new PDPage(); 
      document.addPage(page); 

      // Create a new font1 object selecting one of the PDF base fonts 
      PDFont font1 = PDType1Font.HELVETICA;//TIMES_ROMAN; 
      PDFont font2 = PDType1Font.TIMES_ROMAN; 
      PDFont font3 = PDType1Font.COURIER_BOLD; 

      try (PDPageContentStream contentStream = new PDPageContentStream(document, page)) 
      { 

       //Creating PDImageXObject object 
       PDImageXObject pdImage = PDImageXObject.createFromFile("C:/PdfBox_Examples/CARD00.GIF", document); 

       //**creating the PDPageContentStream object 
       //PDPageContentStream contents = new PDPageContentStream(document, page); 
       //**Drawing the image in the PDF document   
       contentStream.drawImage(pdImage, 100, 500, 50, 70);//1ST number is horizontal posn from left 

       //****TEXTTEXTTEXTTEXT 
       // Define a text content stream using the selected font1, moving the cursor and drawing the text "Hello World" 
       contentStream.beginText(); 

       contentStream.setFont(font1, 11); 

       contentStream.newLineAtOffset(0, 0); 
       contentStream.setCharacterSpacing(0); 
       contentStream.setWordSpacing(0); 
       contentStream.setLeading(0); 
       contentStream.setLeading(14.5f);// this was key for some reason 

       contentStream.moveTextPositionByAmount(100, 700);// sets the start point of text 

       System.out.println("localList.size= " + localList.size());//just checking within bounds during testing 

       String line; 
       int i; 

       for (i = 0; i < 138; ++i) 
       { 
        System.out.println(localList.get(i)); 
        line = localList.get(i); 

        contentStream.drawString(line); 
        contentStream.newLine(); 
       } 

       contentStream.endText(); 
       //****************************************************** 
       // Make sure that the content stream is closed: 
       contentStream.close(); 
      } 

      // Save the results and ensure that the document is properly closed: 
      document.save("Hello World.pdf"); 
     } 
    } 
} 

결과 출력 :

이 PDF 상자의 수정 사항에 따라 result output with text written on top of image

+0

당신이 시도 것으로 보인다 – Maxim

+0

조금 서식 개선 다른 계정을 사용하여 코드를 추가하십시오. 코드를 추가하려면 질문을 만든 계정을 사용하고 질문 [] (https://stackoverflow.com/posts/46848230/edit)을 사용하십시오. – mkl

+0

'contentStream.newLine();'을 호출 할 때 선행 값은 수직 이동을 설정합니다. 따라서 이미지를 그릴 때 적절한 값을 사용하십시오. 따라서 초기 값 (예 : 700)에서 필요한 시간 (14.5)을 빼고 drawImage에 사용하십시오. –

답변

1

: https://issues.apache.org/jira/browse/PDFBOX-738, 투명성이 유지됩니다 rgba가 설정된 경우에만. 투명도가 유지되면 오버레이가 아닌 다른 텍스트와 인라인으로 표시되므로 문제의 첫 번째 부분 인 오버레이 문제에 대한 해결책이 될 수 있습니다.

그리고이 예제는 특정 텍스트가 차지하는 폭을 계산하기 때문에 어디 옆에있는 텍스트 후 이미지를 배치하는 계산하는 방법을 찾을 수 있습니다 : https://svn.apache.org/viewvc/pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/interactive/form/DetermineTextFitsField.java?revision=1749360&view=markup

+0

내 출력은 다음과 같아야합니다 : – AvionicsMan

+0

내 pdf는 다음과 같아야합니다. -/작은 이미지/새 줄 다음 텍스트 시작 및 끝 텍스트/새 줄/작은 이미지/새 줄 다음 텍스트 시작 및 줄 바꿈/줄 바꿈/작은 이미지/새 줄 다음 텍스트 시작 및 텍스트/줄 바꿈/작은 이미지/줄 바꿈 텍스트 시작 및 줄 바꿈/줄 바꿈/작은 줄 바꾸기/줄 바꿈 텍스트 끝 줄/줄 바꿈/작은 줄 바꾸기/줄 바꿈 텍스트 및 종료 텍스트/등. 여러 질문을 처음에는 작은 이미지가있는 다중 선택 시험. 그것의 연민 나는 예제를 첨부 할 수 없다 – AvionicsMan

+0

내가 아파치 사이트 초보자를위한 도움이 도움이 찾을 수있는 책이 있습니까 – AvionicsMan

관련 문제