首页 > 编程语言 >使用java8 将pdf转为tif文件并设定图片格式

使用java8 将pdf转为tif文件并设定图片格式

时间:2023-12-27 16:12:39浏览次数:59  
标签:import 图片格式 writer new pdf tif dir metadata

在工作中,遇到一个需要将pdf转为tif并将图片大小限制到30kb以内的需求。在网上看了一圈,也因为依赖版本等等踩了一些坑,为此记录下来学习的过程。
`import com.github.jaiimageio.impl.plugins.tiff.TIFFImageWriterSpi;
import com.github.jaiimageio.plugins.tiff.BaselineTIFFTagSet;
import com.github.jaiimageio.plugins.tiff.TIFFDirectory;
import com.github.jaiimageio.plugins.tiff.TIFFField;
import com.github.jaiimageio.plugins.tiff.TIFFTag;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Logger;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;

import javax.imageio.;
import javax.imageio.metadata.IIOInvalidTreeException;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.stream.ImageOutputStream;
import java.awt.
;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class TifUtils {
private static Logger logger = Logger.getLogger(TifUtils.class);
public static void main(String[] args) throws FileNotFoundException {
// 初始化 Log4j
BasicConfigurator.configure();
File file = new File("/Users/xu/testpdf/华为OD面试一轮技术面试总结 2022.9.pdf");
FileInputStream fileInputStream = new FileInputStream(file);
String dir = "/Users/xu/testpdf";
pdf2tif(file, new File(dir), 200);
}

public static List pdf2tif(File file1, File dir, int dpi) {
    try (PDDocument pdf = PDDocument.load(file1)) {
        BufferedImage[] images = new BufferedImage[pdf.getNumberOfPages()];
        PDFRenderer pdfRenderer = new PDFRenderer(pdf);
        List files = new ArrayList<>();
        long suffix = System.currentTimeMillis();
        for (int i = 0; i < images.length; i++) {
          //  PDPage page = (PDPage) pdf.getDocumentCatalog().getAllPages().get(i);
            PDPage page1 = pdf.getPage(i);
            BufferedImage image;
            BufferedImage binaryImage = pdfRenderer.renderImageWithDPI(i, 300, ImageType.BINARY);

// PDFRenderer pdfRenderer = new PDFRenderer(pdf);
// BufferedImage image = pdfRenderer.renderImageWithDPI(i, 300);
// BufferedImage bufferedImage = convertToBinaryImage(image);
images[i] = binaryImage;
File file = new File(dir.getAbsolutePath() + File.separator + suffix + "-" + (i + 1) + ".tiff");
try (FileOutputStream out = new FileOutputStream(file); ImageOutputStream ios = ImageIO.createImageOutputStream(out)) {
TIFFImageWriterSpi tiffWriter = new TIFFImageWriterSpi();
ImageWriter writer = tiffWriter.createWriterInstance();
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionType("CCITT T.6");
param.setCompressionQuality(1);
IIOMetadata metadata = createMetadata(writer, param, 200);
writer.setOutput(ios);
writer.write(metadata, new IIOImage(binaryImage, null, metadata), param);
logger.info("第"+(i+1)+"张图片 convert success");
logger.error("第"+(i+1)+"张图片 convert success");
} catch (IOException e) {
// logger.error(e);;
}
files.add(file);

        }
        return files;
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}

private static IIOMetadata createMetadata(ImageWriter writer, ImageWriteParam writerParams, int resolution) throws IIOInvalidTreeException {
    // Get default metadata from writer
    ImageTypeSpecifier type = writerParams.getDestinationType();
    IIOMetadata meta = writer.getDefaultImageMetadata(type, writerParams);
    // Convert default metadata to TIFF metadata
    TIFFDirectory dir = TIFFDirectory.createFromMetadata(meta);
    // Get {X,Y} resolution tags
    BaselineTIFFTagSet base = BaselineTIFFTagSet.getInstance();
    TIFFTag tagXRes = base.getTag(BaselineTIFFTagSet.TAG_X_RESOLUTION);
    TIFFTag tagYRes = base.getTag(BaselineTIFFTagSet.TAG_Y_RESOLUTION);
    // Create {X,Y} resolution fields
    TIFFField fieldXRes = new TIFFField(tagXRes, TIFFTag.TIFF_RATIONAL, 1, new long[][]{{resolution, 1}});
    TIFFField fieldYRes = new TIFFField(tagYRes, TIFFTag.TIFF_RATIONAL, 1, new long[][]{{resolution, 1}});
    // Add {X,Y} resolution fields to TIFFDirectory
    dir.addTIFFField(fieldXRes);
    dir.addTIFFField(fieldYRes);
    dir.addTIFFField(new TIFFField(base.getTag(BaselineTIFFTagSet.TAG_RESOLUTION_UNIT), BaselineTIFFTagSet.RESOLUTION_UNIT_CENTIMETER));
    // Return TIFF metadata so it can be picked up by the IIOImage
    return dir.getAsMetadata();
}`

