xmlsecurity/inc/pdfio/pdfdocument.hxx | 2 ++ xmlsecurity/source/pdfio/pdfdocument.cxx | 21 +++++++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-)
New commits: commit 834abca71b4899a3ef115df30f68ad2202019247 Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Fri Oct 21 14:33:36 2016 +0200 xmlsecurity PDF export: fix missing /Prev key in the trailer dictionary "In addition, the added trailer dictionary shall contain a Prev entry giving the location of the previous cross-reference section." (ISO-32000-1, section 7.5.6). Add it, even if it seems Adobe Acrobat can live with not writing it. Change-Id: I1f53e75ebe7dba4b45b3cf1908b2d3b031ef6b02 Reviewed-on: https://gerrit.libreoffice.org/30133 Reviewed-by: Miklos Vajna <vmik...@collabora.co.uk> Tested-by: Jenkins <c...@libreoffice.org> diff --git a/xmlsecurity/inc/pdfio/pdfdocument.hxx b/xmlsecurity/inc/pdfio/pdfdocument.hxx index bb132a6..816904f 100644 --- a/xmlsecurity/inc/pdfio/pdfdocument.hxx +++ b/xmlsecurity/inc/pdfio/pdfdocument.hxx @@ -44,6 +44,8 @@ class XMLSECURITY_DLLPUBLIC PDFDocument std::vector< std::unique_ptr<PDFElement> > m_aElements; // List of object offsets we know. std::vector<size_t> m_aXRef; + /// List of xref offsets we know. + std::vector<size_t> m_aStartXRefs; PDFTrailerElement* m_pTrailer; /// All editing takes place in this buffer, if it happens. SvMemoryStream m_aEditBuffer; diff --git a/xmlsecurity/source/pdfio/pdfdocument.cxx b/xmlsecurity/source/pdfio/pdfdocument.cxx index d36c9aa..479bc1c 100644 --- a/xmlsecurity/source/pdfio/pdfdocument.cxx +++ b/xmlsecurity/source/pdfio/pdfdocument.cxx @@ -414,6 +414,14 @@ bool PDFDocument::Sign(const uno::Reference<security::XCertificate>& xCertificat } m_aEditBuffer.WriteCharPtr("> ]\n"); } + + if (!m_aStartXRefs.empty()) + { + // Write location of the previous cross-reference section. + m_aEditBuffer.WriteCharPtr("/Prev "); + m_aEditBuffer.WriteUInt32AsString(m_aStartXRefs.back()); + } + m_aEditBuffer.WriteCharPtr(">>\n"); // Write startxref. @@ -510,6 +518,8 @@ bool PDFDocument::Read(SvStream& rStream) // Then we can tokenize the stream. rStream.Seek(0); bool bInXRef = false; + // The next number will be an xref offset. + bool bInStartXRef = false; while (true) { rStream.ReadChar(ch); @@ -584,10 +594,16 @@ bool PDFDocument::Read(SvStream& rStream) if (isdigit(ch) || ch == '-') { // Numbering object: an integer or a real. - m_aElements.push_back(std::unique_ptr<PDFElement>(new PDFNumberElement())); + PDFNumberElement* pNumberElement = new PDFNumberElement(); + m_aElements.push_back(std::unique_ptr<PDFElement>(pNumberElement)); rStream.SeekRel(-1); - if (!m_aElements.back()->Read(rStream)) + if (!pNumberElement->Read(rStream)) return false; + if (bInStartXRef) + { + bInStartXRef = false; + m_aStartXRefs.push_back(pNumberElement->GetValue()); + } } else if (isalpha(ch)) { @@ -688,6 +704,7 @@ bool PDFDocument::Read(SvStream& rStream) } else if (aKeyword == "startxref") { + bInStartXRef = true; } else { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits