DLLEXPORT FPDF_BOOL STDCALL FPDF_ImportPages(FPDF_DOCUMENT dest_doc, FPDF_DOCUMENT src_doc, FPDF_BYTESTRING pagerange, int index) { CPDF_Document* pDestDoc = CPDFDocumentFromFPDFDocument(dest_doc); if (!dest_doc) return FALSE; CPDF_Document* pSrcDoc = CPDFDocumentFromFPDFDocument(src_doc); if (!pSrcDoc) return FALSE; CFX_WordArray pageArray; int nCount = pSrcDoc->GetPageCount(); if (pagerange) { if (!ParserPageRangeString(pagerange, &pageArray, nCount)) return FALSE; } else { for (int i = 1; i <= nCount; ++i) { pageArray.Add(i); } } CPDF_PageOrganizer pageOrg; pageOrg.PDFDocInit(pDestDoc, pSrcDoc); return pageOrg.ExportPage(pSrcDoc, &pageArray, pDestDoc, index); }
void NormalizeString(CFX_WideString& str) { if (str.GetLength() <= 0) { return; } CFX_WideString sBuffer; IFX_BidiChar* BidiChar = IFX_BidiChar::Create(); if (NULL == BidiChar) { return; } CFX_WordArray order; FX_BOOL bR2L = FALSE; FX_INT32 start = 0, count = 0, i = 0; int nR2L = 0, nL2R = 0; for (i = 0; i < str.GetLength(); i++) { if(BidiChar->AppendChar(str.GetAt(i))) { FX_INT32 ret = BidiChar->GetBidiInfo(start, count); order.Add(start); order.Add(count); order.Add(ret); if(!bR2L) { if(ret == 2) { nR2L++; } else if (ret == 1) { nL2R++; } } } } if(BidiChar->EndChar()) { FX_INT32 ret = BidiChar->GetBidiInfo(start, count); order.Add(start); order.Add(count); order.Add(ret); if(!bR2L) { if(ret == 2) { nR2L++; } else if(ret == 1) { nL2R++; } } } if(nR2L > 0 && nR2L >= nL2R) { bR2L = TRUE; } if(bR2L) { int count = order.GetSize(); for(int j = count - 1; j > 0; j -= 3) { int ret = order.GetAt(j); int start = order.GetAt(j - 2); int count1 = order.GetAt(j - 1); if(ret == 2 || ret == 0) { for(int i = start + count1 - 1; i >= start; i--) { NormalizeCompositeChar(str[i], sBuffer); } } else { i = j; FX_BOOL bSymbol = FALSE; while(i > 0 && order.GetAt(i) != 2) { bSymbol = !order.GetAt(i); i -= 3; } int end = start + count1 ; int n = 0; if(bSymbol) { n = i + 6; } else { n = i + 3; } if(n >= j) { for(int m = start; m < end; m++) { sBuffer += str[m]; } } else { i = j; j = n; for(; n <= i; n += 3) { int start = order.GetAt(n - 2); int count1 = order.GetAt(n - 1); int end = start + count1 ; for(int m = start; m < end; m++) { sBuffer += str[m]; } } } } } } else { int count = order.GetSize(); FX_BOOL bL2R = FALSE; for(int j = 0; j < count; j += 3) { int ret = order.GetAt(j + 2); int start = order.GetAt(j); int count1 = order.GetAt(j + 1); if(ret == 2 || (j == 0 && ret == 0 && !bL2R)) { int i = j + 3; while(bR2L && i < count) { if(order.GetAt(i + 2) == 1) { break; } else { i += 3; } } if(i == 3) { j = -3; bL2R = TRUE; continue; } int end = str.GetLength() - 1; if(i < count) { end = order.GetAt(i) - 1; } j = i - 3; for(int n = end; n >= start; n--) { NormalizeCompositeChar(str[i], sBuffer); } } else { int end = start + count1 ; for(int i = start; i < end; i++) { sBuffer += str[i]; } } } } str.Empty(); str += sBuffer; BidiChar->Release(); }