【问题标题】:After encoding UTF-16, the string is broken if I want to use in iTextSharp编码 UTF-16 后,如果我想在 iTextSharp 中使用,字符串会损坏
【发布时间】:2016-02-04 09:19:32
【问题描述】:

首先我从一个文本文件中获取一些信息,然后这些信息被添加到 pdf 文件的元数据中。在“生产者”部分中,出现关于土耳其语字符 ğş 的错误。我通过像这样使用UTF-16 解决了这个问题:

write.Info.Put(new PdfName("Producer"), new PdfString("Ankara Üniversitesi Hukuk Fakültesi Dergisi (AÜHFD), C.59, S.2, y.2010, s.309-334.", "UTF-16"));

截图如下: 然后,我得到所有带有foreach 循环的pdf文件并读取元数据并插入到SQLite数据库文件中。问题就出现在这里。因为当我想从pdf文件中获取并设置为数据库文件UTF-16编码字符串(生产者数据)时,会出现这样的奇怪字符:

我不明白,为什么会出现错误。

编辑:这是我的所有代码。以下代码从文本文件中获取元数据并插入 pdf 文件的元元部分:

    var articles = Directory.GetFiles(FILE_PATH, "*.pdf");
    foreach (var article in articles)
    {
        var file_name = Path.GetFileName(article);
        var read = new PdfReader(article);
        var size = read.GetPageSizeWithRotation(1);
        var doc = new Document(size);
        var write = PdfWriter.GetInstance(doc, new FileStream(TEMP_PATH + file_name, FileMode.Create, FileAccess.Write));
        // Article file names like, 1.pdf, 2.pdf, 3.pdf....
        // article_meta_data.txt file content like this: 
        //1@Article 1 Tag Number@Article 1 first - last page number@Article 1 Title@Article 1 Author@Article 1 Subject@Article 1 Keywords
        //2@Article 2 Tag Number@Article 2 first - last page number@Article 2 Title@Article 2 Author@Article 2 Subject@Article 2 Keywords
        //3@Article 3 Tag Number@Article 3 first - last page number@Article 3 Title@Article 3 Author@Article 3 Subject@Article 3 Keywords
        var pdf_file_name = Convert.ToInt32(Path.GetFileNameWithoutExtension(article)) - 1;
        var line = File.ReadAllLines(FILE_PATH + @"article_meta_data.txt");
         var info = line[pdf_file_name].Split('@');

            var producer = Kunye(info); // It returns like: Ankara Üniversitesi Hukuk Fakültesi Dergisi (AÜHFD), C.59, S.2, y.2010, s.309-334.
            var keywords = string.IsNullOrEmpty(info[6]) ? "" : info[6];
            doc.AddTitle(info[3]);
            doc.AddSubject(info[5]);
            doc.AddCreator("UzPDF");
            doc.AddAuthor(info[4]);
            write.Info.Put(new PdfName("Producer"), new PdfString(producer, "UTF-16"));
            doc.AddKeywords(keywords);
            doc.Open();
            var cb = write.DirectContent;
            for (var page_number = 1; page_number <= read.NumberOfPages; page_number++)
            {
                doc.NewPage();
                var page = write.GetImportedPage(read, page_number);
                cb.AddTemplate(page, 0, 0);
            }
            doc.Close();
            read.Close();
            File.Delete(article);
            File.Move(TEMP_PATH + file_name, FILE_PATH + file_name);
    }

以下代码从文件中获取数据并插入 SQLite 数据库文件。对于数据库操作,我使用的是Devart - dotConnect for SQLite

    var files = Directory.GetFiles(FILE_PATH, "*.pdf");
    var connection = new Linq2SQLiteDataContext();
    TruncateTable(connection);
    var i = 1;
    foreach (var file in files)
    {
        var read = new PdfReader(file);
        var title = read.Info["Title"].Trim();
        var author = read.Info["Author"].Trim();
        var producer = read.Info["Producer"].Trim();
        var file_name = Path.GetFileName(file)?.Trim();
        var subject = read.Info["Subject"].Trim();
        var keywords = read.Info["Keywords"].Trim();
        var art = new article
        {
            id = i,
            title = (title.Length > 255) ? title.Substring(0, 255) : title,
            author = (author.Length > 100) ? author.Substring(0, 100) : author,
            producer = (producer.Length > 255) ? producer.Substring(0, 255) : producer,
            filename = file_name != null && (file_name.Length > 50) ? file_name.Substring(0, 50) : file_name,
            subject = (subject.Length > 50) ? subject.Substring(0, 50) : subject,
            keywords = (keywords.Length > 500) ? keywords.Substring(0, 500) : keywords,
            createdate = File.GetCreationTime(file),
            update = File.GetLastWriteTime(file)
        };
        connection.articles.InsertOnSubmit(art);
        i++;
    }
    connection.SubmitChanges();

【问题讨论】:

  • "我正在使用 foreach 循环获取所有 pdf 文件并读取元数据并插入 SQLite 数据库文件。问题就在这里发生。因为当我想从 pdf 文件获取并设置为数据库文件 UTF-16 编码字符串(生产者数据),它会出现像这样的奇怪字符” - 如果 问题就在那里发生,您可能应该提供给你如果您想获得有关该问题的帮助,代码正是这样做的。
  • @mkl 是的,完全正确!当您查看 pdf 文件的元数据时,一切都很好。但是当您想要获取并插入数据库时​​,其他字段(如标题、主题、关键字)并不表示任何问题。但是“生产者”字段出现问题。我想我用UTF-16 设置它。所以它是从这个原因发生的。但是如果我不设置UTF-16,unicode 字符就会掉下来。
  • 请务必展示您的代码完全这样做(即使用foreach循环获取所有pdf文件并读取元数据并插入SQLite数据库文件) ,所以这里的人有机会帮助你。
  • 编写一个显示问题的 20 到 30 行程序应该很容易,既可以创建 PDF 也可以从中读取,你能提供吗?为了这次讨论,从头开始,因为这就是我们将要做的,以帮助您。仅使用仍然存在问题的最小复杂性。
  • @ChrisHaas 没错。对不起我的冲动。我将编辑我的问题。非常感谢。

标签: sqlite pdf encoding itextsharp utf-16


【解决方案1】:

代替:

new PdfString(producer, "UTF-16")

用途:

new PdfString(producer, PdfString.TEXT_UNICODE)

UTF-16 是一种存储 Unicode 值的特定方式,但您不必担心,iText 会为您处理一切。

【讨论】:

  • 正确。 “UTF-16”实际上似乎默认为 UTF-16LE(小端),但 PDF 需要 UTF-16BE(大端)。
  • 我真诚地对你说,今天你帮了我一个大忙。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2016-10-02
  • 2023-04-11
  • 2014-01-18
  • 1970-01-01
  • 2014-05-11
  • 1970-01-01
  • 2012-10-12
  • 2013-08-17
相关资源
最近更新 更多