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

PDFBox与汉字

吕鸿轩
2023-03-14

我正在使用pdfbox 1.8,我试图用中文填写pdf表格,但我得到的只是奇怪的字符。我得到了一个ttc文件(uming.ttc),并使用字体伪造导出了ttf文件(现在我正在尝试只使用导出的字体之一)。

字体的加载是使用

    InputStream is = ..
    PDTrueTypeFont font = PDTrueTypeFont.loadTTF(doc, is);

我正在使用以下代码编写pdf字段(我在stackoverflow中找到了它,但目前我找不到它)

    protected void setPDFFieldAndFont(String fieldName, String keyFontName, Object... values) {
    try {
        PDField pdField = pdfForm.getField(fieldName);
        if (pdField == null) {
            return;
        }
        // append fields to create a new textfield
        Filler filler = new Filler();
        filler.append(values);
        String textFieldString = filler.toString();
        String fontName = key2FontName.get(keyFontName);
        COSDictionary dict = pdField.getDictionary();
        COSString defaultAppearance = (COSString) dict
                .getDictionaryObject(COSName.DA);
        if (defaultAppearance != null)
        {
            dict.setString(COSName.DA, "/" + fontName + " 11 Tf");
        }
        if (pdField instanceof PDTextbox)
        {
            PDTextbox textbox = new PDTextbox(pdfForm, dict);
            //PDTextbox textbox = (PDTextbox) pdField;
            textbox.setValue(textFieldString);

        }
    } catch (IOException e) {
        throw new IllegalStateException("Invalid field name: " + fieldName, e);
    }
}

我读到pdfbox2.0支持Unicode我需要使用这个新版本吗?

使用font-forge,我看到我的ttf字体编码为ISO-10646-1。

谢谢你的帮助

编辑

按照蒂尔曼·豪瑟尔的要求,我尝试了嵌入字体。java和它的工作原理很好,但我填写表格的方式不同。我创建了一个主要示例:

public static void main(String[] args)  throws IOException {

    String pdfform = "D:\\form.pdf";

    PDDocument doc = PDDocument.load(new File(pdfform));
    PDType0Font font = PDType0Font.load(doc, new File("D:\\fonts\\UMingCN.ttf"));
    PDAcroForm acroForm = doc.getDocumentCatalog().getAcroForm();

    PDResources res = acroForm.getDefaultResources();
    if (res == null){
        res = new PDResources();
    }
    COSName fontName = res.add(font);
    acroForm.setDefaultResources(res);



    PDField pdField = acroForm.getField("personalInformation_fullName");
    if (pdField == null) {
        return;
    }
    COSDictionary dict = pdField.getCOSObject();
    COSString defaultAppearance = (COSString) dict.getDictionaryObject(COSName.DA);
    if (defaultAppearance != null)
    {
        dict.setString(COSName.DA, "/" + fontName.getName() + " 11 Tf");
    }
    if (pdField instanceof PDTextField)
    {
        PDTextField textbox = new PDTextField(acroForm);
        textbox.getCOSObject().addAll(dict);

        textbox.setValue("保保保");
    }

    doc.save("example2.pdf");
    doc.close();
}

但它并不能填满任何东西。在调试中,代码进入文本框。setValue,但保存的pdfform没有在pdf中设置的值。也许我错过了什么。。

再次感谢

共有1个答案

伯逸明
2023-03-14

我解决了PdfBox和中文(日文、韩文和任何其他字体)的问题,将文本转换为图像,如下所示

void writeLine(String text, int x, int y, int width, int height,
           Font font, Color color, PDPageContentStream contentStream, PDDocument document) throws IOException {

    try (
        ByteArrayOutputStream baos = new ByteArrayOutputStream()
    ) {
        int scale = 2;
        BufferedImage img = new BufferedImage(width * scale, height * scale, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2d = img.createGraphics();
        g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
        g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);
        g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
        g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED);
        g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
        g2d.setFont(font);
        g2d.setColor(color);
        g2d.scale(scale,scale);
        g2d.drawString(text, 0, g2d.getFontMetrics().getAscent());
        g2d.dispose();

        ImageIO.write(img, "png", baos);
        baos.flush();
        baos.close();

        contentStream.drawImage(PDImageXObject.createFromByteArray(
            document,baos.toByteArray(), ""), x, y, width, height);
    }
}
 类似资料:
  • 我正在使用以下设置: > pdfbox 2.0.15 目标:呈现包含中文字符的pdf 问题:java.lang.IllegalArgument异常:U 674E在此字体的编码中不可用 我已经试过了: > 使用不同的字体支持汉字。最新的一款是KTC普通版。ttf 将字体设置为unicode,如下所述:Java:使用PDFBox将国家字符写入PDF,但是不推荐使用loadTTF方法。 使用Arial-

  • 本文向大家介绍java实现汉字转unicode与汉字转16进制实例,包括了java实现汉字转unicode与汉字转16进制实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了java实现汉字转unicode与汉字转16进制的实现方法。分享给大家供大家参考。具体实现方法如下: 一、汉字转unicode 二、汉字转16进制 希望本文所述对大家的Java程序设计有所帮助。

  • 这就是我想做的: > 使用pdfbox制作2个不同的pdf文件 使用pdfmerger将这两个文件合并在一起 如果要将#1保存到服务器端本地硬盘并加载#2的文件,我知道如何执行此操作。但我想做的是使用“直接从内存”。我已经搜索了这个pdfboxes中的所有方法,但仍然找不到它。 这是我从本地文件获取的代码 谢谢你。

  • PDFBox是Java实现的PDF文档协作类库,提供PDF文档的创建、处理以及文档内容提取功能,也包含了一些命令行实用工具。 主要特性包括: 从PDF提取文本 合并PDF文档 PDF 文档加密与解密 与Lucene搜索引擎的集成 填充PDF/XFDF表单数据 从文本文件创建PDF文档 从PDF页面创 建图片 打印PDF文档

  • 汉兜即汉字 Wordle,是一款填字游戏。 《Wordle》是一款网页文字游戏。 在《Wordle》中,玩家要在一天内用六次机会内猜中某个有五字英文字母的词汇。每次尝试后,玩家可能得到三种反馈:绿色表示字母位置正确;黄色表示答案包含该字母但位置错误;灰色表示答案没有该字母。

  • NativeScript PdfBox Apache Pdfbox for NativeScript. This plugin allows you to extract the text from a PDF file. ALPHA version. Android only (iOS may come in the future, PR are welcome). The screenshot