2017-10-20 90 views
-1

我第一次使用PDFBox生成PDF。我有一个文本文档,它由一系列由我的java程序生成的约40个多项选择题组成。有些问题与需要在问题上面插入的小图片相关联。 因为这个原因,我将文本文档转换为PDF格式,并希望在其上插入图像。PDFBox插入图像内嵌TEXT

我已经设法插入一个图像到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"); 
     } 
    } 
} 

结果输出的文字写在图像的顶部:

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

按照本PDF箱修复: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

有什么书可以帮助我,因为我发现Apache的网站对初学者没有帮助 – AvionicsMan