diff --git a/PdfFile/PdfEditor.cpp b/PdfFile/PdfEditor.cpp index 1cc750ba50..e98e242278 100644 --- a/PdfFile/PdfEditor.cpp +++ b/PdfFile/PdfEditor.cpp @@ -3632,6 +3632,8 @@ bool CPdfEditor::IsBase14(const std::wstring& wsFontName, bool& bBold, bool& bIt void CPdfEditor::Redact(IAdvancedCommand* _pCommand) { PDFDoc* pPDFDocument = NULL; + PdfReader::CPdfFontList* pFontList = NULL; + int nStartRefID = 0; PDFRectangle* cropBox = NULL; int nPageIndex = -1; Page* pPage = NULL; @@ -3639,7 +3641,7 @@ void CPdfEditor::Redact(IAdvancedCommand* _pCommand) PdfWriter::CDocument* pDoc = m_pWriter->GetDocument(); if (bEditPage) { - nPageIndex = m_pReader->GetPageIndex(m_nEditPage, &pPDFDocument); + nPageIndex = m_pReader->GetPageIndex(m_nEditPage, &pPDFDocument, &pFontList, &nStartRefID); if (nPageIndex < 0 || !pPDFDocument) return; pPage = pPDFDocument->getCatalog()->getPage(nPageIndex); @@ -3676,7 +3678,7 @@ void CPdfEditor::Redact(IAdvancedCommand* _pCommand) if (bEditPage) { - PdfWriter::RedactOutputDev oRedactOut(m_pWriter, &m_mObjManager); + PdfWriter::RedactOutputDev oRedactOut(m_pWriter, &m_mObjManager, nStartRefID); oRedactOut.NewPDF(pPDFDocument->getXRef()); oRedactOut.SetRedact(arrAllQuads); diff --git a/PdfFile/SrcWriter/RedactOutputDev.cpp b/PdfFile/SrcWriter/RedactOutputDev.cpp index 7f0a1d2436..9833fbfa38 100644 --- a/PdfFile/SrcWriter/RedactOutputDev.cpp +++ b/PdfFile/SrcWriter/RedactOutputDev.cpp @@ -501,12 +501,13 @@ void ApplyRedactToGray(const std::vector& arrQuadPoints, BYTE* pImage, i } //----- constructor/destructor -RedactOutputDev::RedactOutputDev(CPdfWriter* pRenderer, CObjectsManager* pObjMng) +RedactOutputDev::RedactOutputDev(CPdfWriter* pRenderer, CObjectsManager* pObjMng, int nStartRefID) { m_pXref = NULL; m_pRenderer = pRenderer; m_mObjManager = pObjMng; + m_nStartRefID = nStartRefID; m_pDoc = m_pRenderer->GetDocument(); m_pPage = NULL; @@ -1071,9 +1072,9 @@ void RedactOutputDev::drawImageMask(GfxState *pGState, Gfx *gfx, Object *pRef, S pObj = CreateImage(gfx, nWidth, nHeight, STREAM_FILTER_FLATE_DECODE, 1, NULL); else { - pObj = m_mObjManager->GetObj(pRef->getRefNum()); + pObj = m_mObjManager->GetObj(pRef->getRefNum() + m_nStartRefID); - CDictObject* pXObject = pDocument->GetXObject(pRef->getRefNum()); + CDictObject* pXObject = pDocument->GetXObject(pRef->getRefNum() + m_nStartRefID); if (pXObject) { DrawXObject(m_sImageName.c_str()); @@ -1102,6 +1103,7 @@ void RedactOutputDev::drawImageMask(GfxState *pGState, Gfx *gfx, Object *pRef, S SaveImageMaskToStream(pDocument, (CDictObject*)pObj, pBufferPtr, nWidth, nHeight); delete[] pBufferPtr; + pDocument->AddXObject(pRef->getRefNum() + m_nStartRefID, (CDictObject*)pObj); DrawXObject(m_sImageName.c_str()); } void RedactOutputDev::drawImage(GfxState *pGState, Gfx *gfx, Object *pRef, Stream *pStream, int nWidth, int nHeight, GfxImageColorMap *pColorMap, int *pMaskColors, GBool bInlineImg, GBool interpolate) @@ -1118,9 +1120,9 @@ void RedactOutputDev::drawImage(GfxState *pGState, Gfx *gfx, Object *pRef, Strea pObj = CreateImage(gfx, nWidth, nHeight, STREAM_FILTER_DCT_DECODE, 8, "DeviceRGB"); else { - pObj = m_mObjManager->GetObj(pRef->getRefNum()); + pObj = m_mObjManager->GetObj(pRef->getRefNum() + m_nStartRefID); - CDictObject* pXObject = pDocument->GetXObject(pRef->getRefNum()); + CDictObject* pXObject = pDocument->GetXObject(pRef->getRefNum() + m_nStartRefID); if (pXObject) { DrawXObject(m_sImageName.c_str()); @@ -1148,6 +1150,7 @@ void RedactOutputDev::drawImage(GfxState *pGState, Gfx *gfx, Object *pRef, Strea SaveRGBAToStream(pDocument, (CDictObject*)pObj, pBufferPtr, nWidth, nHeight); + pDocument->AddXObject(pRef->getRefNum() + m_nStartRefID, (CDictObject*)pObj); DrawXObject(m_sImageName.c_str()); } void RedactOutputDev::drawMaskedImage(GfxState *pGState, Gfx *gfx, Object *pRef, Stream *pStream, int nWidth, int nHeight, GfxImageColorMap *pColorMap, @@ -1170,9 +1173,9 @@ void RedactOutputDev::drawSoftMaskedImage(GfxState *pGState, Gfx *gfx, Object *p pObj = CreateImage(gfx, nWidth, nHeight, STREAM_FILTER_DCT_DECODE, 8, "DeviceRGB"); else { - pObj = m_mObjManager->GetObj(pRef->getRefNum()); + pObj = m_mObjManager->GetObj(pRef->getRefNum() + m_nStartRefID); - CDictObject* pXObject = pDocument->GetXObject(pRef->getRefNum()); + CDictObject* pXObject = pDocument->GetXObject(pRef->getRefNum() + m_nStartRefID); if (pXObject) { DrawXObject(m_sImageName.c_str()); @@ -1238,6 +1241,7 @@ void RedactOutputDev::drawSoftMaskedImage(GfxState *pGState, Gfx *gfx, Object *p delete[] pMaskBufferPtr; } + pDocument->AddXObject(pRef->getRefNum() + m_nStartRefID, (CDictObject*)pObj); DrawXObject(m_sImageName.c_str()); } //----- Type 3 font operators @@ -1258,12 +1262,12 @@ void RedactOutputDev::drawForm(GfxState *pGState, Gfx *gfx, Ref id, const char* double dShiftX = 0, dShiftY = 0; DoTransform(pGState->getCTM(), &dShiftX, &dShiftY, true); - PdfWriter::CObjectBase* pObj = m_mObjManager->GetObj(id.num); + PdfWriter::CObjectBase* pObj = m_mObjManager->GetObj(id.num + m_nStartRefID); if (!pObj || pObj->GetType() != object_type_DICT) return; PdfWriter::CDocument* pDocument = m_pRenderer->GetDocument(); - CDictObject* pXObject = pDocument->GetXObject(id.num); + CDictObject* pXObject = pDocument->GetXObject(id.num + m_nStartRefID); if (pXObject) { DrawXObject(name); @@ -1369,7 +1373,7 @@ void RedactOutputDev::drawForm(GfxState *pGState, Gfx *gfx, Ref id, const char* pDocument->SetCurPage(pFakePage); pFakePage->SetStream(pDictObj->GetStream()); - RedactOutputDev* pFormOutputDev = new RedactOutputDev(m_pRenderer, m_mObjManager); + RedactOutputDev* pFormOutputDev = new RedactOutputDev(m_pRenderer, m_mObjManager, m_nStartRefID); pFormOutputDev->NewPDF(m_pXref); pFormOutputDev->m_pPage = pFakePage; std::vector arrFormQuadPoints; @@ -1404,7 +1408,7 @@ void RedactOutputDev::drawForm(GfxState *pGState, Gfx *gfx, Ref id, const char* m_pRenderer->SetPage(pCurPage); pDocument->SetCurPage(pCurPage); - pDocument->AddXObject(id.num, pDictObj); + pDocument->AddXObject(id.num + m_nStartRefID, pDictObj); RELEASEOBJECT(pFakePage); @@ -1863,7 +1867,7 @@ CObjectBase* RedactOutputDev::CreateImage(Gfx *gfx, int nWidth, int nHeight, uns Object* pContent = gfx->getTopContentStreamStack(); if (pContent && pContent->isRef()) { - PdfWriter::CObjectBase* pForm = m_mObjManager->GetObj(pContent->getRefNum()); + PdfWriter::CObjectBase* pForm = m_mObjManager->GetObj(pContent->getRefNum() + m_nStartRefID); if (pForm && pForm->GetType() == object_type_DICT) { PdfWriter::CDictObject* pDictForm = (PdfWriter::CDictObject*)pForm; diff --git a/PdfFile/SrcWriter/RedactOutputDev.h b/PdfFile/SrcWriter/RedactOutputDev.h index 32b689bba6..7f26cce346 100644 --- a/PdfFile/SrcWriter/RedactOutputDev.h +++ b/PdfFile/SrcWriter/RedactOutputDev.h @@ -47,7 +47,7 @@ namespace PdfWriter class RedactOutputDev : public OutputDev { public: - RedactOutputDev(CPdfWriter* pRenderer, CObjectsManager* pObjMng); + RedactOutputDev(CPdfWriter* pRenderer, CObjectsManager* pObjMng, int nStartRefID); virtual ~RedactOutputDev(); void SetRedact(const std::vector& arrQuadPoints); @@ -208,6 +208,7 @@ namespace PdfWriter CPdfWriter* m_pRenderer; CObjectsManager* m_mObjManager; + int m_nStartRefID; CDocument* m_pDoc; CPage* m_pPage; double m_arrMatrix[6];