我仍然与从 PDF 文件中读取数据作斗争。
我使用 PDFsharp,如何在不使用 Open 方法的情况下检查文件是否包含 iref 流。如果文件包含iref 流,方法 Open 将引发异常。
问问题
11888 次
4 回答
20
有一个已知的解决方法允许您打开包含 iref 的 pdf 文件:您可以在此处找到有关此的完整线程。
简单总结一下解决方案:
- 下载并包含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
。
它对我来说就像一个魅力,希望这对你有帮助。
于 2013-09-27T13:26:12.470 回答
10
PDFsharp 1.32 和更早版本不支持 iref 流。
自 2015 年 12 月以来,我们拥有支持 iref 流的 PDFsharp 1.50。
于 2016-04-22T13:38:30.577 回答
0
虽然回复晚了,但可能有用。
我处于同样的情况(使用 pdfSharp 的 C# 项目)。我有一个 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#。
于 2013-08-25T07:09:10.657 回答
-1
解决方法是捕获PdfSharp.Pdf.IO.PdfReaderException
,并忽略导致此类异常的文件。
PdfDocument inputPDFDocument = new PdfDocument();
try
{
inputPDFDocument = PdfReader.Open(pdfFile, PdfDocumentOpenMode.Import);
}
catch (PdfSharp.Pdf.IO.PdfReaderException)
{
//
}
于 2013-08-25T08:34:10.097 回答