标签:import,图片格式,writer,new,pdf,tif,dir,metadata
From: https://www.cnblogs.com/xyB1ogs/p/17930765.html

相关文章

  • .NET 8上进行PDF合并
    前言:在.NET8中使用itext7需安装itext7和 itext7.bouncy-castle-fips-adapter两个Nuget包,或者使用Aspose.PDF、PdfSharpCore、Spire.PDF任意一个第三方包就行对比:第三方包是否开源是否收费itext7是不收费,免费使用没有水印PdfSharpCore是不收费,免费使用没有水......
  • 【专题】2023年中国数字金融调查报告PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=34685原文出处:拓端数据部落公众号随着数字化转型的深入推进,新客户的增长速度已达顶峰,用户运营成为推动存量增长的关键手段。调查数据显示,相比去年,网上银行用户比例有所下降,而手机银行用户比例基本持平。阅读原文,获取专题报告合集全文,解锁文末249份......
  • 【专题】2023年中国6G产业研究报告PDF合集分享(附原数据表)
    报告链接:https://tecdat.cn/?p=33186原文出处:拓端数据部落公众号以5G技术的发展方向为基础,结合6G技术的理念,我们可以展望未来的发展方向。随着5G作为移动通信技术个人和企业服务的分界线的确立,未来更先进的移动通信技术必然会将目光聚焦在企业服务市场上,以获得更好的发展。阅读......
  • # vue 预览 pdf、word、excel
    vue预览pdf、word、excel这是之前做项目的时候涉及到的一个功能,当时做了之后就一直没有整理,其实也很简单,功能不多,只是预览,没有在线编辑的功能,所以呢,啊哈哈哈哈哈,一个插件就可以了。预览pdf预览pdf我是用的这个插件,直接运行一下命令就可以了:npminstall@vue-office/pdf......
  • Android Notification 以及 通知铃音使用
    AndroidNotification以及通知铃音使用上一篇文章讲了手机震动的使用.本篇继续讲解铃音的使用,并且在讲下通知消息的使用.1:通知消息的使用代码如下:publicstaticvoidnotice(Contextcontext){try{NotificationCompat.Builderbuilder=ne......
  • ArgoCD notifications 配置
    ArgoCDnotifications TriggersTriggers定义应发送通知的条件。定义包括名称、条件和通知模板参考。条件是一个谓词表达式,如果通知则返回true应该发送。Triggers列表1.on-created#Application创建2.on-deleted#Applic......
  • Argo Rollouts notifications
    ArgoRolloutsnotificationscm模板argo-rollouts-notification-configmap的configmap需要部署在argo-rollouts名称空间下。apiVersion:v1kind:ConfigMapmetadata:name:argo-rollouts-notification-configmapdata:template.analysis-run-error:|message:Rollo......
  • Java并发(二十一)----wait notify介绍
    1、小故事-为什么需要wait由于条件不满足(没烟干不了活啊,等小M把烟送过来),小南不能继续进行计算但小南如果一直占用着锁,其它人就得一直阻塞,效率太低于是老王单开了一间休息室(调用wait方法),让小南到休息室(WaitSet)等着去了,但这时锁释放开,其它人可以由老王随机安排进屋......
  • pdf文件修改
    packagemainimport( "fmt" docx"github.com/lukasjarosch/go-docx")funcmain(){ replaceMap:=docx.PlaceholderMap{ "wilson1":"wilson", "wilson":"4205234243", "......
  • beautify-windows-terminal
    title:美化WindowsTerminaldate:2021-2-278:42:48author:TokisakiGalaxyexcerpt:美化WindowsTerminaltags:-美化-WindowsTerminalcategories:软件安装与配置安装WindowsTerminal有两种下载方法,去Github或者WindowsStore。建议去WindowsStore下,可以自......