【问题标题】:How to extract rotated images from PDF with iText如何使用 iText 从 PDF 中提取旋转图像
【发布时间】:2022-01-21 09:53:26
【问题描述】:

我需要从 PDF 中提取图像。 我知道有些图片旋转了 90 度(我用在线工具检查过)。

我正在使用此代码:

PdfRenderListener

public class PdfRenderListener : IExtRenderListener
{
    // other methods ...

    public void RenderImage(ImageRenderInfo renderInfo)
    {
        try
        {
            var mtx = renderInfo.GetImageCTM();
            var image = renderInfo.GetImage();
            var fillColor = renderInfo.GetCurrentFillColor();
            var color = Color.FromArgb(fillColor?.RGB ?? Color.Empty.ToArgb());
            var fileType = image.GetFileType();
            var extension = "." + fileType;
            var bytes = image.GetImageAsBytes();
            var height = mtx[Matrix.I22];
            var width = mtx[Matrix.I11];

            // rotated image
            if (height == 0 && width == 0)
            {
                var h = Math.Abs(mtx[Matrix.I12]);
                var w = Math.Abs(mtx[Matrix.I21]);
            }

            // save image
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
    }
}

当我使用此代码保存图像时,旋转后的图像会失真。

我已阅读此帖子 iText 7 ImageRenderInfo Matrix contains negative height on Even number Pages 和 mkl 答案。

在当前的转换矩阵(mtx)中,我有这些值:

0 841.9 0
-595.1 0 0
595.1 0 1

我知道图像旋转了 90 度。如何转换图像以获得正常图像?

【问题讨论】:

  • 本质上,变换矩阵将图像旋转 90°,将旋转后的图像拉伸到 595.1×841.9 单位,并将拉伸后的图像移动到第一象限。要获得类似的图像,您必须使用一些位图图像处理 API 应用相同的步骤。因此,您可能应该将问题的焦点转移到如何执行这些位图图像处理步骤。
  • 您好,您是否有示例 PDF 来重现您所面临的行为?您是否尝试过 iText pdf2Data (pdf2data.online)?正如@mkl 提到的,如果您想使用低级 iText 核心功能,您需要自己进行图像旋转,您可以在这里找到一些食谱:stackoverflow.com/questions/8639567/java-rotating-images

标签: c# pdf itext


【解决方案1】:

你可以试试这个。我正在为 java 使用 Itext 7。这里还是需要编写自己的监听器:

public class MyImageRenderListener implements IEventListener {

protected String path;

protected String extension;

public MyImageRenderListener (String path) {
    this.path = path;
}

public void eventOccurred(IEventData data, EventType type) {
    switch (type) {
        case RENDER_IMAGE:
            try {
                String filename;
                FileOutputStream os;
                ImageRenderInfo renderInfo = (ImageRenderInfo) data;
                PdfImageXObject image = renderInfo.getImage();
                if (image == null) {
                    return;
                }
                byte[] imageByte = image.getImageBytes(true);
                extension = image.identifyImageFileExtension();
                filename = String.format(path, image.getPdfObject().getIndirectReference().getObjNumber(), extension);
                os = new FileOutputStream(filename);
                os.write(imageByte);
                os.flush();
                os.close();
            } catch (com.itextpdf.io.exceptions.IOException | IOException e) {
                System.out.println(e.getMessage());
            }
            break;

        default:
            break;
    }
}

public Set<EventType> getSupportedEvents() {
    return null;
}
}

我检查了一个随机旋转角度的pdf,90度,得到的图片没有失真

public void manipulatePdf() throws IOException, SQLException, ParserConfigurationException, SAXException {
    PdfDocument pdfDoc = new PdfDocument(new PdfReader("path to pdf"), new PdfWriter(new ByteArrayOutputStream()));
    MyImageRenderListener listener = new MyImageRenderListener("path to resulting image");

    PdfCanvasProcessor parser = new PdfCanvasProcessor(listener);
    for (int i = 1; i <= pdfDoc.getNumberOfPages(); i++) {
        parser.processPageContent(pdfDoc.getPage(i));
    }
    pdfDoc.close();
}

【讨论】:

    猜你喜欢
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多