我想用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。
知道如何解决这个问题吗?
由于
答案 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);
结果: