iText + HTMLWorker - 如何更改默认字体?

2023-11-25

我必须从 HTML 源创建 PDF 文件。目前,我正在处理有关输出文件中特殊(抛光)字符的问题,正是由于它们的缺乏。

HTML 源:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<table width="100%" border="0.5" align="center" cellpadding="0" style="border-collapse:collapse; border:1px solid black; font-family:Arial, Helvetica, sans-serif; font-size:16px">
  <tr>
    <td align="center" ><b>Test: ąęłóćńśŁÓŃĆŻŹąśżźłęó</b></td>
  </tr>
</table>

Java源码:

Document document = new Document(PageSize.A4, 38, 38, 50, 38);  
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("iTextExample.pdf"));  
document.open();  
HTMLWorker htmlWorker = new HTMLWorker(document);  
htmlWorker.parse(new StringReader(readFileAsString("index.html")));  
document.close();


public static String readFileAsString(String filePath) throws IOException {
    DataInputStream dis = new DataInputStream(new FileInputStream(filePath));
    try {
        long len = new File(filePath).length();
        if (len > Integer.MAX_VALUE) {
            throw new IOException("File " + filePath + " too large, was " + len + " bytes.");
        }
        byte[] bytes = new byte[(int) len];
        dis.readFully(bytes);
        return new String(bytes, "UTF-8");
    } finally {
        dis.close();
    }
}

我的问题是:如何将默认字体(Helvetica)更改为例如。整个 PDF 文档中的 Arial 粗体?

我已经测试了许多与 StyleSheet 有关的示例,但没有一个起作用。我必须更改默认字体,因为没有波兰语字符 - 这是我希望能够发挥作用的解决方案。

Edit:

class defaultFontProvider extends FontFactoryImp {

    private String _default;

    public defaultFontProvider(String def) {
        _default = def;
    }

    public Font getFont(String fontName, String encoding, boolean embedded, float size, int style, BaseColor color, boolean cached) {
        if (fontName == null || size == 0) {
            fontName = _default;
        }

        return super.getFont(fontName, encoding, embedded, size, style, color, cached);
    }
}

上面的代码嵌入了arial.ttf这没问题,但是如何将其设为整个文档的默认字体(而不是 Helvetica)。

Then..

Map<String,Object> providers = new HashMap<String, Object>();

defaultFontProvider dfp = new defaultFontProvider("arial.ttf");

providers.put(HTMLWorker.FONT_PROVIDER, dfp);

HTMLWorker htmlWorker = new HTMLWorker(document);
htmlWorker.setProviders(providers);

Idea #1

我立即想到一个答案:更改 iText。具体来说,Font.getCalculatedBaseFont,第 644 行。

String fontName = BaseFont.HELVETICA;

实际上,我不认为这会起作用,除非你也改变字体的创建方式......第 712 行

cfont = BaseFont.createFont(fontName, encoding, false);

除非字体是“Base 14”之一,否则您必须提供字体文件的路径,而不是简单的字体名称。

另一种选择:XSLT

转换输入,以便将字体定义添加到包含文本的任何节点的样式。

最后:注册一个fontProvider

您可以坐在 FontFactoryImp 之上,只需将空白字符串映射到您选择的字体即可。

class DefaultFontProvider extends FontFactoryImp {
  private String default;
  public DefaultFontProvider(String def) {
    default = def;
  }

  // I believe this is the correct override, but there are quite a few others.
  public Font getFont(String fontname, String encoding, boolean embedded, float size, int style, BaseColor color, boolean cached) {
    if (fontName == null || fontName.size() == 0) {
      fontName = default;
    }
    return super.getFont(fontName, encoding, embedded, size, style, color, cached);
  }
}


Map<String,Object> providers = new HashMap<String, Object)();
providers.put(HTMLWorker.FONT_PROVIDER, new DefaultFontProvider("Arial Bold"));

myHTMLWorker.setProviders(providers);

我认为这是技术上最合理的想法。它是为新发布的 iText 5.0.6 版本编写的。以前的版本通过设置字体提供程序setInterfaceProps()反而。在这一点上,“Providers”更多的是一个名称的改变。我怀疑 5.1 中情况将不再如此。

