Adobe Reader中的iTextSharp嵌入式西里尔字体

时间:2013-08-14 10:58:48

标签: itextsharp adobe-reader

使用Adobe Reader无法正确显示我的PDF。这对其他PDF阅读器来说很好,所以这必须是一个语法问题,因为我听说Adobe Reader对PDF语法更严格。字体似乎是它们应该的两倍大,但水平间距是正确的,这使得字体相互重叠。

这是我的C#代码(字体创建代码在本文末尾)。

Font officialUseFont = EmbeddedResources.CreateDesignFont(webform);
PdfContentByte officialUseCanvas = _stamper.GetOverContent(3);
ColumnText.ShowTextAligned(officialUseCanvas, Element.ALIGN_CENTER, new Phrase(webform.Text, officialUseFont), posX, posY, 0);

我正在使用运行时版v2.0.50727的iTextSharp 5.4.2.0。PDF Font Properties

我必须嵌入一些字体,因为西里尔字母和中文字母之前没有工作,但它们现在正在工作。 PDF中存在的表单字段填充了西里尔字符而没有任何问题,它只是导致问题的画布。enter image description here

public Font CreateDesignFont(IForm webform)
{
    var baseFont = GetBaseFont(fontNamespace.Length, selectedFontName);
    return new Font(baseFont, webform.FontSize);
}
    private static BaseFont GetBaseFont(int fontNamespaceLength, string selectedFontName)
    {

        byte[] fontBuffer;
        using (var stream = (Assembly.GetExecutingAssembly().GetManifestResourceStream(selectedFontName)))
        {
            fontBuffer = new byte[stream.Length];
            stream.Read(fontBuffer, 0, fontBuffer.Length);
        }
        var fontfile = selectedFontName.Substring(fontNamespaceLength);
        var customFont = BaseFont.CreateFont(fontfile, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, BaseFont.CACHED, fontBuffer, null);
        return customFont;
    }

2 个答案:

答案 0 :(得分:0)

您提供的代码段是不够的。问题源于您执行EmbeddedResources.CreateDesignFont(webform);

时发生的任何事情

如果Adobe Reader中未显示该字体,则表示您未嵌入该字体。也许你认为你这样做,但从PDF观众的行为来判断,你没有。

您是否可以提供文档属性的屏幕截图,更具体地说是“字体”选项卡?

<强>更新

我尝试编写自己的代码段,但我无法重现问题。所以我再看看你的代码,我看到你正在缓存字体,但你已经使用WINANSI编码使用ArialMT来填写第1页上的字段.IMO(我不是有时间检查)与使用IDENTITY_H的缓存使用相同的字体不兼容。如果你不缓存字体(为什么你会传递fontBuffer!如果你已经自己缓存了字体字节,则不需要将字体存储在缓存中),你的问题可能会得到解决。

答案 1 :(得分:0)

问题源于我使用.otf字体的事实。当我改为.ttf时,问题就消失了。