【问题标题】:How to extract all pages and attachments from PDF to PNG如何将所有页面和附件从 PDF 提取为 PNG
【发布时间】:2021-05-14 12:39:43
【问题描述】:

我正在尝试在 .NET 中创建一个流程来将 PDF 及其所有页面 + 附件转换为 PNG。我正在评估图书馆并遇到了 PDFiumSharp,但它对我不起作用。这是我的代码:

string Inputfile = "input.pdf";
string OutputFolder = "Output";

string fileName = Path.GetFileNameWithoutExtension(Inputfile);

using (PdfDocument doc = new PdfDocument(Inputfile))
{
   for (int i = 0; i < doc.Pages.Count; i++)
   {
      var page = doc.Pages[i];
      using (var bitmap = new PDFiumBitmap((int)page.Width, (int)page.Height, false))
      {
         page.Render(bitmap);
         var targetFile = Path.Combine(OutputFolder, fileName + "_" + i + ".png");
         bitmap.Save(targetFile);
      }
   }
}

当我运行这段代码时,我得到了这个异常:

screenshot of exception

有谁知道如何解决这个问题? PDFiumSharp 还支持提取 PDF 附件吗?如果没有,是否有人对如何实现我的目标有任何其他想法?

【问题讨论】:

    标签: c# .net pdf


    【解决方案1】:

    PDFium 看起来不支持提取 PDF 附件。如果你想实现你的目标,那么你可以看看另一个支持提取 PDF 附件以及将 PDF 转换为 PNG 的库。

    我是 LEADTOOLS PDF SDK 的员工,您可以通过以下 2 个 nuget 包试用: https://www.nuget.org/packages/Leadtools.Pdf/

    https://www.nuget.org/packages/Leadtools.Document.Sdk/

    这里有一些代码可以将 PDF + PDF 中的所有附件转换为输出目录中的单独 PNG:

    SetLicense();
    cache = new FileCache { CacheDirectory = "cache" };
    
    List<LEADDocument> documents = new List<LEADDocument>();
    
    if (!Directory.Exists(OutputDir))
       Directory.CreateDirectory(OutputDir);
    
    using var document = DocumentFactory.LoadFromFile("attachments.pdf", new LoadDocumentOptions { Cache = cache, LoadAttachmentsMode = DocumentLoadAttachmentsMode.AsAttachments });
    
    if (document.Pages.Count > 0)
       documents.Add(document);
    
    foreach (var attachment in document.Attachments)
       documents.Add(document.LoadDocumentAttachment(new LoadAttachmentOptions { AttachmentNumber = attachment.AttachmentNumber }));
    
    ConvertDocuments(documents, RasterImageFormat.Png);
    

    还有 ConvertDocuments 方法:

    static void ConvertDocuments(IEnumerable<LEADDocument> documents, RasterImageFormat imageFormat)
    {
       using var converter = new DocumentConverter();
       using var ocrEngine = OcrEngineManager.CreateEngine(OcrEngineType.LEAD);
       ocrEngine.Startup(null, null, null, null);
       converter.SetOcrEngineInstance(ocrEngine, false);
       converter.SetDocumentWriterInstance(new DocumentWriter());
    
       foreach (var document in documents)
       {
          var name = string.IsNullOrEmpty(document.Name) ? "Attachment" : document.Name;
          string outputFile = Path.Combine(OutputDir, $"{name}.{RasterCodecs.GetExtension(imageFormat)}");
          int count = 1;
          while (File.Exists(outputFile))
             outputFile = Path.Combine(OutputDir, $"{name}({count++}).{RasterCodecs.GetExtension(imageFormat)}");
    
          var jobData = new DocumentConverterJobData
          {
             Document = document,
             Cache = cache,
             DocumentFormat = DocumentFormat.User,
             RasterImageFormat = imageFormat,
             RasterImageBitsPerPixel = 0,
             OutputDocumentFileName = outputFile,
          };
          var job = converter.Jobs.CreateJob(jobData);
          converter.Jobs.RunJob(job);
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-13
      • 2021-12-21
      • 2012-06-15
      • 1970-01-01
      • 2017-07-28
      • 2011-10-19
      • 2011-09-12
      • 1970-01-01
      相关资源
      最近更新 更多