Adobe Reader无法显示使用iText添加的pdf的unicode字体

时间:2016-01-29 10:51:51

标签: pdf unicode itextsharp itext acrobat

我想用iText将文字标记为certain pdf。由于这个文本可以是西里尔文,我使用unicode字体和编码。 以下示例代码表示我是如何做到的:

string inputFile = @"sampleStamped.pdf";
PdfReader reader;
PdfStamper stamper;
FileStream fs;

byte[] binaryPdf = File.ReadAllBytes(inputFile);
reader = new PdfReader(binaryPdf);

fs = new FileStream(inputFile, FileMode.Create, FileAccess.Write);
stamper = new PdfStamper(reader, fs);

BaseFont bf = BaseFont.CreateFont("c:/windows/fonts/arialuni.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
PdfContentByte cb = stamper.GetOverContent(1);

Phrase p = new Phrase();
p.Font = new Font(bf, 25, Font.NORMAL, BaseColor.BLUE);
p.Add("Sample Text");

ColumnText.ShowTextAligned(cb, PdfContentByte.ALIGN_LEFT, p, 200, 200, 0);

if (stamper != null)
    stamper.Close();

if (fs != null)
    fs.Close();

if (reader != null)
    reader.Close();

该程序按预期工作,没有错误。但是,如果我想在Windows上打开Acrobat Reader 11或DC中的stamped pdf,它会说有显示内容的问题,并且标记文本不存在。 我使用itextsharp 5.5.8。

知道如何解决这个问题吗?

由于

1 个答案:

答案 0 :(得分:2)

这不是iText(夏普)的问题,而是Adobe Reader的一个怪癖(一个特色?)。

您的示例文件声称是PDF 1.2文件。当面对PDF 1.2文件中的复合字体时,Adobe Reader似乎表现出不同的行为。

您可以通过修补sampleStamped.pdf来检查此问题,只需将%PDF-1.2的第一个字节替换为%PDF-1.3,然后在Adobe Reader中打开文件......就不再有问题了。

因此,您应该确保您的加盖PDF声称至少是PDF 1.3。如果您标记PDF 1.2文件,可以通过创建PdfStamper这样的方式来实现:

stamper = new PdfStamper(reader, fs, (char)3);

结果:

Screenshot of fixed PDF