From b1e0dcff16740d5a99e58c298284c5d589b3034f Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sun, 5 Sep 2010 15:00:44 +0000 Subject: handle stream filter abbreviations from table H.1 git-svn-id: svn+q:///qpdf/trunk@1025 71b93d88-0707-0410-a8cf-f5a4172ac649 --- libqpdf/QPDFWriter.cc | 4 +++- libqpdf/QPDF_Stream.cc | 26 +++++++++++++++++++++++++- libqpdf/qpdf/QPDF_Stream.hh | 2 ++ 3 files changed, 30 insertions(+), 2 deletions(-) (limited to 'libqpdf') diff --git a/libqpdf/QPDFWriter.cc b/libqpdf/QPDFWriter.cc index 2985118a..68fd62f5 100644 --- a/libqpdf/QPDFWriter.cc +++ b/libqpdf/QPDFWriter.cc @@ -993,7 +993,9 @@ QPDFWriter::unparseObject(QPDFObjectHandle object, int level, // compressed with a lossy compression scheme, but we // don't support any of those right now. QPDFObjectHandle filter_obj = stream_dict.getKey("/Filter"); - if (filter_obj.isName() && (filter_obj.getName() == "/FlateDecode")) + if (filter_obj.isName() && + ((filter_obj.getName() == "/FlateDecode") || + (filter_obj.getName() == "/Fl"))) { QTC::TC("qpdf", "QPDFWriter not recompressing /FlateDecode"); filter = false; diff --git a/libqpdf/QPDF_Stream.cc b/libqpdf/QPDF_Stream.cc index 72be2e32..db6cfb58 100644 --- a/libqpdf/QPDF_Stream.cc +++ b/libqpdf/QPDF_Stream.cc @@ -18,6 +18,8 @@ #include +std::map QPDF_Stream::filter_abbreviations; + QPDF_Stream::QPDF_Stream(QPDF* qpdf, int objid, int generation, QPDFObjectHandle stream_dict, off_t offset, int length) : @@ -93,6 +95,21 @@ QPDF_Stream::filterable(std::vector& filters, int& predictor, int& columns, bool& early_code_change) { + if (filter_abbreviations.empty()) + { + // The PDF specification provides these filter abbreviations + // for use in inline images, but according to table H.1 in the + // pre-ISO versions of the PDF specification, Adobe Reader + // also accepts them for stream filters. + filter_abbreviations["/AHx"] = "/ASCIIHexDecode"; + filter_abbreviations["/A85"] = "/ASCII85Decode"; + filter_abbreviations["/LZW"] = "/LZWDecode"; + filter_abbreviations["/Fl"] = "/FlateDecode"; + filter_abbreviations["/RL"] = "/RunLengthDecode"; + filter_abbreviations["/CCF"] = "/CCITTFaxDecode"; + filter_abbreviations["/DCT"] = "/DCTDecode"; + } + // Initialize values to their defaults as per the PDF spec predictor = 1; columns = 0; @@ -243,7 +260,14 @@ QPDF_Stream::filterable(std::vector& filters, for (std::vector::iterator iter = filters.begin(); iter != filters.end(); ++iter) { - std::string const& filter = *iter; + std::string& filter = *iter; + + if (filter_abbreviations.count(filter)) + { + QTC::TC("qpdf", "QPDF_Stream expand filter abbreviation"); + filter = filter_abbreviations[filter]; + } + if (! ((filter == "/Crypt") || (filter == "/FlateDecode") || (filter == "/LZWDecode") || diff --git a/libqpdf/qpdf/QPDF_Stream.hh b/libqpdf/qpdf/QPDF_Stream.hh index ed70ae8f..144a9274 100644 --- a/libqpdf/qpdf/QPDF_Stream.hh +++ b/libqpdf/qpdf/QPDF_Stream.hh @@ -38,6 +38,8 @@ class QPDF_Stream: public QPDFObject void setObjGen(int objid, int generation); private: + static std::map filter_abbreviations; + void replaceFilterData(QPDFObjectHandle const& filter, QPDFObjectHandle const& decode_parms, size_t length); -- cgit v1.2.3-54-g00ecf