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

在pdfbox中打印汉字

闻人河
2023-03-14

我正在使用以下设置:

>

pdfbox 2.0.15

目标:呈现包含中文字符的pdf

问题:java.lang.IllegalArgument异常:U 674E在此字体的编码中不可用

我已经试过了:

>

  • 使用不同的字体支持汉字。最新的一款是KTC普通版。ttf

    将字体设置为unicode,如下所述:Java:使用PDFBox将国家字符写入PDF,但是不推荐使用loadTTF方法。

    使用Arial-Unicode-MS4302。ttf

    我的代码看起来像这样(缩短了一点):

    try (InputStream pdfIn = inputStream; PDDocument pdfDocument =
                 PDDocument.load(pdfIn)) {
    
          PDFont formFont;
          //Check if Chinese characters are present
          if (!Util.containsHanScript(queryString)) {
            formFont = PDType0Font.load(pdfDocument,
                PdfReportGenerator.class.getResourceAsStream("LiberationSans-Regular.ttf"),
                false);
          } else {
            formFont = PDType0Font.load(pdfDocument,
                PdfReportGenerator.class.getResourceAsStream("NotoSansCJKtc-Regular.ttf"),
                false);
          }
    
            List<PDField> fields = acroForm.getFields();
    
            //Load fields into Map
            Map<String, PDField> pdfFields = new HashMap<>();
            for (PDField field : fields) {
              String key = field.getPartialName();
              pdfFields.put(key, field);
            }
    
            PDField currentField = pdfFields.get("someFieldID");
            PDVariableText pdfield = (PDVariableText) currentField;
    
            PDResources res = acroForm.getDefaultResources();
            String fontName = res.add(formFont).getName();
            String defaultAppearanceString = "/" + fontName + " 10 Tf 0 g";
    
            pdfield.setDefaultAppearance(defaultAppearanceString);
            pdfield.setValue("李柱");
    
          acroForm.flatten(fields, true);
    
          ByteArrayOutputStream pdfOut = new ByteArrayOutputStream();
          pdfDocument.save(pdfOut);
    }
    
    

    预期结果:pdf上的汉字。

    实际结果:java。lang.IllegalArgumentException:U 674E在此字体的编码中不可用:WinAnSienceODing

    所以我的问题是如何最好地支持用pdfbox渲染汉字。感谢您的帮助。

  • 共有1个答案

    房新翰
    2023-03-14

    以下代码适用于我,它使用PDFBOX-4629文件:

    PDDocument doc = PDDocument.load(new URL("https://issues.apache.org/jira/secure/attachment/12977270/Report_Template_DE.pdf").openStream());
    PDAcroForm acroForm = doc.getDocumentCatalog().getAcroForm();
    PDVariableText field = (PDVariableText) acroForm.getField("search_query");
    List<PDField> fields = acroForm.getFields();
    PDFont font = PDType0Font.load(doc, new FileInputStream("c:/windows/fonts/arialuni.ttf"), false);
    
    PDResources res = acroForm.getDefaultResources();
    String fontName = res.add(font).getName();
    String defaultAppearanceString = "/" + fontName + " 10 Tf 0 g";
    
    field.setDefaultAppearance(defaultAppearanceString);
    field.setValue("李柱");
    
    acroForm.flatten(fields, true);
    doc.save("saved.pdf");
    doc.close();
    
     类似资料:
    • 我是新的PDFBox,我有一个要求发送PDF到打印机时,它是打开的。我们使用PDFBox api生成PDF。我使用下面的代码尝试在打开时设置操作,但没有任何效果。请帮帮忙。我使用过不同的javascript,如window.print();this.print();打印();

    • 我正在使用pdfbox 1.8,我试图用中文填写pdf表格,但我得到的只是奇怪的字符。我得到了一个ttc文件(uming.ttc),并使用字体伪造导出了ttf文件(现在我正在尝试只使用导出的字体之一)。 字体的加载是使用 我正在使用以下代码编写pdf字段(我在stackoverflow中找到了它,但目前我找不到它) 我读到pdfbox2.0支持Unicode我需要使用这个新版本吗? 使用font-

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

    • 问题内容: 我想使用PDFBox打印 由iText创建的 PDF文件 。我已经使用PDDocument类及其方法print()成功尝试了此操作。您可以在此处找到文档: http //pdfbox.apache.org/apidocs/。 (我正在使用此代码:) 方法print()很好用,但是 有一个问题:当我需要打印多个文件时,该方法要求我为每个文档选择打印机。 有什么办法只能设置一次打印机吗?

    • 这是一个我甚至无法在我们的测试环境中重现的错误——到目前为止,它只发生在生产环境中,需要运行一段时间才能发生(重启一段时间后就可以了)。 在打印PDF文件时,上述异常被抛出,在打印机队列中,我可以看到作业挂在错误状态。让我有点困扰的是,我打印的文件大小约为40 kb,打印队列显示它们约为1.4 MB,但也许这是正常的,我不知道。无论如何,我读了一两件关于这个异常的事情,但是有些事情不太对——应用程

    • 我正在使用PDFBOX,它的留档似乎很少,所以我来这里寻求一些帮助。我正在尝试打印我创建的pdf表单,其中字段由eclipse动态填充。我可以让它导入和打印,但是当我打印时,我设置的字段不会显示(尽管当我将其保存到HDD时会显示)。有人能告诉我打印时设置为可见的设置吗?我看到itext有类似的东西,我希望PDFBox也有。 这是我当前的代码。