如何为PDF添加指定的字符串生成新的PDF文件
=======================

#### 问题现象

一个字符串，如何添加到PDF文件内，生成一个新的PDF文件？

#### 背景知识

*   [PDF页面文本、图片和批注](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/pdf-add-txt-img-annot)：支持编辑PDF页面内容，包括：添加、删除文本、添加、删除图片、添加、修改、删除批注。
*   [addTextObject](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/pdf-arkts-pdfservice#section67811517143913)：添加文本内容，只可按行添加。

#### 解决方案

PDF Kit（PDF服务）提供的PDF页面文本、图片和批注能力支持编辑PDF页面内容，包括添加、删除文本，可调用addTextObject接口添加字符串。

import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { pdfService } from '@kit.PDFKit';
import fs from '@ohos.file.fs';
import { cryptoFramework } from '@kit.CryptoArchitectureKit';

let text \= \`测试字符\`;

@Entry
@Component
struct SFAQ20250507142609641237 {
  @State imageUri: string \= '';

  build() {

    Column() {
      Button('选择图片')
        .onClick(() \=\> {
          this.selectImage();
        });
      Image(this.imageUri)
        .width('100%')
        .layoutWeight(1);

      Button('image转PDF')
        .onClick(() \=\> {
          this.savePdf();
        });
    };
  }

  async savePdf() {
    console.info('testTag', 'enter savePath');
    let pdfDocument \= new pdfService.PdfDocument();
    let isCreate \= pdfDocument.createDocument(600, 900);
    if (isCreate) {
      console.info('testTag', \`enter savePath getPageCount = ${pdfDocument.getPageCount()}\`);
      let imagePdfPage \= pdfDocument.getPage(0);
      let dir \= this.getUIContext().getHostContext()?.filesDir;
      let imgPath \= dir \+ '/test.jpg';
      console.info('testTag', \`pdf imgPath = ${imgPath}\`);
      imagePdfPage.addImageObject(imgPath, 20, 20, 500, 500);

      let textPdfPage \= pdfDocument.insertBlankPage(1, 600, 900);
      let textStyle: pdfService.TextStyle \= new pdfService.TextStyle;
      let fontInfo \= new pdfService.FontInfo();
      fontInfo.fontPath \= '/system/fonts/HarmonyOS\_Sans.ttf';
      textStyle.fontInfo \= fontInfo;
      textStyle.textSize \= 32;
      textStyle.textColor \= 0x0000ea;
      textStyle.isBold \= true;
      textStyle.isItalic \= false;
      textPdfPage.addTextObject(text, 20, 120, textStyle); _// 添加示例文字_

      let randomNumber \= '';
      const rand \= cryptoFramework.createRandom();
      const randData \= rand.generateRandomSync(6);
      randData.data.forEach((val) \=\> {
        randomNumber \= randomNumber \+ val;
      });
      let savePath \= this.getUIContext().getHostContext()?.filesDir \+ \`/output${randomNumber}.pdf\`; _// 可用IDE在沙箱目录下找到_
      console.info('testTag', \`pdf savePath = ${savePath}\`);

      let result \= pdfDocument.saveDocument(savePath);
      console.info('testTag', \`pdf 保存结果：${result}\`);
    }
  }

  selectImage() {
    let photoSelectOptions \= new photoAccessHelper.PhotoSelectOptions();
    photoSelectOptions.MIMEType \= photoAccessHelper.PhotoViewMIMETypes.IMAGE\_TYPE;
    photoSelectOptions.maxSelectNumber \= 1;
    let photoPicker \= new photoAccessHelper.PhotoViewPicker();
    photoPicker.select(photoSelectOptions).then((photo: photoAccessHelper.PhotoSelectResult) \=\> {
      let images \= photo.photoUris;
      if (images.length \> 0) {
        this.imageUri \= images\[0\];
        let file \= fs.openSync(images\[0\], fs.OpenMode.READ\_ONLY);
        fs.copyFileSync(file.fd, this.getUIContext().getHostContext()?.filesDir \+ '/test.jpg');
        fs.closeSync(file);
      }
    }).catch((err: BusinessError) \=\> {
      console.error(\`PhotoViewPicker.select failed with err: ${err.code}, ${err.message}\`);
    });
  }
}

#### 常见FAQ

Q：PDF预览模式使用下划线批注，如果内容过短时下划线会变成竖线。

A：这是正常现象，由于下划线跟着文字方向变化，文字内容过短是竖向排列，文字内容过长是横向排列，所以批注内容过短时下划线会变成竖线。