diff --git a/DesktopEditor/graphics/pro/js/wasm/src/drawingfile_test.cpp b/DesktopEditor/graphics/pro/js/wasm/src/drawingfile_test.cpp index 1bae485f0f..fe8cf9e2f9 100644 --- a/DesktopEditor/graphics/pro/js/wasm/src/drawingfile_test.cpp +++ b/DesktopEditor/graphics/pro/js/wasm/src/drawingfile_test.cpp @@ -958,7 +958,7 @@ void ReadInteractiveFormsFonts(CDrawingFile* pGrFile, int nType) if (pFont) free(pFont); - if (false) + if (true) continue; pFont = GetGIDByUnicode(pGrFile, (char*)sFontName.c_str()); diff --git a/PdfFile/PdfReader.cpp b/PdfFile/PdfReader.cpp index e767709dbe..df55fc3186 100644 --- a/PdfFile/PdfReader.cpp +++ b/PdfFile/PdfReader.cpp @@ -574,14 +574,15 @@ bool CPdfReader::RedactPage(int _nPageIndex, double* arrRedactBox, int nLengthX8 } Page* pPage = pDoc->getCatalog()->getPage(nPageIndex); - PDFRectangle* cropBox = pPage->getCropBox(); + PDFRectangle* cropBox = pPage->getCropBox(); + PDFRectangle* mediaBox = pPage->getMediaBox(); CPdfRedact* pRedact = new CPdfRedact(); pRedact->m_nPageIndex = _nPageIndex; for (int i = 0; i < nLengthX8 * 8; i += 2) { - pRedact->m_arrRedactBox.push_back(arrRedactBox[i + 0] + cropBox->x1); - pRedact->m_arrRedactBox.push_back(cropBox->y2 - arrRedactBox[i + 1]); + pRedact->m_arrRedactBox.push_back(arrRedactBox[i + 0] + cropBox->x1 - mediaBox->x1); + pRedact->m_arrRedactBox.push_back(cropBox->y2 - arrRedactBox[i + 1] - mediaBox->y1); } pRedact->m_pChanges = pChanges; pRedact->m_nChangeLength = nLength; @@ -683,6 +684,7 @@ void CPdfReader::DrawPageOnRenderer(IRenderer* pRenderer, int _nPageIndex, bool* Page* pPage = pDoc->getCatalog()->getPage(nPageIndex); PDFRectangle* cropBox = pPage->getCropBox(); + PDFRectangle* mediaBox = pPage->getMediaBox(); pRenderer->SetTransform(1, 0, 0, 1, 0, 0); for (int i = 0 ; i < m_vRedact.size(); ++i) { @@ -704,10 +706,10 @@ void CPdfReader::DrawPageOnRenderer(IRenderer* pRenderer, int _nPageIndex, bool* pRenderer->PathCommandEnd(); pRenderer->put_BrushColor1(lColor); - pRenderer->PathCommandMoveTo(PdfReader::PDFCoordsToMM(m_vRedact[i]->m_arrRedactBox[j + 0] - cropBox->x1), PdfReader::PDFCoordsToMM(cropBox->y2 - m_vRedact[i]->m_arrRedactBox[j + 1])); - pRenderer->PathCommandLineTo(PdfReader::PDFCoordsToMM(m_vRedact[i]->m_arrRedactBox[j + 2] - cropBox->x1), PdfReader::PDFCoordsToMM(cropBox->y2 - m_vRedact[i]->m_arrRedactBox[j + 3])); - pRenderer->PathCommandLineTo(PdfReader::PDFCoordsToMM(m_vRedact[i]->m_arrRedactBox[j + 6] - cropBox->x1), PdfReader::PDFCoordsToMM(cropBox->y2 - m_vRedact[i]->m_arrRedactBox[j + 7])); - pRenderer->PathCommandLineTo(PdfReader::PDFCoordsToMM(m_vRedact[i]->m_arrRedactBox[j + 4] - cropBox->x1), PdfReader::PDFCoordsToMM(cropBox->y2 - m_vRedact[i]->m_arrRedactBox[j + 5])); + pRenderer->PathCommandMoveTo(PdfReader::PDFCoordsToMM(m_vRedact[i]->m_arrRedactBox[j + 0] - cropBox->x1 + mediaBox->x1), PdfReader::PDFCoordsToMM(cropBox->y2 + mediaBox->y1 - m_vRedact[i]->m_arrRedactBox[j + 1])); + pRenderer->PathCommandLineTo(PdfReader::PDFCoordsToMM(m_vRedact[i]->m_arrRedactBox[j + 2] - cropBox->x1 + mediaBox->x1), PdfReader::PDFCoordsToMM(cropBox->y2 + mediaBox->y1 - m_vRedact[i]->m_arrRedactBox[j + 3])); + pRenderer->PathCommandLineTo(PdfReader::PDFCoordsToMM(m_vRedact[i]->m_arrRedactBox[j + 6] - cropBox->x1 + mediaBox->x1), PdfReader::PDFCoordsToMM(cropBox->y2 + mediaBox->y1 - m_vRedact[i]->m_arrRedactBox[j + 7])); + pRenderer->PathCommandLineTo(PdfReader::PDFCoordsToMM(m_vRedact[i]->m_arrRedactBox[j + 4] - cropBox->x1 + mediaBox->x1), PdfReader::PDFCoordsToMM(cropBox->y2 + mediaBox->y1 - m_vRedact[i]->m_arrRedactBox[j + 5])); pRenderer->PathCommandClose(); pRenderer->DrawPath(c_nWindingFillMode); pRenderer->PathCommandEnd(); diff --git a/PdfFile/PdfWriter.cpp b/PdfFile/PdfWriter.cpp index e61acdcb0f..ca4cdf8c60 100644 --- a/PdfFile/PdfWriter.cpp +++ b/PdfFile/PdfWriter.cpp @@ -1775,21 +1775,17 @@ PdfWriter::CAction* CPdfWriter::GetAction(CAnnotFieldInfo::CActionFieldPr* pActi break; ppA->SetDestination(pDest); - PdfWriter::CArrayObject* pPageBoxD = (PdfWriter::CArrayObject*)pPageD->Get("CropBox"); - if (!pPageBoxD) - pPageBoxD = (PdfWriter::CArrayObject*)pPageD->Get("MediaBox"); - if (!pPageBoxD) + PdfWriter::TBox oCropBox = pPageD->GetBox("CropBox"); + if (oCropBox.IsEmpty()) + oCropBox = pPageD->GetBox("MediaBox"); + if (oCropBox.IsEmpty()) return NULL; - PdfWriter::CObjectBase* pD = pPageBoxD->Get(3); - double dPageDH = pD->GetType() == PdfWriter::object_type_NUMBER ? ((PdfWriter::CNumberObject*)pD)->Get() : ((PdfWriter::CRealObject*)pD)->Get(); - pD = pPageBoxD->Get(0); - double dPageDX = pD->GetType() == PdfWriter::object_type_NUMBER ? ((PdfWriter::CNumberObject*)pD)->Get() : ((PdfWriter::CRealObject*)pD)->Get(); switch (pAction->nKind) { case 0: { - pDest->SetXYZ(pAction->dD[0] + dPageDX, dPageDH - pAction->dD[1], pAction->dD[2]); + pDest->SetXYZ(pAction->dD[0] + oCropBox.fLeft, oCropBox.fTop - pAction->dD[1], pAction->dD[2]); break; } case 1: @@ -1799,17 +1795,17 @@ PdfWriter::CAction* CPdfWriter::GetAction(CAnnotFieldInfo::CActionFieldPr* pActi } case 2: { - pDest->SetFitH(dPageDH - pAction->dD[1]); + pDest->SetFitH(oCropBox.fTop - pAction->dD[1]); break; } case 3: { - pDest->SetFitV(pAction->dD[0] + dPageDX); + pDest->SetFitV(pAction->dD[0] + oCropBox.fLeft); break; } case 4: { - pDest->SetFitR(pAction->dD[0] + dPageDX, dPageDH - pAction->dD[3], pAction->dD[2] + dPageDX, dPageDH - pAction->dD[1]); + pDest->SetFitR(pAction->dD[0] + oCropBox.fLeft, oCropBox.fTop - pAction->dD[3], pAction->dD[2] + oCropBox.fLeft, oCropBox.fTop - pAction->dD[1]); break; } case 5: @@ -1819,12 +1815,12 @@ PdfWriter::CAction* CPdfWriter::GetAction(CAnnotFieldInfo::CActionFieldPr* pActi } case 6: { - pDest->SetFitBH(dPageDH - pAction->dD[1]); + pDest->SetFitBH(oCropBox.fTop - pAction->dD[1]); break; } case 7: { - pDest->SetFitBV(pAction->dD[0] + dPageDX); + pDest->SetFitBV(pAction->dD[0] + oCropBox.fLeft); break; } } @@ -1925,21 +1921,14 @@ HRESULT CPdfWriter::AddAnnotField(NSFonts::IApplicationFonts* pAppFonts, CAnnotF if (!pAnnot) return S_FALSE; double dX1, dY1, dX2, dY2; - PdfWriter::CArrayObject* pPageBox = (PdfWriter::CArrayObject*)pPage->Get("CropBox"); - if (!pPageBox) - pPageBox = (PdfWriter::CArrayObject*)pPage->Get("MediaBox"); - PdfWriter::CObjectBase* pD = pPageBox->Get(3); - double dPageH = pD->GetType() == PdfWriter::object_type_NUMBER ? ((PdfWriter::CNumberObject*)pD)->Get() : ((PdfWriter::CRealObject*)pD)->Get(); - pD = pPageBox->Get(0); - double dPageX = pD->GetType() == PdfWriter::object_type_NUMBER ? ((PdfWriter::CNumberObject*)pD)->Get() : ((PdfWriter::CRealObject*)pD)->Get(); - pPageBox = (PdfWriter::CArrayObject*)pPage->Get("MediaBox"); - pD = pPageBox->Get(3); - double dPageY = pD->GetType() == PdfWriter::object_type_NUMBER ? ((PdfWriter::CNumberObject*)pD)->Get() : ((PdfWriter::CRealObject*)pD)->Get(); - dPageY -= dPageH; + PdfWriter::TBox oCropBox = pPage->GetBox("CropBox"); + if (oCropBox.IsEmpty()) + oCropBox = pPage->GetBox("MediaBox"); + PdfWriter::TBox oMediaBox = pPage->GetBox("MediaBox"); oInfo.GetBounds(dX1, dY1, dX2, dY2); - pAnnot->SetRect({dPageX + dX1, dPageH - dY1, dPageX + dX2, dPageH - dY2}); + pAnnot->SetRect({dX1 + oCropBox.fLeft, oCropBox.fTop - dY1, dX2 + oCropBox.fLeft, oCropBox.fTop - dY2}); - pAnnot->SetPage(pPage, pPage->GetWidth(), dPageH, dPageX, dPageY); + pAnnot->SetPage(pPage, pPage->GetWidth(), oCropBox.fTop, oCropBox.fLeft, oMediaBox.fTop - oCropBox.fTop - oMediaBox.fBottom); pAnnot->SetAnnotFlag(oInfo.GetAnnotFlag()); pAnnot->SetDocument(m_pDocument); @@ -2288,10 +2277,10 @@ HRESULT CPdfWriter::AddAnnotField(NSFonts::IApplicationFonts* pAppFonts, CAnnotF pPr->GetInRect(dRD1, dRD2, dRD3, dRD4); PdfWriter::CArrayObject* pArray = new PdfWriter::CArrayObject(); pAP->Add("BBox", pArray); - pArray->Add(dRD1 + dPageX); - pArray->Add(dPageH - dRD4); - pArray->Add(dRD3 + dPageX); - pArray->Add(dPageH - dRD2); + pArray->Add(dRD1 + oCropBox.fLeft); + pArray->Add(oCropBox.fTop - dRD4); + pArray->Add(dRD3 + oCropBox.fLeft); + pArray->Add(oCropBox.fTop - dRD2); pStampAnnot->SetAPStream(pAP); } @@ -2730,18 +2719,21 @@ HRESULT CPdfWriter::AddRedact(const std::vector& arrRedact) return S_OK; m_arrRedact = arrRedact; - PdfWriter::CArrayObject* pPageBox = (PdfWriter::CArrayObject*)m_pPage->Get("CropBox"); - if (!pPageBox) - pPageBox = (PdfWriter::CArrayObject*)m_pPage->Get("MediaBox"); - PdfWriter::CObjectBase* pD = pPageBox->Get(3); - double dPageH = pD->GetType() == PdfWriter::object_type_NUMBER ? ((PdfWriter::CNumberObject*)pD)->Get() : ((PdfWriter::CRealObject*)pD)->Get(); - pD = pPageBox->Get(0); - double dPageX = pD->GetType() == PdfWriter::object_type_NUMBER ? ((PdfWriter::CNumberObject*)pD)->Get() : ((PdfWriter::CRealObject*)pD)->Get(); + PdfWriter::TBox oCropBox = m_pPage->GetBox("CropBox"); + if (oCropBox.IsEmpty()) + oCropBox = m_pPage->GetBox("MediaBox"); + PdfWriter::TBox oMediaBox = m_pPage->GetBox("MediaBox"); for (int i = 0; i < m_arrRedact.size(); i += 2) { - m_arrRedact[i + 0] += dPageX; - m_arrRedact[i + 1] = dPageH - m_arrRedact[i + 1]; + m_arrRedact[i + 0] += (oCropBox.fLeft - oMediaBox.fLeft); + m_arrRedact[i + 1] = oCropBox.fTop - m_arrRedact[i + 1] - oMediaBox.fBottom; + + int posInBlock = (i / 2) % 4 + 1; + if (posInBlock == 1 || posInBlock == 4) + m_arrRedact[i + 0] -= 0.001; + else + m_arrRedact[i + 0] += 0.001; } return S_OK; @@ -4344,7 +4336,8 @@ void CPdfWriter::DrawWidgetAP(PdfWriter::CAnnotation* pA, BYTE* pRender, LONG nL PdfWriter::CPage* pFakePage = new PdfWriter::CPage(m_pDocument); m_pPage = pFakePage; m_pDocument->SetCurPage(pFakePage); - double dY = pAnnot->GetRect().fBottom; + PdfWriter::TBox oMediaBox = pCurPage->GetBox("MediaBox"); + double dY = pAnnot->GetRect().fBottom - oMediaBox.fBottom; if (nRotate == 90 || nRotate == 270) { double dW = pAnnot->GetWidth(); diff --git a/PdfFile/SrcWriter/Pages.cpp b/PdfFile/SrcWriter/Pages.cpp index 68d483ad39..c684280295 100644 --- a/PdfFile/SrcWriter/Pages.cpp +++ b/PdfFile/SrcWriter/Pages.cpp @@ -542,34 +542,32 @@ namespace PdfWriter TBox oBox = GetMediaBox(); return oBox.fTop - oBox.fBottom; } - TBox CPage::GetMediaBox() + TBox CPage::GetBox(const std::string& sBox) { - TBox oMediaBox = TRect( 0, 0, 0, 0 ); + TBox oBox = TRect( 0, 0, 0, 0 ); - CArrayObject* pArray = GetMediaBoxItem(); + CArrayObject* pArray = (CArrayObject*)Get(sBox); if (pArray) { - CRealObject* pReal; + PdfWriter::CObjectBase* pD = pArray->Get(0); + oBox.fLeft = pD->GetType() == PdfWriter::object_type_NUMBER ? ((PdfWriter::CNumberObject*)pD)->Get() : ((PdfWriter::CRealObject*)pD)->Get(); - pReal = (CRealObject*)pArray->Get(0); - if (pReal) - oMediaBox.fLeft = pReal->Get(); + pD = pArray->Get(1); + oBox.fBottom = pD->GetType() == PdfWriter::object_type_NUMBER ? ((PdfWriter::CNumberObject*)pD)->Get() : ((PdfWriter::CRealObject*)pD)->Get(); - pReal = (CRealObject*)pArray->Get(1); - if (pReal) - oMediaBox.fBottom = pReal->Get(); + pD = pArray->Get(2); + oBox.fRight = pD->GetType() == PdfWriter::object_type_NUMBER ? ((PdfWriter::CNumberObject*)pD)->Get() : ((PdfWriter::CRealObject*)pD)->Get(); - pReal = (CRealObject*)pArray->Get(2); - if (pReal) - oMediaBox.fRight = pReal->Get(); - - pReal = (CRealObject*)pArray->Get(3); - if (pReal) - oMediaBox.fTop = pReal->Get(); + pD = pArray->Get(3); + oBox.fTop = pD->GetType() == PdfWriter::object_type_NUMBER ? ((PdfWriter::CNumberObject*)pD)->Get() : ((PdfWriter::CRealObject*)pD)->Get(); } - return oMediaBox; + return oBox; + } + TBox CPage::GetMediaBox() + { + return GetBox("MediaBox"); } void CPage::SetMediaBoxValue(unsigned int unIndex, double dValue) { @@ -611,9 +609,9 @@ namespace PdfWriter return (CResourcesDict*)pObject; } - CObjectBase* CPage::GetCropBoxItem() + CArrayObject* CPage::GetCropBoxItem() { - return Get("CropBox"); + return (CArrayObject*)Get("CropBox"); } CObjectBase* CPage::GetRotateItem() { diff --git a/PdfFile/SrcWriter/Pages.h b/PdfFile/SrcWriter/Pages.h index b71381e8ea..8cf9f1bceb 100644 --- a/PdfFile/SrcWriter/Pages.h +++ b/PdfFile/SrcWriter/Pages.h @@ -195,13 +195,14 @@ namespace PdfWriter void ClearContentFull(CXref* pXref); CResourcesDict* GetResourcesItem(); void AddResource(CXref* pXref = NULL); + TBox GetBox(const std::string& sBox); private: void Init(CDocument* pDocument); void EllipseArc(double dX, double dY, double dXRad, double dYRad, double dAngle1, double dAngle2, bool bClockDirection); CArrayObject* GetMediaBoxItem(); - CObjectBase* GetCropBoxItem(); + CArrayObject* GetCropBoxItem(); CObjectBase* GetRotateItem(); TBox GetMediaBox(); void SetMediaBoxValue(unsigned int unIndex, double dValue); diff --git a/PdfFile/SrcWriter/Types.h b/PdfFile/SrcWriter/Types.h index 3ada87c29e..7b616aee31 100644 --- a/PdfFile/SrcWriter/Types.h +++ b/PdfFile/SrcWriter/Types.h @@ -73,6 +73,10 @@ namespace PdfWriter fRight = dR; fTop = dT; } + bool IsEmpty() + { + return fLeft == 0.0 && fBottom == 0.0 && fRight == 0.0 && fTop == 0.0; + } double fLeft; double fBottom;