gpt4 book ai didi

java - 如何使用itext和java将pdf中的图像(rgb/gray)转换为单色/黑白图像

转载 作者:太空宇宙 更新时间:2023-11-04 10:34:58 24 4
gpt4 key购买 nike

我正在编写一个java程序来交换pdf中的图像。由于生成过程的原因,它们被存储为高 dpi、rgb 图像,但是是黑白/单色图像。我正在使用itext 7.1.1,还测试了最新的开发版本(7.1.2 快照)。

我已经能够从 pdf 中提取图像,并使用 imagemagick(还有 testet gimp)中的索引颜色或灰色(仅限 0 和 255)将其转换为 png 或 tif。

我修改了 itext 中的一些代码,替换 pdf 中的图像,这适用于 DeviceRGB- 和 DeviceGray-Images,但不适用于 Bitonal 图像:

public static Image readPng(String pImageFolder, int pImageNumber) throws IOException {
String url = "./" + pImageFolder + "/" + pImageNumber + ".png";
File ifile = new File(url);
if (ifile.exists() && ifile.isFile()) {
return new Image(ImageDataFactory.create(url));
} else {
return null;
}
}

public static void replaceStream(PdfStream orig, PdfStream stream) throws IOException {
orig.clear();
orig.setData(stream.getBytes());
for (PdfName name : stream.keySet()) {
orig.put(name, stream.get(name));
}
}

public static void replaceImages(String pFilename, String pImagefolder, String pOutputFilename) throws IOException {
PdfDocument pdfDoc = new PdfDocument(new PdfReader(pFilename), new PdfWriter(pOutputFilename));
for (int i = 0; i < pdfDoc.getNumberOfPages(); i++) {
PdfDictionary page = pdfDoc.getPage(i + 1).getPdfObject();
PdfDictionary resources = page.getAsDictionary(PdfName.Resources);
PdfDictionary xobjects = resources.getAsDictionary(PdfName.XObject);
Iterator<PdfName> iter = xobjects.keySet().iterator();
PdfName imgRef;
PdfStream stream;
Image img;
int number;
while (iter.hasNext()) {
imgRef = iter.next();
number = xobjects.get(imgRef).getIndirectReference().getObjNumber();
stream = xobjects.getAsStream(imgRef);
img = readPng(pImagefolder, number);
if (img != null) {
replaceStream(stream, img.getXObject().getPdfObject());
}
}
}
pdfDoc.close();
}

如果我将图像转换为 tif 并使用它们作为替换,则 pdf 中会有深色图像(所有像素均为黑色)。如果我尝试使用 png 图像,它们不会显示,并且 pdfimages 会提示“扁平流中的未知压缩方法”。

最佳答案

仅供引用:我的replaceStream 中出现错误:getBytes() 缩小了PdfStream。所有Stream-Attributes都被复制,因此有一个Filter-Information说FlateDecoding是必要的。

我必须通过将解码参数设置为 false 来告诉 getBytes() 不要放气:getBytes(false)

public static void replaceStream(PdfStream orig, PdfStream stream) throws IOException {
orig.clear();
orig.setData(stream.getBytes(false));
for (PdfName name : stream.keySet()) {
orig.put(name, stream.get(name));
}
}

现在一切正常,除了:

  • Bitone 图像不是 CCITT4,而它们应该是。 (没关系,因为它们会转换为 JBig2。)
  • Acrobat 认为图像存在错误,但其他所有查看器都显示得很好:ColorSpace 信息中似乎存在错误。那应该是 DeviceGray,但是 CalGray 带有一些 Gamma 信息,但缺少 WhitePoint。手动更改为 DeviceGray 即可正常工作。解决方法是删除 gAMA 和 cHRM。

两者都是 iText7 中的转换错误:

  • CCITT4:PNGImageHelper 第 254 行应为 RawImageHelper.updateRawImageParameters(png.image, png.width, png.height, Components, bpc, png.idat.toByteArray(), null); 以触发转换。
  • WhitePoint 已从文件中正确读取并存储在 ImageData-Class 中,但在 PdfImageXObject -> createPdfStream 中被丢弃。

关于java - 如何使用itext和java将pdf中的图像(rgb/gray)转换为单色/黑白图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49592006/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com