fix linearized pdf

This commit is contained in:
Kulikova Svetlana
2022-04-25 11:02:32 +03:00
parent 2cc6ed350c
commit 5ffd7e9537
8 changed files with 46 additions and 9 deletions

View File

@ -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()

View File

@ -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;

View File

@ -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();

View File

@ -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);

View File

@ -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"}";

View File

@ -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();

View File

@ -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();
}

View File

@ -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);