PDF文件是否包含iref流? [英] Does PDF file contain iref stream?
本文介绍了PDF文件是否包含iref流?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我仍在处理从PDF文件中读取数据的问题.
我使用PDFsharp,如何在不使用打开方法的情况下检查文件是否包含iref流.如果文件包含 iref流,则Open方法将引发异常.
I still fight with read data from PDF file.
I use PDFsharp, how can I check if file contains iref stream without use method Open. Method Open throws exception if file contains iref stream.
推荐答案
有一个已知的解决方法,也可以让您打开包含iref的pdf文件:您可以找到
There is a know workaround to permit you to open ALSO the pdf files that contains iref: you can find here the complete thread about that.
仅概述解决方案:
- 下载并包含 iTextSharp 4.1.6库
- 在代码文件中粘贴以下代码到您的项目中:
-
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;
}
}
}
- 将所有呼叫从
PdfReader.Open
更改为CompatiblePdfReader.Open
.
- Change all your calls to
PdfReader.Open
toCompatiblePdfReader.Open
.
对我来说,它像一种魅力,希望对您有帮助.
It works like a charm for me, hope this helps you.
这篇关于PDF文件是否包含iref流?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文