在 C# 中不使用第三方库的图像到 PDF 转换

Image to PDF conversion without using third party library in C#

我需要在不使用 C# 中的第三方库的情况下将图像文件转换为 PDF。图片可以是任何格式,例如 (.jpg、.png、.jpeg、.tiff)。

在 itextsharp 的帮助下,我成功地做到了这一点;这是代码。

string value = string.Empty;//value contains the data from a json file
    List<string> sampleData;
    public void convertdata()
    {
        //sampleData = Newtonsoft.Json.JsonConvert.DeserializeObject<List<string>>(value);
        var jsonD = System.IO.File.ReadAllLines(@"json.txt");
        sampleData = Newtonsoft.Json.JsonConvert.DeserializeObject<List<string>>(jsonD[0]);
        Document document = new Document();

        using (var stream = new FileStream("test111.pdf", FileMode.Create, FileAccess.Write, FileShare.None))
        {
            PdfWriter.GetInstance(document, stream);
            document.Open();

            foreach (var item in sampleData)
            {
                newdata = Convert.FromBase64String(item);
                var image = iTextSharp.text.Image.GetInstance(newdata);
                document.Add(image);
                Console.WriteLine("Conversion done check folder");

            }
            document.Close();
        }

但现在我需要在不使用第三方库的情况下执行相同的操作。

我已经在互联网上进行了搜索,但无法找到可以建议正确答案的内容。我得到的只是将它与 "itextsharp" 或 "PdfSharp" 或 "GhostScriptApi".

一起使用

有人会提出可能的解决方案吗?

这是可行的,但不实用,因为它很可能会花费您太多时间来实施。一般程序是:

  1. 打开图片文件格式
  2. 要么将编码字节逐字复制到您创建的 PDF 文档中的流中,要么解码图像数据并将其重新编码为 PDF 流(前者还是后者取决于图像格式)
  3. 保存 PDF

这看起来很简单(毕竟只有三点:-))但是当你开始调查时你会发现它非常复杂。

首先,您需要充分了解 PDF 规范,才能从头开始编写新的 PDF 文件,并做所有正确的事情。 PDF 规范现在已经超过 1000 页;您不需要全部,但您需要支持其中的很大一部分才能编写正确的 PDF 文档。

其次,您需要了解您想要支持的每种图像文件格式。这本身并不是微不足道的(例如,TIFF 文件格式非常广泛,以至于支持合理比例的 TIFF 文件是一场噩梦)。在某些情况下,您可以简单地将大量图像文件格式复制到您的 PDF 文档中(例如 jpeg 文件属于该类别),这是您想要支持的复杂功能,因为解压缩 JPEG 文件然后重新压缩它PDF 流会导致质量下降。

那么……可能吗?是的。合理吗?不。除非你有很多很多时间来完成这个项目。

最简单的单页单图PDF文档结构如下:

- pdf header
- pdf document catalog
- pages info 
- image 
  - image header
  - image data 
- page
  - reference to image
- list of references to objects inside pdf document   

检查 this Python 执行以下步骤将图像转换为 PDF 的代码:

  1. 写入 PDF header;
  2. 检查图像数据以查找要使用的滤镜。你最好 select 只有一种格式,如 FlateDecode 编解码器(PDF 使用它来无损压缩图像);
  3. 写入 "catalog" object 这基本上是对页面 objects.
  4. 的引用数组
  5. 写入图像 object header;
  6. 写入图像数据(逐个像素,转换为给定的编解码器格式)作为 pdf 中的 "stream" object;
  7. 写入 "page" object 其中包含 "image" object;
  8. 写入 "trailer" 部分,其中包含对 PDF 中 objects 的引用集及其起始偏移量。 PDF 格式在 PDF 文档的末尾存储 object 的引用。

我会编写自己的 ASP.NET Web 服务或 Web API 服务并在应用程序中调用它:)