[英]'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))时,我收到一个例外:
PdfSharp.dll中发生未处理的“PdfSharp.Pdf.IO.PdfReaderException”类型的异常附加信息:无法处理iref流。 PDFsharp的当前实现无法处理Acrobat 6中引入的此PDF功能。
我该怎么办? 我需要合并所有文件,我不能跳过它。 我试图找到解决方案,但发现没有回答,或者只是来自PDFsharp团队的非常老的反馈意见,他们将“修复它”。
您可以使用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;
}
我希望这可以帮助那些经历同样痛苦的人,并将它们保存几天!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.