1

我想使用 iText 将 PDF 的所有嵌入或其他字体转换为另一种字体。我知道行高、字距调整和一堆其他东西会被搞砸,但这我真的不介意输出有多丑陋。

我在这里看到了如何将字体嵌入到现有的 pdf中,但我不知道如何将文档中的所有现有文本设置为该字体。

我知道这并不像我想象的那么简单。也许从文档中获取所有原始文本并使用新字体创建一个新文档会更容易(同样,布局/可读性对我来说不是问题)

4

1 回答 1

0

来自iText in Action - 2nd Edition第 16 章的示例EmbedFontPostFacto.java展示了如何嵌入最初未嵌入的字体。中心方法是这样的:

public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
    // the font file
    RandomAccessFile raf = new RandomAccessFile(FONT, "r");
    byte fontfile[] = new byte[(int)raf.length()];
    raf.readFully(fontfile);
    raf.close();
    // create a new stream for the font file
    PdfStream stream = new PdfStream(fontfile);
    stream.flateCompress();
    stream.put(PdfName.LENGTH1, new PdfNumber(fontfile.length));
    // create a reader object
    PdfReader reader = new PdfReader(RESULT1);
    int n = reader.getXrefSize();
    PdfObject object;
    PdfDictionary font;
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(RESULT2));
    PdfName fontname = new PdfName(FONTNAME);
    for (int i = 0; i < n; i++) {
        object = reader.getPdfObject(i);
        if (object == null || !object.isDictionary())
            continue;
        font = (PdfDictionary)object;
        if (PdfName.FONTDESCRIPTOR.equals(font.get(PdfName.TYPE))
            && fontname.equals(font.get(PdfName.FONTNAME))) {
            PdfIndirectObject objref = stamper.getWriter().addToBody(stream);
            font.put(PdfName.FONTFILE2, objref.getIndirectReference());
        }
    }
    stamper.close();
    reader.close();
}

这(未经fontname.equals(font.get(PdfName.FONTNAME))测试)可能是您任务的简单案例的起点。

您必须进行大量有关编码的测试,并添加一些单独的翻译以获得更通用的解决方案。为此,您可能需要研究PDF 规范ISO 32000-1的第 9 节文本

于 2013-06-01T21:30:01.470 回答