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

PDFBox对文本加扰

太叔英锐
2023-03-14

我一直在尝试编辑PDF文档以预填充表单条目。我让它(某种程度上)起作用了。我添加的文本很好。然而,已经存在的其他文本似乎已被替换为“

救命啊!

package pdfboxtest;

import java.awt.Color;
import java.util.List;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.edit.PDPageContentStream;

public class PDFFormFiller {

    private static final String R40_NEW_FORM_PATH = "c:\\temp\\hmrc-r40.pdf";
    private static final String R40_COMPLETED_FORM_PATH = "c:\\temp\\hmrc-r40-complete.pdf";

    public static void main(String[] args) throws Exception {
        PDDocument doc = PDDocument.load(R40_NEW_FORM_PATH);

        addTextToPage(doc);

        doc.save(R40_COMPLETED_FORM_PATH);
        doc.close();
    }

    private static void addTextToPage(PDDocument doc) throws Exception {
        List pages = doc.getDocumentCatalog().getAllPages();
        PDPage firstPage = (PDPage) pages.get(0);
        PDPageContentStream contentStream = new PDPageContentStream(doc, firstPage, true, true);

        contentStream.setFont(PDType1Font.HELVETICA_BOLD, 24);
        contentStream.beginText();
        contentStream.setNonStrokingColor(Color.BLACK);
        contentStream.moveTextPositionByAmount(100, 200);
        contentStream.drawString("HELLO RICHARD!!");
        contentStream.endText();
        contentStream.close();

    }
}

共有1个答案

易淳
2023-03-14

正如在评论中已经假设的那样,这是由于我在本答案中描述的解决方法的PDFBox问题。此问题仍存在于PDFBox 1.8.2版本中,但同时已修复1.8.3和2.0.0版本,参见PDFBOX-1753。

在您的情况下,解决方法会更改addTextToPage方法,如下所示:

private static void addTextToPage(PDDocument doc) throws IOException {
    List pages = doc.getDocumentCatalog().getAllPages();
    PDPage firstPage = (PDPage) pages.get(0);
    PDPageContentStream contentStream = new PDPageContentStream(doc, firstPage, true, true);

    firstPage.getResources().getFonts(); // <<<<<<

    contentStream.setFont(PDType1Font.HELVETICA_BOLD, 24);
    contentStream.beginText();
    contentStream.setNonStrokingColor(Color.BLACK);
    contentStream.moveTextPositionByAmount(100, 200);
    contentStream.drawString("HELLO RICHARD!!");
    contentStream.endText();
    contentStream.close();
}

添加的行强制执行new PDPageContentStream忘记但setFont指望已完成的初始化。您可以在上面引用的答案中找到详细信息。您可能想通知PDFBox开发。

 类似资料:
  • 主要内容:将文本添加到现有的PDF文档,示例在前一章中,我们讨论了如何将页面添加到PDF文档。 在本章中,我们将讨论如何将文本添加到现有的PDF文档。 将文本添加到现有的PDF文档 可以使用PDFBox库将内容添加到文档,它提供一个名称为的类,其中包含在的页面中插入文本,图像和其他类型内容所需的方法。 以下是创建空白文档并将内容添加到其中的页面的步骤。 第1步:加载现有文档 使用类的方法加载现有文档。 因此,请实例化此类并加载所需的文档,如

  • 主要内容:加载现有的PDF文档,第1步:加载现有的PDF文档,示例在前面的例子中,已经学习了如何创建一个新文档并向其中添加页面。 本章将教您如何加载系统中已经存在的PDF文档,并对其进行一些操作。 加载现有的PDF文档 类的方法用于加载现有的PDF文档。 按照以下步骤加载现有的PDF文档。 第1步:加载现有的PDF文档 使用类的静态方法加载现有的PDF文档。 此方法接受一个文件对象作为参数,因为这是一个静态方法,可以直接使用类名称调用它,如下所示。 第2步:执行

  • 坚持使用PDFBox Android,PDFBox Android:1.8.9.0 我加载pdf文件的第一页,在其中写入文本,并将此页面导入最终文档的新页面。 问题是,当创建新页面时,它会使用包含以前文本的最后一页 所以,第一页是可以的,但是下一页有重叠的文本。。 有没有办法在每次迭代中都有新的页面?谢谢

  • 主要内容:加密PDF文档,示例在前一章中,我们已经看到了如何在PDF文档中插入图像。 在本章中,我们将学习如何加密PDF文档。 加密PDF文档 使用和类提供的方法加密PDF文档。 类用于通过为其分配访问权限来保护PDF文档。 使用此教程,您可以限制用户执行以下操作。 打印文档 修改文档的内容 复制或提取文档的内容 添加或修改注释 填写交互式表单域 提取文字和图形以便视障人士使用 汇编文件 打印质量下降 类用于向文档添加基于密码

  • 主要内容:示例在前一章中提供的示例中,学习了如何在PDF中向页面添加文本,但通过此程序,只能添加适合单行的文本。 如果您尝试添加更多内容,则不会显示超出行间距的所有文字。 例如,如果传递以下字符串在上一章中执行上述程序,则只会显示其中的一部分。 用上面提到的字符串替换上一章中例子的字符串文本并执行它。 执行后,将得到类似以下输出。 如果仔细观察输出,可以看到只显示了一部分字符串。 要将多行添加到PDF,需要使用

  • 我正在使用Microsoft打印到PDF打印机。我在PDPageable类@第74行中得到一个NPE,说我没有对此文档设置访问权限: 当检查时,该值确实为空。因此,我尝试手动设置一些没有用户名或密码的访问权限,仅使用打印权限: 但使用进行检查时,权限仍然为空。 注意:当我直接从操作系统使用Microsoft Print to PDF打印机打印时,证书将从打印的PDF文件中删除,因此该过程正常工作。