java - PDFBox 打乱文本

标签 java pdf pdfbox

我一直在尝试编辑 PDF 文档以预填写表单条目。我已经让它工作了(有点)。我添加的文字效果很好。然而,已经存在的其他文本似乎已被替换为“&%£!£!”符号。我发现这与下面代码中的“contentStream”部分有关。它似乎是“setFont”行。如果我删除它,页面仍然正常......除了“Hello Richard”文本不再显示!

请帮忙!

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();

    }
}

This is the top of the form before I add text elsewhere And after I've added text elsewhere, this bit of text goes nuts! I did not edit this bit though

最佳答案

正如评论中已经假设的那样,这是由于我在 this answer 中描述的 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 开发。

关于java - PDFBox 打乱文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19702671/

相关文章:

java - 用于 PDF 到图像转换的开源库

java - 检查二维数组是否有效

java - 当所有线程都在使用时,如何增加 newFixedThreadPool 或 newScheduledThreadPool 中的线程数量?

java - 如何通过另一种方法停止声音(在播放时)

ios - 如何在 iOS 上查看 PDF 文档的所有层,特别是注释

java - 如何在 java pdfbox 中按结果拆分 pdf 文件

Android Studio 安装 ubuntu 12.04

python - 使用 Python 将 PDF 写入 STDOUT

c# - UWP 检查文件是否存在

pdf - 如何在不消耗内存的情况下进行流式 PDF 合并?