2020年9月7日

pdfiumで注釈を読み書きしようとしている.とりあえず読む方だけは次でできそう.

auto doc = ::FPDF_LoadDocument(file, nullptr);
auto page = ::FPDF_LoadPage(doc, 0);
int annot_cnt = ::FPDFPage_GetAnnotCount(page);
for (int i = 0; i < annot_cnt; ++i) {
  auto a = ::FPDFPage_GetAnnot(page, i);
  // 下のContentsは新しいバージョンだとUTF-16かも?
  unsigned long len = FPDFAnnot_GetStringValue(a, "Contents", nullptr, 0);
  std::vector<char> buf(len);
  FPDFAnnot_GetStringValue(a, kContentsKey, buf.data(), len);
  // wstrに文字列が入っている
  std::wstring wstr((wchar_t*)(&buf[0]));
}

書く方は次のようにしてみたがうまく動いていない.

class PDFWriter : public FPDF_FILEWRITE {
public:
  PDFWriter(const string& path) : ofs(path, ios_base::out | ios_base::binary) {
    version = 1;
    WriteBlock = [](struct FPDF_FILEWRITE_* pThis, const void* pData, unsigned long size) {
      ((PDFWriter*)pThis)->ofs.write((char*)pData, size);
      return TRUE;
    };
  }
private:
  ofstream ofs;
};
FPDF_DOCUMENT doc = ::FPDF_LoadDocument(file, nullptr);
FPDF_PAGE page = ::FPDF_LoadPage(doc, 0);
auto a = ::FPDFPage_CreateAnnot(page, FPDF_ANNOT_TEXT);
wchar_t* sample = L"XY";% 書き込む文字列
::FPDFAnnot_SetStringValue(a, "Contents", (FPDF_WIDESTRING)sample);
::FPDFAnnot_SetFlags(an, 35);
PDFWriter writer(output_file);
::FPDF_SaveAsCopy(doc, &writer, 0)

しかし保存されていない.最後のFPDF_SaveAsCopyをもう一度実行すると,pdfiumからは 読み出せる注釈ができるようだが,しかしAcrobatでは見られなかった.うーん,よくわからない…….

0 件のコメント:

コメントを投稿

コメントの追加にはサードパーティーCookieの許可が必要です