PDF文件是否包含iref流?

我仍然与PDF文件中的读取数据作斗争。
我使用PDFsharp,如何在没有使用方法Open的情况下检查文件是否包含iref流。 如果文件包含iref流,则方法Open抛出exception。

有一个知道的解决方法允许你打开包含iref的pdf文件:你可以在这里找到关于它的完整线程。

只是总结一下解决方案:

  1. 下载并包含iTextSharp 4.1.6库
  2. 将以下代码粘贴到代码文件中:

using System; using System.IO; namespace PdfSharp.Pdf.IO { static public class CompatiblePdfReader { ///  /// uses itextsharp 4.1.6 to convert any pdf to 1.4 compatible pdf, called instead of PdfReader.open ///  static public PdfDocument Open(string pdfPath) { using (var fileStream = new FileStream(pdfPath, FileMode.Open, FileAccess.Read)) { var len = (int)fileStream.Length; var fileArray = new Byte[len]; fileStream.Read(fileArray, 0, len); fileStream.Close(); return Open(fileArray); } } ///  /// uses itextsharp 4.1.6 to convert any pdf to 1.4 compatible pdf, called instead of PdfReader.open ///  static public PdfDocument Open(byte[] fileArray) { return Open(new MemoryStream(fileArray)); } ///  /// uses itextsharp 4.1.6 to convert any pdf to 1.4 compatible pdf, called instead of PdfReader.open ///  static public PdfDocument Open(MemoryStream sourceStream) { PdfDocument outDoc; sourceStream.Position = 0; try { outDoc = PdfReader.Open(sourceStream, PdfDocumentOpenMode.Import); } catch (PdfReaderException) { //workaround if pdfsharp doesn't support this pdf sourceStream.Position = 0; var outputStream = new MemoryStream(); var reader = new iTextSharp.text.pdf.PdfReader(sourceStream); var pdfStamper = new iTextSharp.text.pdf.PdfStamper(reader, outputStream) {FormFlattening = true}; pdfStamper.Writer.SetPdfVersion(iTextSharp.text.pdf.PdfWriter.PDF_VERSION_1_4); pdfStamper.Writer.CloseStream = false; pdfStamper.Close(); outDoc = PdfReader.Open(outputStream, PdfDocumentOpenMode.Import); } return outDoc; } } } 
  1. 将您对PdfReader.Open所有调用更改为CompatiblePdfReader.Open

它对我来说就像一个魅力,希望这对你有所帮助。

PDFsharp 1.32及更早版本不支持iref流。

自2015年12月起,我们拥有支持iref流的PDFsharp 1.50。

虽然迟到的回复但可能有用。

我处于相同的情况(C#Project使用pdfSharp)。 我有一个PowerShell脚本,它在合并时忽略带有iref流的文件(因此不会抛出exception)。

 Function Merge-PDF { Param($path, $filename) $output = New-Object PdfSharp.Pdf.PdfDocument $PdfReader = [PdfSharp.Pdf.IO.PdfReader] $PdfDocumentOpenMode = [PdfSharp.Pdf.IO.PdfDocumentOpenMode] foreach($i in (gci $path *.pdf -Recurse)) { $input = New-Object PdfSharp.Pdf.PdfDocument $input = $PdfReader::Open($i.fullname, $PdfDocumentOpenMode::Import) $input.Pages | %{$output.AddPage($_)} } $output.Save($filename) } Merge-PDF -path c:\reports -filename c:\reports\zzFull_deck.pdf 

肯定会在以后发布上述函数的C#等价物。

解决方法是捕获PdfSharp.Pdf.IO.PdfReaderException ,并忽略导致此类exception的文件。

 PdfDocument inputPDFDocument = new PdfDocument(); try { inputPDFDocument = PdfReader.Open(pdfFile, PdfDocumentOpenMode.Import); } catch (PdfSharp.Pdf.IO.PdfReaderException) { // }