带有 Unicode 字符的 PDF 表单

标签 pdf unicode itext pdf-form

关闭。这个问题需要更多focused .它目前不接受答案。












想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .

2年前关闭。




Improve this question




我目前正在努力使用从 LibreOffice 文档创建的 PDF 表单。

我按照“iText in Action”一书中的建议创建了它,现在我试图用一些可以包含 Unicode 字符的值来预填充嵌入的表单。

这包括由基本字符和附加组合字符(例如 M̂)组成的字符。

我尝试了在 stackoverflow 中找到的几种不同的提示和这本书,但我从来没有得到一个格式适用于所有平台的 PDF 文档:Linux(Okular、Evince、Acrobat DC、macOS Previewer 等)

我知道我需要一种字体,它可以覆盖字符并完全嵌入字体。下面是我用来归档 PDF 文档和 PDF 文件的代码。

我的问题是:

  • PDF 规范中 PDF 阅读器规范的不同行为是否存在弱点,我必须接受它吗?
  • 特别是 Linux PDF 阅读器和 Acrobat 表现不佳。是否存在已知错误?
  • 我对PDF的内部结构不是很熟悉,所以有什么建议吗?我的 PDF 文件的内容正常吗?
  • 关于如何改进代码以获得更好结果的任何建议?

  • 填写表格的代码:
    BaseFont uniFont = BaseFont.createFont("./src/main/resources/UnicodeDoc.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, false, null, null, false);
    uniFont.setSubset(false);
    
    // Debugging code...
    for (String codepage : uniFont.getCodePagesSupported()) {
        System.out.println("Codepage = " + codepage);
    }
    
    FileInputStream fis = new FileInputStream(src);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    PdfReader reader = new PdfReader(fis);
    PdfStamper stamper = new PdfStamper(reader, baos);
    
    // Fill all fields in PDF form
    String text = "aM\u0302a"; // Same as "aM̂a"
    com.itextpdf.text.pdf.AcroFields form = stamper.getAcroFields();
    for (String fname : form.getFields().keySet()) {
        System.out.println("form." + fname);
        form.setField(fname, text);
        form.setFieldProperty(fname, "textfont", uniFont, null);
    }
    form.setGenerateAppearances(true);
    form.addSubstitutionFont(uniFont);
    stamper.setFormFlattening(false);
    stamper.close();
    reader.close();
    
  • Template
  • Template filled
  • Font

  • 提前致谢, Mik86

    最佳答案

    I'm not very familiar with internals of PDF, so any suggestions? Are the contents of my PDF files ok?



    我将不得不深入研究 PDF 规范,以查看是否存在绝对不正确的内容,但对我来说似乎确实存在混淆。

    首先,当我尝试在 Acrobat 中打开它时,您的输入模板给了我一个错误,LiveCycle 提示必须将“UnicodeDoc”换成不同的字体。原始输入文件中使用了“UnicodeDoc”:

    enter image description here

    注意字体“UnicodeDoc”是不是 嵌入在您的输入文件中。填写时,您创建并嵌入字体,但看起来您没有覆盖原始字体(再次,不是说这是正确的还是不正确的):

    enter image description here

    无需过多了解 PDF 的内部工作原理,正在填写的表单仍会链接到未嵌入的原始字体。

    这不一定直接解决问题,但是如果我通过从原始模板中删除字体来“修复”您的文档:

    input.pdf

    并通过你的代码运行它产生 output.pdf 在 Acrobat 和 Reader 中有正确的输出。

    同样,这并不是说在这种情况下您的 PDF 是错误的或 iText 是错误的,因为我还没有查看整个规范以了解此处预期的交互(如果有),但就其而言,您所使用的字体嵌入是不是 最终在表单字段中使用的字体。

    关于带有 Unicode 字符的 PDF 表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48476970/

    相关文章:

    itext - 已定义签名。必须在 PdfSignatureAppearance 中关闭

    javascript - 如何从html网页生成pdf?

    Php - 上传 doc、docx、pdf - 提取所有内容

    unicode - Rebol 3 R3-GUI字段支持非ascii字符串输入吗?

    带有 UTF-8 数据的 Python CSV DictReader

    java - 如何使用 iText 获取 pdf 代码

    java - Oracle 生成的 PDF 文件中的 CreatorDate 字段为空

    c# - 从 Adob​​e Acrobat Reader 和 DejaVu Reader 进程中提取当前页面?

    c# - 在 C# 中预览 PDF

    c++ - 使用 CodeGear C++ Builder 2009 将 unicode 字符串写入文件