PDF文件是否包含iref流?

时间:2012-10-08 13:00:56

标签: c# pdf pdfsharp

我仍然使用PDF文件中的读取数据。我使用PDFsharp,如何在不使用方法Open的情况下检查文件是否包含iref流。如果文件包含 iref流,则方法Open抛出异常。

4 个答案:

答案 0 :(得分:20)

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

总结一下解决方案:

  1. 下载并添加iTextSharp 4.1.6 library
  2. 将以下代码粘贴到您的项目的代码文件中:
  3. -

    using System;
    using System.IO;
    
    namespace PdfSharp.Pdf.IO
    {
        static public class CompatiblePdfReader
        {
            /// <summary>
            /// uses itextsharp 4.1.6 to convert any pdf to 1.4 compatible pdf, called instead of PdfReader.open
            /// </summary>
            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);
                }
            }
    
            /// <summary>
            /// uses itextsharp 4.1.6 to convert any pdf to 1.4 compatible pdf, called instead of PdfReader.open
            /// </summary>
            static public PdfDocument Open(byte[] fileArray)
            {
                return Open(new MemoryStream(fileArray));
            }
    
            /// <summary>
            /// uses itextsharp 4.1.6 to convert any pdf to 1.4 compatible pdf, called instead of PdfReader.open
            /// </summary>
            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.OpenCompatiblePdfReader.Open
    2. 它对我来说就像一个魅力,希望这对你有所帮助。

答案 1 :(得分:10)

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

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

答案 2 :(得分:0)

虽然回复较晚但可能有用。

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

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#等价物。

答案 3 :(得分:0)

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

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