PS: FontFactoryImp有两个您可能也感兴趣的公共成员:defaultEncoding and defaultEmbedding。你应该能够调整defaultEncoding到一些对波兰人更友好的东西。我推荐“Identity-H”(又名BaseFont.IDENTITY_H),但这确实会强制所有字体都嵌入子集,从而忽略defaultEmbedding,并使您的文件比根本没有嵌入字体时大一点。


两个可能的问题:

  1. 明确请求“Helvetica”。

    可以肯定的是,我建议填充System.out.println(("Requested font: " + fontName);进入 getFont 函数的开头。这将使您看到所有字体调用,并确保您已正确替换所有字体。如果是这种情况,您可以测试一下并将其替换为_default.

  2. 您的 fontFactory 可能找不到“Arial Bold”的任何内容,因此会退回到默认值(再次是 Helvetica)。

    我想你需要打电话dfp.registerDirectories()。这将找出几个不同操作系统上的所有字体,并让您通过字体名称而不是路径来引用它们(这是 FontFactoryImp 最初应该做的事情)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iText + HTMLWorker - 如何更改默认字体? 的相关文章

  • 主线程如何在该线程之前运行?

    我有以下代码 public class Derived implements Runnable private int num public synchronized void setA int num try Thread sleep 1
  • Modernizr - 加载 polyfills / 使用自定义检测的正确方法

    我想在网页上使用一些新的 HTML5 表单属性和输入类型 有些浏览器已经支持它们 有些浏览器不支持 也永远不会支持 这就是我想使用 Modernizr 的原因 这就是我的麻烦开始的原因 据我了解 Modernizr 本身并不是一个 poly
  • 内存一致性 - Java 中的happens-before关系[重复]

    这个问题在这里已经有答案了 在阅读有关内存一致性错误的 Java 文档时 我发现与创建 发生 之前 关系的两个操作相关的点 当语句调用时Thread start 每个具有 与该语句发生之前的关系也有一个 与 new 执行的每个语句之间发生的
  • 如何从 Retrofit2 获取字符串响应?

    我正在做 android 正在寻找一种方法来执行超级基本的 http GET POST 请求 我不断收到错误 java lang IllegalArgumentException Unable to create converter for
  • 将表值参数与 SQL Server JDBC 结合使用

    任何人都可以提供一些有关如何将表值参数 TVP 与 SQL Server JDBC 一起使用的指导吗 我使用的是微软提供的6 0版本的SQL Server驱动程序 我已经查看了官方文档 https msdn microsoft com en
  • Java 数组的最大维数

    出于好奇 在 Java 中数组可以有多少维 爪哇language不限制维数 但是JavaVM规范将维度数限制为 255 例如 以下代码将无法编译 class Main public static void main String args
  • 获取给定类文件的目录路径

    我遇到的代码尝试从类本身的 class 文件所在的同一目录中读取一些配置文件 File configFiles new File this getClass getResource getPath listFiles new Filenam
  • iOS7 中“-webkit-overflow-scrolling: touch” 最初的屏幕外元素被破坏

    既然转基因种子已经发布了 我们现在可以谈谈了 看起来 iOS7 中的 webkit overflow scrolling touch 已损坏 最初不在屏幕上的元素的触摸事件不会触发 或者在某些情况下只是不可靠 这是一个例子
  • Spring Security OAuth2简单配置

    我有一个简单的项目 需要以下简单的配置 我有一个 密码 grant type 这意味着我可以提交用户名 密码 用户在登录表单中输入 并在成功时获得 access token 有了该 access token 我就可以请求 API 并获取用户
  • Android Studio 将音乐文件读取为文本文件,如何恢复它?

    gameAlert mp3是我的声音文件 运行应用程序时 它询问我该文件不与任何文件类型关联 请定义关联 我选择TextFile错误地 现在我的音乐文件被读取为文本文件 我如何将其转换回music file protected void o
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • 尝试使用等于“是”或“否”的字符串变量重新启动 do-while 循环

    计算行程距离的非常简单的程序 一周前刚刚开始 我有这个循环用于解决真或假问题 但我希望它适用于简单的 是 或 否 我为此分配的字符串是答案 public class Main public static void main String a
  • 将图像添加到自定义 AlertDialog

    我制作了一个 AlertDialog 让用户可以从我显示的 4 个选项中选择一个 前 3 个让他们在单击号码时直接拨打号码 第 4 个显示不同的视图 现在看起来是这样的 由于第四个选项的目的是不同的任务 我想让它看起来不同 因为用户可能会感
  • 我可以停止 :hover 应用于元素吗?

    假设我有一些 CSS button hover font weight bold 我怎样才能防止 hover随意应用样式 我的目标用例是当元素被禁用时 例如 使用这个 HTML
  • 如何在Java中正确删除数组[重复]

    这个问题在这里已经有答案了 我刚接触 Java 4 天 从我搜索过的教程来看 讲师们花费了大量精力来解释如何分配二维数组 例如 如下所示 Foo fooArray new Foo 2 3 但我还没有找到任何解释如何删除它们的信息 从内存的情
  • Java:拆箱整数时出现空指针异常?

    此代码导致空指针异常 我不知道为什么 private void setSiblings PhylogenyTree node Color color throws InvalidCellNumberException PhylogenyTr
  • JSON 到 hashmap (杰克逊)

    我想将 JSON 转换为 HashMapJackson http jackson codehaus org 这是我的 JSON String json Opleidingen name Bijz trajecten zorg en welz
  • Java:多线程内的 XA 事务传播

    我如何使用事务管理器 例如Bitronix http docs codehaus org display BTM Home JBoss TS http www jboss org jbosstm or Atomikos http www a
  • 需要有关 React Js 的帮助

    我是 React Js 新手 我的代码无法正常工作 请看下面 这是我的脚本文件Main jsx 该文件由 React 编译 输出放置在 dist 文件夹下的 main js 文件中 var react require react react
  • HTML 默认图像大小

    我在我的代码上显示 3 张图片 图片具有不同的尺寸 宽度和高度 div class row div class col lg 12 h2 class page header Gallery h2 div div class col md 4

随机推荐

  • 将纪元时间转换为具有特定时区的人类可读时间

    要将纪元日期时间转换为人类可读的 使用一个简单的new date 1495159447834 就足够了 我现在遇到的问题是 对于我的混合应用程序 如果用户将手机日期时间设置中的时区设置为 GMT 12 00 则人类可读的日期时间将与我想要的
  • 查找 Java 方法的字节码大小

    我试图计算出方法的字节码大小 因为我想确保它足够小 可以通过编译器优化内联 我看到内联方法的默认最大大小是 35 因此如果该方法大于该大小 我将修改代码或将其分解为多个方法 我有一个方法可以生成下面的字节码 通过 IntelliJ IDEA
  • SQL除两个整数并得到小数值错误[重复]

    这个问题在这里已经有答案了 在 SQL 语句中 我试图除以两个整数 整数 1 在我的代码中为 abc 整数 2 在我的代码中为 xyz 并得到十进制结果 在我的代码中为 def 小数结果应仅以 1 或 0 开头 后跟一个小数和小数点后 3
  • 如何在javascript中获取json键和值?

    我返回一个 json 如下所示 name skills jobtitel Entwickler res linkedin GwebSearch 我试图获取每个元素的键和值 done function data alert data jobt
  • Summernote - 图片 url 而不是 Base64

    Summernote wysiwyg 编辑器将图像文件编码为 Base64 嗯 这看起来很方便 但我预计数据库会在长期内被大量使用 这会导致一些问题 搜索速度慢 实现图像库等等 我想知道它是否有一个选项可以关闭此编码选项并使用 插入 url
  • 获取摆动组件的位置

    我已将一些 JPanel 放入另一个 JPanel 中 其布局是框布局和 Y 轴 放置所有面板后 我需要从 JPanel 容器面板中获取每个添加的 JPanel 的 Y 位置 但是 当我尝试得到这个值时 每个 JPanel 的 Y 位置总是
  • 为什么 Python 使用“魔法方法”?

    我对 Python 广泛使用 魔术方法 感到有点惊讶 例如 为了让一个类声明实例具有 长度 它实现了 len 方法 当您编写时会调用该方法len obj 为什么不直接定义一个len作为对象的成员直接调 用的方法 例如obj len See
  • SQL Server 中的可选参数

    我有一个用户定义的函数 在许多存储过程中使用 它将返回一些值 如果我可以添加一个新的可选参数 如果我不传递任何值 它应该为空 如果我传递一些值 它应该接受它 我不想去更改所有存储过程来执行此操作 示例代码 dbo CalculateAver
  • Jenkins Git 插件不接收发布的参数

    我正在尝试使用 Node js 以编程方式构建采用 Git 参数的 Jenkins 作业 我将参数作为发布数据发送 如下所示 但是 无论我分配什么值ref Jenkins 使用默认参数值 在作业配置中指定 运行构建 我尝试过将参数作为查询字
  • 使用 D3 画笔进行细粒度事件处理

    我有一个使用 D3 生成的散点图 可以通过单击绘图上的点 SVG 圆圈 来选择它们 并且可以使用 D3 画笔选择区域 为了确保圆圈获得单击事件 我需要首先创建画笔 以便圆圈位于其上方 不幸的是 这意味着当我的光标位于绘图中的某个点上时 我无
  • grunt usemin 不影响 html 文件(index.html)

    我有一个使用 usemin 的 grunt 脚本 但奇怪的是 index html 文件根本不受 usemin 影响 这意味着我的文件仍然包含所有 日志中最奇怪的部分是这个 尽管它找到了块 但它什么也没做 请参阅完整日志 Processin
  • Python中科学记数法的指数数字

    在 Python 中 科学记数法总是给出 2 位指数 print 17 8E n 0 0665745511651039 6 65745512E 02 但是 我非常想要 3 位数字 例如 6 65745512E 002 我们可以使用 Pyth
  • 使用 Swift 2 进行 Alamofire POST 请求

    我正在尝试在 Alamofire 中发出 POST 请求以返回 JSON 对象 这段代码在 Swift 1 中有效 但在 Swift 2 中我遇到了这个无效参数问题 Tuple types NSURLRequest NSHTTPURLRes
  • 带有自定义适配器和过滤器的自动完成文本视图

    我正在尝试设置自定义ArrayAdapter for my AutoCompleteTextView像这样 public class AutoCompleteContactArrayAdapter extends ArrayAdapter
  • 开始所需的最低软件包,Android SDK

    我可以下载的软件包有限制 那么任何人都可以解释一下 为了开始使用 sdk 或使其正常工作 必须下载哪些基本组件 我正在寻找要下载的最少组件 当我启动 SDK 管理器时 它会显示一个包含各种包的列表 第一个 Android 6 0 API 中
  • Spring WS:如何获取并保存 XSD 验证错误

    我将 SpringWS 用于我的肥皂服务并像这样验证它
  • HTML5 音频在 Firefox 中从错误的位置开始

    我正在尝试播放 mp3 文件 并且想跳转到文件中的特定位置 在 Windows 上的 Chrome 33 中 文件跳转到正确的位置 与本地播放 mp3 的 VLC 相比 但在 Windows 上的 Firefox 28 中 它播放得太靠前
  • Google Apps 脚本中的“允许此应用程序在您不在场时运行”

    为什么我的附加组件要求此权限 尝试查看文档但找不到任何内容 据我所知 当用户不在场时我的应用程序不会运行 它要求用户在 Google Sheets 中选择一个范围 按下自定义 UI 中的按钮 然后调用外部 API 对于我应该寻找哪些内容来查
  • NumberFormatException:无效修订版:24.0.0-alpha1:无效修订版:24.0.0-alpha1

    Android Studio 在事件日志中显示错误 NumberFormatException 无效修订版 24 0 0 alpha1 无效修订版 24 0 0 alpha1 构建 gradle apply plugin com andro
  • iText + HTMLWorker - 如何更改默认字体?

    我必须从 HTML 源创建 PDF 文件 目前 我正在处理有关输出文件中特殊 抛光 字符的问题 正是由于它们的缺乏 HTML 源 table width 100 border 0 5 align center cellpadding 0 s