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

添加图像时PDFBox内存不足

狄易安
2023-03-14

我正在使用PDFBox从我的webapp中提取数据并将其放入PDF。我有一个方法,在每个PDF页面上绘制标题。但是,当我向每个页面添加图像时,文档的内存就会耗尽。我想知道有没有人有什么解决的办法?下面是我的drawHeader方法:

public static void drawHeader(PDDocument doc,PDPage page,PDPageContentStream contentStream,int[]columnWidths,IntPageNumber)抛出IOException{

    contentStream.beginText();
    PDFont font = PDType1Font.HELVETICA_BOLD;
    contentStream.setFont(font, 24);
    contentStream.moveTextPositionByAmount(50, 750);
    contentStream.drawString("Producer License Report");
    contentStream.endText();

    contentStream.beginText();
    contentStream.moveTextPositionByAmount(550, 750); 

    contentStream.setFont(PDType1Font.HELVETICA_BOLD, 8);
    contentStream.drawString("Page " + pageNumber);
    contentStream.endText();

    contentStream.drawLine(50, 740, 340, 740);
    contentStream.drawLine(16, 680, 595, 680);

    List<String> headerList = new LinkedList<String>();
    headerList.add("NPN");
    headerList.add("First Name");
    headerList.add("Last Name");
    headerList.add("Suffix");
    headerList.add("License State");
    headerList.add("Resident State");
    headerList.add("License Number");

    contentStream.setFont(PDType1Font.HELVETICA_BOLD, 9);
    float textx = 15;
    float texty = 685;

    InputStream in = new FileInputStream(new File("logo.jpg"));
    PDJpeg img = new PDJpeg(doc, in);
    contentStream.drawImage(img, 375, 720);


    for (int i = 0; i < headerList.size(); i++) {
        String text = headerList.get(i);
        contentStream.beginText();
        contentStream.moveTextPositionByAmount(textx, texty);
        contentStream.drawString(text);
        contentStream.endText();
        textx += (columnWidths[i] * 6.5);
    }
}

共有2个答案

杜河
2023-03-14

我正试着评论蒂莫·霍恩的回答,但还没有足够的代表权...

我发现“内存不足”错误的另一个问题是如果图像很大,或者您试图将其从页面上画出来。

从坐标100,100开始,然后从那里开始工作。

例如ContentStream.DrawImage(img,100,100);

干杯,

萨姆

冯和硕
2023-03-14

我找到解决办法了!您必须在打开ContentStream之前创建Image-Object。

示例:

   /* Step 1: Prepare the document.
               */
             doc = new PDDocument();
             PDPage page = new PDPage();
             doc.addPage(page);

             /* Step 2: Prepare the image
              * PDJpeg is the class you use when dealing with jpg images.
              * You will need to mention the jpg file and the document to which it is to be added
              * Note that if you complete these steps after the creating the content stream the PDF
              * file created will show "Out of memory" error.
              */

             PDXObjectImage image = null;
             image = new PDJpeg(doc, new FileInputStream("image.jpg"));
             PDPageContentStream contentStream = new PDPageContentStream(doc,
                    page);
....
 类似资料:
  • 我正在使用pdfbox 2.0.8-需要创建一个层,并在那里添加一些图形。 我从如何修改pdf中的现有层(可选内容组)开始? 然而,这是基于1.8。我试图适应2.0,并设法创建了该层,但完全不清楚如何创建新资源并将其添加到该层,即如何创建道具。putMapping(resourceName,layer);必须重写1.8中的内容

  • 你可以将图像(BMP、JPG、JPEG 或 PNG 文件)插入模型中以进行设计或标识模型。若要添加一个新的图像,点击工具栏的 “图像”按钮,并点击画布的任意位置。然后,在打开对话框中选择图像。 在画布中图像对象的弹出式菜单选项包括: 选项 描述 重设大小 重新设置图像的大小为它的原始大小。 重设高宽比率 保持图像的原始宽度与高度的比率。 剪切 从图表移除图像并放它在剪贴板。 复制 从图表复制图像到

  • 你可以将图像(BMP、JPG、JPEG 或 PNG 文件)插入模型中以进行设计或标识模型。若要添加一个新的图像,点击工具栏的 “图像”按钮,并点击画布的任意位置。然后,在打开对话框中选择图像。 在画布中图像对象的弹出式菜单选项包括: 选项 描述 重设大小 重新设置图像的大小为它的原始大小。 重设高宽比率 保持图像的原始宽度与高度的比率。 剪切 从图表移除图像并放它在剪贴板。 复制 从图表复制图像到

  • 您可以将图像(BMP、JPG、JPEG 或 PNG 文件)插入仪表板以进行设计或标识仪表板。 添加一个图像 在仪表板选项卡中,点击 “添加图像”。 在打开对话框中选择图像。 属性 图像的可用属性: 选项 描述 不透明度 设置图像的不透明度。 位置 自定义图像的位置。 大小 自定义图像的大小。 原始大小 将图像重置为其原始大小。 URL 输入 URL 路径以将图像设置为超链接。

  • 你可以将图像(BMP、JPG、JPEG 或 PNG 文件)插入模型中以进行设计或标识模型。若要添加一个新的图像,点击工具栏的 按钮,并点击画布的任意位置。然后,在打开对话框中选择图像。 在画布中图像对象的弹出式菜单选项包括: 选项 描述 重置大小 重新设置图像的大小为它的原始大小。 重置高宽比率 保持图像的原始宽度与高度的比率。 剪切 从图表移除图像并放它在剪贴板。 复制 从图表复制图像到剪贴板。

  • 您可以将图像(BMP、JPG、JPEG 或 PNG 文件)插入仪表板以进行设计或标识仪表板。 添加一个图像 在仪表板选项卡中,点击 。 在打开对话框中选择图像。 属性 图像的可用属性: 选项 描述 不透明度 设置图像的不透明度。 位置 自定义图像的位置。 大小 自定义图像的大小。 原始大小 将图像重置为其原始大小。 URL 输入 URL 路径以将图像设置为超链接。