当前位置: 首页 > 知识库问答 >
问题:

PDFBox 以内联方式插入与 TEXT 内联的图像

须景胜
2023-03-14

我第一次使用PDFBox来生成PDF。我有一个文本文档,其中包含由我的java程序生成的一系列约40个多选题。有些问题与小图像相关联,需要在问题上方插入。出于这个原因,我正在将文本文档转换为PDF,并希望在其上插入图像。

我成功地在PDF文档中插入了一张图片,但是它像背景一样嵌入了文本。我希望将图像与文本对齐(如word格式的文本框,内嵌)。看起来插入图像类需要一个绝对位置,这取决于文本的位置。

我怎么知道在哪里画我的图像?

对于信息PDFBox2.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");
        }
    }
}

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

共有1个答案

文寒
2023-03-14

根据这个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

 类似资料:
  • 这种方式在最新的 FreeBSD 版本中有良好的支持, 并在 FreeBSD 使用手册的 联编并安装定制的内核 这章进行了介绍。

  • 目录 9.1 以 “传统” 方式联编内核 9.2 以 “新” 方式联编内核 作为内核开发人员, 了解内核的联编过程是十分重要的。 要调试 FreeBSD 内核, 首先要能够联编它才能够开始。 有两种方法能够完成这个任务: “传统” 方式 “新” 方式 注意: 本章假定读者熟悉在 FreeBSD 使用手册中 联编并安装定制的内核 一章所介绍的方法。 如果不是这样的话, 请阅读这一章, 以了解联编过程

  • 问题内容: 两者之间的性能(在oracle中)是否有区别 和 ? 问题答案: 不!相同的执行计划,请看下面两个表: 使用内部联接的查询的执行计划: 以及使用WHERE子句的查询的执行计划。

  • 问题内容: __Java JIT 何时 内联方法调用?是基于#times调用调用方方法(如果是,该数字是多少?),还是基于其他一些条件(以及那是什么?)? 我已经读过JIT可以内联“最终”方法,但它也可以基于运行时统计信息内联非最终方法,因此想知道触发条件是什么。 我猜答案会根据JVM的实现而有所不同,但是也许所有这些都有共同点吗? 问题答案: 简短的答案是随时随地。 JITC通常会自动内联较小的

  • 操作步骤: 菜单栏: Refactor —>Inline 快捷键: Mac: option+Command + N

  • 问题内容: VS 哪种被认为是 正确的 (语法上)且性能最高的方法,为什么? 后一个示例中的语法对我来说似乎更合乎逻辑,但我的假设是JOIN会更快。 我看过查询计划,还无法从中解密任何内容。 查询计划1 查询计划2 问题答案: 两种语法有不同的用途。假设使用Join语法,则需要StockToCategory和Category表中的某些内容。如果每个类别的StockToCategory表中有多个条目