0

我有一个现有的程序可以处理 .pdf 文件,并根据在页面上查找条形码将其拆分为多个 .pdf 文件。

该程序使用 ImageMagick 和 C#。

我想将其从输出 pdf 更改为输出 tif。在下面的代码中查找注释,我猜想会在哪里进行更改。

我包含了 ImageMagick 标记,因为有人可能会提供一个命令行选项,其他人可以帮助我转换为 C#。

private void BurstPdf(string bigPdfName, string targetfolder)
{
    bool outputPdf = true;  // change to false to output tif.
    string outputExtension = "";

    var settings = new MagickReadSettings { Density = new Density(200) };

    string barcodePng = Path.Combine("C:\TEMP", "tmp.png");

    using (MagickImageCollection pdfPageCollection = new MagickImageCollection())
    {
        pdfPageCollection.Read(bigPdfName, settings);

        int inputPageCount = 0;
        int outputPageCount = 0;
        int outputFileCount = 0;
        MagickImageCollection resultCollection = new MagickImageCollection();
        string barcode = "";
        string resultName = "";
        IBarcodeReader reader = new BarcodeReader();
        reader.Options.PossibleFormats = new List<BarcodeFormat>();
        reader.Options.PossibleFormats.Add(BarcodeFormat.CODE_39);
        reader.Options.TryHarder = false;

        foreach (MagickImage pdfPage in pdfPageCollection)
        {
            MagickGeometry barcodeArea = getBarCodeArea(pdfPage);
            IMagickImage barcodeImg = pdfPage.Clone();

            barcodeImg.ColorType = ColorType.Bilevel;
            barcodeImg.Depth = 1;
            barcodeImg.Alpha(AlphaOption.Off);

            barcodeImg.Crop(barcodeArea);
            barcodeImg.Write(barcodePng);

            inputPageCount++;
            using (var barcodeBitmap = new Bitmap(barcodePng))
            {
                var result = reader.Decode(barcodeBitmap);
                if (result != null)
                {
                    // found a first page because it has bar code.
                    if (result.BarcodeFormat.ToString() == "CODE_39")
                    {

                        if (outputFileCount != 0)
                        {
                            // write out previous pages.
                            if (outputPdf) {
                                outputExtension = ".pdf";
                            } else {
                                // What do I put here to output a g4 compressed tif?
                                outputExtension = ".tif";
                            }
                            resultName = string.Format("{0:D4}", outputFileCount) + "-" + outputPageCount.ToString() + "-" + barcode + outputExtension;
                            resultCollection.Write(Path.Combine(targetfolder, resultName));
                            resultCollection = new MagickImageCollection();
                        }
                        barcode = standardizePhysicalBarCode(result.Text);

                        outputFileCount++;
                        resultCollection.Add(pdfPage);
                        outputPageCount = 1;

                    }
                    else
                    {
                        Console.WriteLine("WARNING barcode is not of type CODE_39 so something is wrong. check page " + inputPageCount + " of " + bigPdfName);
                        if (inputPageCount == 1)
                        {
                            throw new Exception("barcode not found on page 1.  see " + barcodePng);
                        }
                        resultCollection.Add(pdfPage);
                        outputPageCount++;
                    }
                }
                else
                {
                    if (inputPageCount == 1)
                    {
                        throw new Exception("barcode not found on page 1.  see " + barcodePng);
                    }
                    resultCollection.Add(pdfPage);
                    outputPageCount++;
                }
            }

            if (File.Exists(barcodePng))
            {
                File.Delete(barcodePng);
            }

        }

        if (resultCollection.Count > 0)
        {
            if (outputPdf) {
                outputExtension = ".pdf";
            } else {
                // What do I put here to output a g4 compressed tif?
                outputExtension = ".tif";
            }
            resultName = string.Format("{0:D4}", outputFileCount) + "-" + outputPageCount.ToString() + "-" + barcode + outputExtension;
            resultCollection.Write(Path.Combine(targetfolder, resultName));
            outputFileCount++;
        }
    }
}

[编辑] 上面的代码是我用来将 .pdf 拆分为其他 .pdf 的代码(一些未经测试的修改)。我想知道如何修改此代码以输出 tiff。我在代码中我认为会发生更改的地方添加了注释。

[编辑] 受到@fmw42 的鼓励,我刚刚运行了启用了 .tif 扩展名的代码。看起来它确实转换为 .tif,但 tif 没有被压缩。我很惊讶 IM 只是根据文件的扩展名配置输出。我猜很方便,但似乎有点松散。

[编辑] 我想通了。尽管违反直觉的设置会在文件读取时设置压缩。我正在阅读 .pdf,但我将压缩设置为 Group,如下所示:

var settings = new MagickReadSettings { Density = new Density(200), Compression = CompressionMethod.Group4 };

我学到的是简单地命名输出文件 .tif 告诉 IM 输出一个 tif。这是一种方便的方法,但它看起来很草率。

4

0 回答 0