为什么使用iText复制PDF而不嵌入某些字体?

时间:2012-05-04 07:27:12

标签: c# pdf fonts itextsharp itext

我在使用iText时遇到了一些问题。 (具体来说,iTextSharp。)我正在尝试将一个大型PDF文件拆分成一堆较小的PDF文件。那不是问题;这很有效。

我发现输入PDF文件中的某些字体(只有一个;其余部分仍然很好地嵌入了。),而它们嵌入在输入PDF文件中,不再嵌入输出中PDF文件,尽管是用iText复制的。

最终,这会产生一个可读的输出PDF文件,在Adobe Reader中打开时会出现错误:“字体'ZurichBT-BoldItalic'包含错误/ BBOX。”。原始输入文件没有问题。

我真的不明白为什么。

下面是一个测试用例应用程序,它只是复制输入PDF。我不能提供我自己的输入PDF的样本,因为它包含机密信息,但如果无法用纯粹的代码回答,我很快就会看到用简单的小文件复制它。


using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;

using iTextSharp;
using iTextSharp.text;
using iTextSharp.text.pdf;

static void Main(string[] args)
{
    PdfReader reader = new PdfReader("input.pdf");

    Document doc = new Document();
    PdfSmartCopy writer = new PdfSmartCopy(doc, new FileStream("output.pdf", fileMode.OpenOrCreate, FileAccess.Write));

    doc.Open();

    for (int i = 1; i <= reader.NumberOfPages; i++)
    {
        //byte[] page = reader.GetPageContent(i);
        //string data = ExtractTextFromPDFBytes(page);
        if (true)//data.Contains("Search Token"))
        {
            doc.SetPageSize(reader.GetPageSizeWithRotation(i));
            doc.NewPage();
            PdfImportedPage iPage = writer.GetImportedPage(reader, i);
            writer.AddPage(iPage);
        }
    }
    doc.Close();
}

有什么想法吗? :)

使用更多信息进行编辑

获得了我正在使用的输入pdf的另一个副本,似乎问题在于输入pdf,尽管原始输入pdf没有Adobe Reader检测到的错误。我无法分享确切的文件,这使得这很难,但我想知道是否有人有任何关于如何产生的理论?文件损坏或源pdf中不明显的错误,在通过iText的pdfCopy或pdfSmartCopy函数运行后在输出pdf中变得明显?

1 个答案:

答案 0 :(得分:0)

原来这是由于输入PDF损坏,即使原始源文件没有明显错误。正如BlackShadows指出的那样,代码很好。处理原始源文件的不同副本会产生正确的输出。