cdrPDF2Clip.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. #include "cdrapp.h"
  2. #include <stdio.h>
  3. #include <windows.h>
  4. #define CUSTOM_FORMAT RegisterClipboardFormatA("Portable Document Format")
  5. bool pdf_to_clipboard(const char *pdffile)
  6. {
  7. // 打开剪贴板
  8. if (!OpenClipboard(NULL)) {
  9. printf("Failed to open clipboard.\n");
  10. return false;
  11. }
  12. // 清空剪贴板
  13. EmptyClipboard();
  14. // 读取PDF文件到内存
  15. FILE *file = fopen(pdffile, "rb");
  16. if (!file) {
  17. printf("Failed to open file.\n");
  18. CloseClipboard();
  19. return false;
  20. }
  21. // 获取文件大小
  22. fseek(file, 0, SEEK_END);
  23. size_t fileSize = ftell(file);
  24. fseek(file, 0, SEEK_SET);
  25. // 分配内存并读取文件内容
  26. void *pdfData = malloc(fileSize);
  27. if (!pdfData) {
  28. printf("Failed to allocate memory.\n");
  29. fclose(file);
  30. CloseClipboard();
  31. return false;
  32. }
  33. fread(pdfData, 1, fileSize, file);
  34. fclose(file);
  35. // 将二进制数据写入剪贴板
  36. HGLOBAL hGlobal = GlobalAlloc(GHND, fileSize);
  37. if (!hGlobal) {
  38. printf("Failed to allocate global memory.\n");
  39. free(pdfData);
  40. CloseClipboard();
  41. return false;
  42. }
  43. memcpy(GlobalLock(hGlobal), pdfData, fileSize);
  44. GlobalUnlock(hGlobal);
  45. if (!SetClipboardData(CUSTOM_FORMAT, hGlobal)) {
  46. printf("Failed to set clipboard data.\n");
  47. GlobalFree(hGlobal);
  48. free(pdfData);
  49. CloseClipboard();
  50. return false;
  51. }
  52. // 关闭剪贴板
  53. CloseClipboard();
  54. printf("PDF binary data copied to clipboard using custom format.\n");
  55. // 不要忘记释放内存
  56. free(pdfData);
  57. return true;
  58. }
  59. bool clipboard_to_pdf(const char *outputFile)
  60. {
  61. // 打开剪贴板
  62. if (!OpenClipboard(NULL)) {
  63. printf("Failed to open clipboard.\n");
  64. return false;
  65. }
  66. // 获取剪贴板中的PDF数据
  67. HANDLE hData = GetClipboardData(CUSTOM_FORMAT);
  68. if (!hData) {
  69. printf("Failed to get clipboard data.\n");
  70. CloseClipboard();
  71. return false;
  72. }
  73. // 锁定内存并获取指针
  74. void *pdfData = GlobalLock(hData);
  75. if (!pdfData) {
  76. printf("Failed to lock global memory.\n");
  77. CloseClipboard();
  78. return false;
  79. }
  80. // 获取PDF数据的大小
  81. size_t fileSize = GlobalSize(hData);
  82. // 将PDF数据写入文件
  83. FILE *file = fopen(outputFile, "wb");
  84. if (!file) {
  85. printf("Failed to open output file.\n");
  86. GlobalUnlock(hData);
  87. CloseClipboard();
  88. return false;
  89. }
  90. fwrite(pdfData, 1, fileSize, file);
  91. fclose(file);
  92. // 解锁内存并关闭剪贴板
  93. GlobalUnlock(hData);
  94. CloseClipboard();
  95. printf("PDF binary data from clipboard saved to file: %s\n", outputFile);
  96. return true;
  97. }
  98. bool cdr_savepdf(corel *cdr, const char *outputFile)
  99. {
  100. DeleteFile(_bstr_t(outputFile));
  101. auto pdfst = cdr->ActiveDocument->PDFSettings;
  102. pdfst->BitmapCompression = pdfLZW;
  103. pdfst->ColorMode = pdfCMYK;
  104. pdfst->EmbedBaseFonts = cdrFalse;
  105. pdfst->EmbedFonts = cdrFalse;
  106. pdfst->FileInformation = cdrFalse;
  107. pdfst->Hyperlinks = cdrFalse;
  108. pdfst->IncludeBleed = cdrFalse;
  109. pdfst->Linearize = cdrTrue;
  110. pdfst->MaintainOPILinks = cdrTrue;
  111. pdfst->Overprints = cdrTrue;
  112. pdfst->PutpdfVersion(pdfVersion14); //'pdfVersion14 : pdfVersion13;
  113. pdfst->PublishRange = pdfSelection;
  114. pdfst->RegistrationMarks = cdrFalse;
  115. pdfst->SpotColors = cdrTrue;
  116. pdfst->Startup = pdfPageOnly;
  117. pdfst->SubsetFonts = cdrFalse;
  118. pdfst->TextAsCurves = cdrFalse;
  119. pdfst->Thumbnails = cdrFalse;
  120. cdr->ActiveDocument->PublishToPDF(_bstr_t(outputFile));
  121. return true;
  122. }
  123. void CdrCopy_to_AdobeAI(corel *cdr)
  124. {
  125. char path[MAX_PATH] = {0};
  126. GetTempPath(MAX_PATH, path);
  127. char *f = strcat(path, "CDR2AI.pdf");
  128. if (cdr_savepdf(cdr, f))
  129. pdf_to_clipboard(f);
  130. }
  131. bool pdf_ImportCdr(corel *cdr, const char *pdffile)
  132. {
  133. auto si = cdr->CreateStructImportOptions();
  134. si->MaintainLayers = true;
  135. auto impflt = cdr->ActiveLayer->ImportEx(_bstr_t(pdffile), cdrAutoSense , si);
  136. impflt->Finish();
  137. }
  138. void AdobeAI_Copy_ImportCdr(corel *cdr)
  139. {
  140. char path[MAX_PATH] = {0};
  141. GetTempPath(MAX_PATH, path);
  142. char *f = strcat(path, "CDR2AI.pdf");
  143. if (clipboard_to_pdf(f))
  144. pdf_ImportCdr(cdr, f);
  145. }