mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-07-20 03:55:47 +08:00
fix linearized pdf
This commit is contained in:
@ -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()
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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"}";
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
Reference in New Issue
Block a user