'PDFsharp cannot handle this PDF feature introduced with Acrobat 6' 打开 PDF 文件时出错
'PDFsharp cannot handle this PDF feature introduced with Acrobat 6' error while opening PDF file
我使用 PDFsharp (v1.32) 合并多个 PDF 文件。我使用此代码打开文档:
PdfDocument inputDocument = PdfReader.Open(pdfFilePath, PdfDocumentOpenMode.Import);
打开一个文档(使用 PDF 版本 1.5 (Acrobat 6.x))时我收到一个异常:
An unhandled exception of type 'PdfSharp.Pdf.IO.PdfReaderException' occurred in PdfSharp.dll
Additional information: Cannot handle iref streams. The current implementation of PDFsharp cannot handle this PDF feature introduced with Acrobat 6.
我能用它做什么?我需要合并所有文件,我不能跳过它。我试图找到解决方案,但没有找到答案,或者只是来自 PDFsharp 团队的非常旧的反馈,他们将要 "fix it"。
使用 2015 年 12 月发布的 PDFsharp 1.50 beta 3 或更新版本。
https://www.nuget.org/packages/PdfSharp/1.50.4820-RC1
https://www.nuget.org/packages/PDFsharp-gdi/1.50.4820-RC1
https://www.nuget.org/packages/PDFsharp-wpf/1.50.4820-RC1
您可以使用 iText5 或 iText7 删除 iref 流。
下面的 iText5 块是从 http://forum.pdfsharp.net/viewtopic.php?f=2&t=693
中提取的
static public PdfDocument Open(MemoryStream sourceStream)
{
PdfDocument outDoc = null;
sourceStream.Position = 0;
try
{
outDoc = PdfReader.Open(sourceStream, PdfDocumentOpenMode.Import);
}
catch (PdfSharp.Pdf.IO.PdfReaderException)
{
//workaround if pdfsharp doesn't support this pdf
sourceStream.Position = 0;
MemoryStream outputStream = new MemoryStream();
iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(sourceStream);
iTextSharp.text.pdf.PdfStamper pdfStamper = new iTextSharp.text.pdf.PdfStamper(reader, outputStream);
pdfStamper.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;
}
我不得不为 iText7 重写它(仍然使用旧的 PDFSharp):
static PdfDocument CompatibleOpen(MemoryStream inputStream, PdfDocumentOpenMode openMode)
{
PdfDocument pdfDocument = null;
inputStream.Position = 0;
try
{
pdfDocument = PdfReader.Open(inputStream, openMode);
}
catch (PdfSharp.Pdf.IO.PdfReaderException)
{
inputStream.Position = 0;
MemoryStream outputStream = new MemoryStream();
iText.Kernel.Pdf.WriterProperties writerProperties = new iText.Kernel.Pdf.WriterProperties();
writerProperties.SetPdfVersion(iText.Kernel.Pdf.PdfVersion.PDF_1_4);
iText.Kernel.Pdf.PdfReader pdfReader = new iText.Kernel.Pdf.PdfReader(inputStream);
iText.Kernel.Pdf.PdfDocument pdfStamper = new iText.Kernel.Pdf.PdfDocument(pdfReader, new iText.Kernel.Pdf.PdfWriter(outputStream, writerProperties));
iText.Forms.PdfAcroForm pdfForm = iText.Forms.PdfAcroForm.GetAcroForm(pdfStamper, true);
if (!pdfForm.IsNull())
{
pdfForm.FlattenFields();
}
writerProperties.SetFullCompressionMode(false);
pdfStamper.GetWriter().SetCloseStream(false);
pdfStamper.Close();
pdfDocument = PdfReader.Open(outputStream, openMode);
}
return pdfDocument;
}
我希望这能帮助那些正在经历同样痛苦的人,并为他们节省几天时间!!!
我使用 PDFsharp (v1.32) 合并多个 PDF 文件。我使用此代码打开文档:
PdfDocument inputDocument = PdfReader.Open(pdfFilePath, PdfDocumentOpenMode.Import);
打开一个文档(使用 PDF 版本 1.5 (Acrobat 6.x))时我收到一个异常:
An unhandled exception of type 'PdfSharp.Pdf.IO.PdfReaderException' occurred in PdfSharp.dll Additional information: Cannot handle iref streams. The current implementation of PDFsharp cannot handle this PDF feature introduced with Acrobat 6.
我能用它做什么?我需要合并所有文件,我不能跳过它。我试图找到解决方案,但没有找到答案,或者只是来自 PDFsharp 团队的非常旧的反馈,他们将要 "fix it"。
使用 2015 年 12 月发布的 PDFsharp 1.50 beta 3 或更新版本。
https://www.nuget.org/packages/PdfSharp/1.50.4820-RC1
https://www.nuget.org/packages/PDFsharp-gdi/1.50.4820-RC1
https://www.nuget.org/packages/PDFsharp-wpf/1.50.4820-RC1
您可以使用 iText5 或 iText7 删除 iref 流。
下面的 iText5 块是从 http://forum.pdfsharp.net/viewtopic.php?f=2&t=693
中提取的static public PdfDocument Open(MemoryStream sourceStream)
{
PdfDocument outDoc = null;
sourceStream.Position = 0;
try
{
outDoc = PdfReader.Open(sourceStream, PdfDocumentOpenMode.Import);
}
catch (PdfSharp.Pdf.IO.PdfReaderException)
{
//workaround if pdfsharp doesn't support this pdf
sourceStream.Position = 0;
MemoryStream outputStream = new MemoryStream();
iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(sourceStream);
iTextSharp.text.pdf.PdfStamper pdfStamper = new iTextSharp.text.pdf.PdfStamper(reader, outputStream);
pdfStamper.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;
}
我不得不为 iText7 重写它(仍然使用旧的 PDFSharp):
static PdfDocument CompatibleOpen(MemoryStream inputStream, PdfDocumentOpenMode openMode)
{
PdfDocument pdfDocument = null;
inputStream.Position = 0;
try
{
pdfDocument = PdfReader.Open(inputStream, openMode);
}
catch (PdfSharp.Pdf.IO.PdfReaderException)
{
inputStream.Position = 0;
MemoryStream outputStream = new MemoryStream();
iText.Kernel.Pdf.WriterProperties writerProperties = new iText.Kernel.Pdf.WriterProperties();
writerProperties.SetPdfVersion(iText.Kernel.Pdf.PdfVersion.PDF_1_4);
iText.Kernel.Pdf.PdfReader pdfReader = new iText.Kernel.Pdf.PdfReader(inputStream);
iText.Kernel.Pdf.PdfDocument pdfStamper = new iText.Kernel.Pdf.PdfDocument(pdfReader, new iText.Kernel.Pdf.PdfWriter(outputStream, writerProperties));
iText.Forms.PdfAcroForm pdfForm = iText.Forms.PdfAcroForm.GetAcroForm(pdfStamper, true);
if (!pdfForm.IsNull())
{
pdfForm.FlattenFields();
}
writerProperties.SetFullCompressionMode(false);
pdfStamper.GetWriter().SetCloseStream(false);
pdfStamper.Close();
pdfDocument = PdfReader.Open(outputStream, openMode);
}
return pdfDocument;
}
我希望这能帮助那些正在经历同样痛苦的人,并为他们节省几天时间!!!