diff --git a/DesktopEditor/graphics/pro/js/wasm/src/drawingfile.h b/DesktopEditor/graphics/pro/js/wasm/src/drawingfile.h index 1966a2ead5..2b2351d023 100644 --- a/DesktopEditor/graphics/pro/js/wasm/src/drawingfile.h +++ b/DesktopEditor/graphics/pro/js/wasm/src/drawingfile.h @@ -17,6 +17,7 @@ private: NSFonts::IFontManager* pFontManager; NSHtmlRenderer::CHTMLRendererText* pTextRenderer; int nType; + int nFileLength; public: CGraphicsFileDrawing(NSFonts::IApplicationFonts* pFonts) { @@ -32,6 +33,7 @@ public: pFontManager->SetOwnerCache(pFontCache); nType = -1; + nFileLength = -1; } ~CGraphicsFileDrawing() { @@ -40,10 +42,12 @@ public: RELEASEOBJECT(pFontManager); RELEASEINTERFACE(pApplicationFonts); nType = -1; + nFileLength = -1; } bool Open(BYTE* data, DWORD length, int _nType, const char* password) { nType = _nType; + nFileLength = length; if (nType == 0) pReader = new PdfReader::CPdfReader(pApplicationFonts); else if (nType == 1) @@ -112,7 +116,7 @@ public: } std::wstring GetInfo() { - return pReader->GetInfo(); + return pReader->GetInfo(nFileLength); } void DestroyText() diff --git a/DesktopEditor/graphics/pro/officedrawingfile.h b/DesktopEditor/graphics/pro/officedrawingfile.h index f0921d4d13..4ab520c4cb 100644 --- a/DesktopEditor/graphics/pro/officedrawingfile.h +++ b/DesktopEditor/graphics/pro/officedrawingfile.h @@ -85,7 +85,7 @@ public: bool bIsDarkMode = false); // Common methods for viewer - virtual std::wstring GetInfo() = 0; + virtual std::wstring GetInfo(unsigned long nFileLength) = 0; #ifdef BUILDING_WASM_MODULE virtual unsigned char* GetStructure() = 0; virtual unsigned char* GetLinks(int nPageIndex) = 0; diff --git a/DjVuFile/DjVu.cpp b/DjVuFile/DjVu.cpp index efc5334c43..c3959e60e0 100644 --- a/DjVuFile/DjVu.cpp +++ b/DjVuFile/DjVu.cpp @@ -98,7 +98,7 @@ void CDjVuFile::DrawPageOnRenderer(IRenderer* pRenderer, int nPageIndex, bool* p if (m_pImplementation) m_pImplementation->DrawPageOnRenderer(pRenderer, nPageIndex, pBreak); } -std::wstring CDjVuFile::GetInfo() +std::wstring CDjVuFile::GetInfo(unsigned long nFileLength) { if (m_pImplementation) return m_pImplementation->GetInfo(); diff --git a/DjVuFile/DjVu.h b/DjVuFile/DjVu.h index 1d685be528..a883c429af 100644 --- a/DjVuFile/DjVu.h +++ b/DjVuFile/DjVu.h @@ -70,7 +70,7 @@ public: virtual int GetPagesCount(); virtual void GetPageInfo(int nPageIndex, double* pdWidth, double* pdHeight, double* pdDpiX, double* pdDpiY); virtual void DrawPageOnRenderer(IRenderer* pRenderer, int nPageIndex, bool* pBreak); - virtual std::wstring GetInfo(); + virtual std::wstring GetInfo(unsigned long nFileLength); void ConvertToPdf(const std::wstring& path); diff --git a/PdfReader/PdfReader.cpp b/PdfReader/PdfReader.cpp index 2a4e3d4d42..074feddbae 100644 --- a/PdfReader/PdfReader.cpp +++ b/PdfReader/PdfReader.cpp @@ -51,6 +51,8 @@ #include "lib/xpdf/ImageOutputDev.h" #include "lib/xpdf/TextString.h" #include "lib/xpdf/SecurityHandler.h" +#include "lib/xpdf/Lexer.h" +#include "lib/xpdf/Parser.h" #include "Src/RendererOutputDev.h" #ifdef BUILDING_WASM_MODULE @@ -647,10 +649,14 @@ return 0; }\ }\ - std::wstring CPdfReader::GetInfo() + std::wstring CPdfReader::GetInfo(unsigned long nFileLength) { if (!m_pInternal->m_pPDFDocument) return NULL; + XRef* xref = m_pInternal->m_pPDFDocument->getXRef(); + BaseStream* str = m_pInternal->m_pPDFDocument->getBaseStream(); + if (!xref || !str) + return NULL; std::wstring sRes = L"{"; @@ -690,7 +696,34 @@ return 0; sRes += L",\"NumberOfPages\":"; sRes += std::to_wstring(GetPagesCount()); sRes += L",\"FastWebView\":"; - sRes += m_pInternal->m_pPDFDocument->isLinearized() ? L"true" : L"false"; + + Object obj2, obj3, obj4, obj5, obj6; + bool bLinearized = false; + obj1.initNull(); + Parser* parser = new Parser(xref, new Lexer(xref, str->makeSubStream(str->getStart(), gFalse, 0, &obj1)), gTrue); + parser->getObj(&obj1); + parser->getObj(&obj2); + parser->getObj(&obj3); + parser->getObj(&obj4); + if (obj1.isInt() && obj2.isInt() && obj3.isCmd("obj") && obj4.isDict()) + { + obj4.dictLookup("Linearized", &obj5); + obj4.dictLookup("L", &obj6); + if (obj5.isNum() && obj5.getNum() > 0 && obj6.isNum()) + { + unsigned long size = obj6.getNum(); + bLinearized = size == nFileLength; + } + obj6.free(); + obj5.free(); + } + obj4.free(); + obj3.free(); + obj2.free(); + obj1.free(); + delete parser; + + sRes += bLinearized ? L"true" : L"false"; sRes += L",\"Tagged\":"; sRes += m_pInternal->m_pPDFDocument->getStructTreeRoot()->isDict() ? L"true" : L"false"; sRes += L"}"; diff --git a/PdfReader/PdfReader.h b/PdfReader/PdfReader.h index 583a4c1883..01b901643f 100644 --- a/PdfReader/PdfReader.h +++ b/PdfReader/PdfReader.h @@ -84,7 +84,7 @@ namespace PdfReader virtual int GetPagesCount(); virtual void GetPageInfo(int nPageIndex, double* pdWidth, double* pdHeight, double* pdDpiX, double* pdDpiY); virtual void DrawPageOnRenderer(IRenderer* pRenderer, int nPageIndex, bool* pBreak); - virtual std::wstring GetInfo(); + virtual std::wstring GetInfo(unsigned long nFileLength); int GetError(); double GetVersion(); diff --git a/XpsFile/XpsFile.cpp b/XpsFile/XpsFile.cpp index 0f6855159f..c8cfc939ba 100644 --- a/XpsFile/XpsFile.cpp +++ b/XpsFile/XpsFile.cpp @@ -180,7 +180,7 @@ void CXpsFile::DrawPageOnRenderer(IRenderer* pRenderer, int nPageIndex, bool* pB m_pInternal->m_pDocument->DrawPage(nPageIndex, pRenderer, pBreak); } -std::wstring CXpsFile::GetInfo() +std::wstring CXpsFile::GetInfo(unsigned long nFileLength) { return m_pInternal->m_pDocument->GetInfo(); } diff --git a/XpsFile/XpsFile.h b/XpsFile/XpsFile.h index aeb9ee2563..d015702d94 100644 --- a/XpsFile/XpsFile.h +++ b/XpsFile/XpsFile.h @@ -65,7 +65,7 @@ public: virtual int GetPagesCount(); virtual void GetPageInfo(int nPageIndex, double* pdWidth, double* pdHeight, double* pdDpiX, double* pdDpiY); virtual void DrawPageOnRenderer(IRenderer* pRenderer, int nPageIndex, bool* pBreak); - virtual std::wstring GetInfo(); + virtual std::wstring GetInfo(unsigned long nFileLength); #ifndef DISABLE_PDF_CONVERTATION void ConvertToPdf(const std::wstring& wsDstPath);