【发布时间】:2017-10-20 11:33:02
【问题描述】:
我是第一次使用 PDFBox 来生成 PDF。我有一个文本文档,其中包含由我的 java 程序生成的一系列约 40 个多项选择题。一些问题与需要插入问题上方的小图像相关联。 出于这个原因,我将文本文档转换为 PDF 并希望在其上插入图像。
我已设法将图像插入 PDF 文档,但它像背景一样覆盖文本。 我想将图像与文本对齐(如 word 格式文本框,内联)。 似乎插入图像类需要一个绝对位置,这取决于文本的位置。
我怎么知道在哪里绘制我的图像?
了解 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");
}
}
}
在图像顶部显示文本的结果输出:
【问题讨论】:
-
稍微改进了格式
-
您似乎尝试使用其他帐户添加代码。请使用您创建问题的帐户和edit问题本身添加代码。
-
调用
contentStream.newLine();时,前导值设置垂直移动。因此,您应该做的是在绘制图像时使用适当的值。因此,只需从初始值(例如 700)中减去前导(14.5)所需的时间,并将其用于 drawImage。 -
“需要在问题上方插入的小图片”和“我想将图片与文字对齐”.. .这些句子似乎矛盾,还是我误解了“内联”这个词?
-
我又读了一遍全文...恕我直言,唯一的问题似乎是您无法决定将图像放在哪里。您需要自己进行这些计算,即没有可以询问“我目前在哪里”的“光标”。