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

如何在用PDFBox将字符串打印成PDF格式之前对其进行消毒

夹谷茂
2023-03-14

我正在创建PDF文档从用户输入的UTF-8。

除了显示PDFs,创建本身也会失败,因为java.lang.IllegalArgumentException:U+039b在此字体的编码:winansiencoding中不可用。

所以简而言之,我有一个字符串我想要一个防弹的方法来把它的大部分写到PDFBox文档中(显然,字体中缺少的字符将被替换或不打印)。

非常感谢,JM

共有1个答案

邹宏峻
2023-03-14

我结束了一个字符一个字符的消毒。

这里是我的消毒功能看起来像什么。

为了避免重新处理字符,我缓存了每个给定字体的每个字符的可用性。

可能有很多东西需要改进,但这适用于我的用例。

private String getPrintableString(String string, PDFont font) {

    StringBuilder sb = new StringBuilder();

    for (int i = 0; i < string.length(); i++) {

        int codePoint = string.codePointAt(i);

        if (codePoint == 0x000A) {
            sb.appendCodePoint(codePoint);
            continue;
        }

        String fontName = font.getName();
        int cpKey = fontName.hashCode();
        cpKey = 31 * cpKey + codePoint;

        if (codePointAvailCache.get(cpKey) == null) {

            try {
                font.encode(string.substring(i, i + 1));
                codePointAvailCache.put(cpKey, true);
            } catch (Exception e) {
                codePointAvailCache.put(cpKey, false);
            }
        }

        if (!codePointAvailCache.get(cpKey)) {

            // Need to make sure our font has a replacement character
            try {
                codePoint = 0xFFFD;
                font.encode(new String(new int[] { codePoint }, 0, 1));
            } catch (Exception e) {
                codePoint = 0x003F;
            }
        }

        sb.appendCodePoint(codePoint);
    }

    return sb.toString();
}
 类似资料:
  • 问题内容: 打印列表中元素之前的“ u”?我没有在代码中键入u。 当我运行此命令时,它将打印列表,但其格式如下: 那些“ u”来自列表中每个元素的位置? 问题答案: 我认为您实际上对此感到惊讶的是,打印单个字符串与打印字符串列表的功能不同–无论是否为Unicode,这都是事实: 即使没有,您也有多余的引号,更不用说反斜杠转义了。而且,如果您使用字节字符串而不是字符串尝试相同的操作,那么您仍然会使用

  • 我有一个PDF文件,我必须使用Java的Apache PDFBox库在PDF的每一页上打印页码。Pdf有一个包含动态内容的表格,我不知道我的内容需要在PDF上打印多少页,因为它包含一个包含动态数据的表格。 例如:-创建PDF时,文件可能有4或5页,在这种情况下,我必须在PDF页脚的每页上打印页码no。如下所示 假设内容将以PDF格式打印在4页上 第1页第1页,共4页 第2页第2页,共4页 在第3页

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

  • 我正在学习Java,有一个非常简单的要求,我似乎不知道哪里出了问题。一个简单的ArrayList,用于写入控制台 名字 姓 多布 我似乎不知道我怎么能把它们打印在一行里 名字姓多布 另一个名字另一个姓氏另一个Dob 提前感谢你所有的帮助。

  • 使用Selenium4和chromedriver,我成功地将网站打印成具有自定义页面大小的PDF(请参见下面的Python代码)。我想知道用GeckoDriver/Firefox实现这一功能的等价物。