dart 我们可以转换成PDF图像使用Flutter,以显示缩略图的文件?

brvekthn  于 2023-09-28  发布在  Flutter
关注(0)|答案(5)|浏览(151)

用例:为了在文件列表中显示PDF的缩略图。
**问题2:**是否可以将FPF转换为图像,以便在列表中显示缩略图?

2ic8powd

2ic8powd1#

使用pdf_renderimage插件

import 'package:pdf_render/pdf_render.dart';
import 'package:image/image.dart' as imglib;

final doc = await PdfDocument.openFile('abc.pdf');
final pages = doc.pageCount;
List<imglib.Image> images = [];

// get images from all the pages
for (int i = 1; i <= pages; i++) {
  var page = await doc.getPage(i);
  var imgPDF = await page.render();
  var img = await imgPDF.createImageDetached();
  var imgBytes = await img.toByteData(format: ImageByteFormat.png);
  var libImage = imglib.decodeImage(imgBytes.buffer
      .asUint8List(imgBytes.offsetInBytes, imgBytes.lengthInBytes));
  images.add(libImage);
}

// stitch images
int totalHeight = 0;
images.forEach((e) {
  totalHeight += e.height;
});
int totalWidth = 0;
images.forEach((element) {
  totalWidth = totalWidth < element.width ? element.width : totalWidth;
});
final mergedImage = imglib.Image(totalWidth, totalHeight);
int mergedHeight = 0;
images.forEach((element) {
  imglib.copyInto(mergedImage, element, dstX: 0, dstY: mergedHeight, blend: false);
  mergedHeight += element.height;
});

// Save image as a file
final documentDirectory = await getExternalStorageDirectory();
File imgFile = new File('${documentDirectory.path}/abc.jpg');
new File(imgFile.path).writeAsBytes(imglib.encodeJpg(mergedImage));
zpgglvta

zpgglvta2#

**正确答案:**使用Printingpdf插件,为了将PDF转换为图像,我们可以简单地通过以下方式实现:

// send pdfFile as params
imageFromPdfFile(File pdfFile) async {
    final document = await lib.PDFDocument.openFile(pdfFile.path);
    final page = await document.getPage(1);
    final pageImage = await page.render(width: page.width, height: page.height);
    await page.close();
    print(pageImage.bytes);

    //... now convert 
    // .... pageImage.bytes to image
}
d4so4syb

d4so4syb3#

I built a package,这只是一个显示PDF缩略图的小部件。

我得到每一页的方式是通过pdfx包。
这是我的包中的一行代码。
https://github.com/mirkancal/pdf_thumbnail/blob/main/lib/src/pdf_thumbnail.dart#L77

uxh89sit

uxh89sit4#

唯一的办法就是使用pdfx。(安装此软件包)

首先,您应该从pdf文件中获取图像:

Future<PdfPageImage?> getImage() async {
    final document = await PdfDocument.openAsset('assets/cv.pdf');

    final page = await document.getPage(1);

    final image = await page.render(
      width: page.width * 2, //decrement for less quality
      height: page.height * 2,
      format: PdfPageImageFormat.jpeg,
      backgroundColor: '#ffffff',

      // Crop rect in image for render
      //cropRect: Rect.fromLTRB(left, top, right, bottom),
    );

    return image;
  }

请随意使用PDF从您的资产从一个文件。

然后我们可以在小部件中显示创建的图像:

FutureBuilder(
   future: getImage(), //<- created image
   builder: (context, AsyncSnapshot<PdfPageImage?> snapshot) {

   // data is ready
   if(snapshot.hasData) {

       PdfPageImage image = snapshot.data!;
       return Image.memory(image.bytes);

    // loading
    } else {
       return const Center(child: CircularProgressIndicator(),);
    }

  }
)
olqngx59

olqngx595#

使用Printing,您只需从任何PDF文档中传入字节。

/// Load a local PDF file
Future<Uint8List> loadPdf(File pdfFile) async {
  Future<Uint8List> documentBytes = pdfFile.readAsBytes();
  return documentBytes;
}

/// Pass in document bytes to render image using [Printing]
/// pages: [0] set to 0 to render first page only.
getImageFromPdf(Future<Uint8List> documentBytes) async {
  await for (var page in pw.Printing.raster(await documentBytes, pages: [0], dpi: 72)) {
    final image = page.toImage(); // ...or page.toPng()
    print(image);
  }
}

您可以使用任何方法加载PDF文档字节,例如

  • 从本地存储作为文件import 'dart:io';加载并使用.readAsBytes()方法。
  • 使用像pdf这样的包来创建/编辑PDF,然后传递字节。
  • 通过http等下载

相关问题