8

iTextSharp を使用して、画像から pdf-a ドキュメントを生成しています。これまでのところ、私は成功していません。
編集:iTextSharpを使用してPDFを生成しています

私が試みているのは、いくつかの画像を使用してpdf-aドキュメント(1aまたは1b、何でもよい)を作成することだけです。これはこれまでに作成したコードですが、pdf-toolsまたはvalidatepdfaで検証しようとするとエラーが発生し続けます。

これは、pdf-tools (PDF/A-1b 検証を使用) から取得したエラーです: 編集: MarkInfo と色空間はまだ機能していません。残りは大丈夫です

Validating file "0.pdf" for conformance level pdfa-1a
The key MarkInfo is required but missing.
A device-specific color space (DeviceRGB) without an appropriate output intent is used.
The document does not conform to the requested standard.
The document contains device-specific color spaces.
The document doesn't provide appropriate logical structure information.
Done.

主な流れ

var output = new MemoryStream();
using (var iccProfileStream = new FileStream("ToPdfConverter/ColorProfiles/sRGB_v4_ICC_preference_displayclass.icc", FileMode.Open))
{
    var document = new Document(new Rectangle(PageSize.A4.Width, PageSize.A4.Height), 0f, 0f, 0f, 0f);
    var pdfWriter = PdfWriter.GetInstance(document, output);
    pdfWriter.PDFXConformance = PdfWriter.PDFA1A;
    document.Open();

    var pdfDictionary = new PdfDictionary(PdfName.OUTPUTINTENT);
    pdfDictionary.Put(PdfName.OUTPUTCONDITION, new PdfString("sRGB IEC61966-2.1"));
    pdfDictionary.Put(PdfName.INFO, new PdfString("sRGB IEC61966-2.1"));
    pdfDictionary.Put(PdfName.S, PdfName.GTS_PDFA1);

    var iccProfile = ICC_Profile.GetInstance(iccProfileStream);
    var pdfIccBased = new PdfICCBased(iccProfile);
    pdfIccBased.Remove(PdfName.ALTERNATE);
    pdfDictionary.Put(PdfName.DESTOUTPUTPROFILE, pdfWriter.AddToBody(pdfIccBased).IndirectReference);

    pdfWriter.ExtraCatalog.Put(PdfName.OUTPUTINTENT, new PdfArray(pdfDictionary));

    var image = PrepareImage(imageBytes);

    document.Open();
    document.Add(image);

    pdfWriter.CreateXmpMetadata();

    pdfWriter.CloseStream = false;
    document.Close();
}
return output.GetBuffer();

これは prepareImage()
です。イメージを bmp にフラット化するために使用されるため、アルファ チャネルについて気にする必要はありません。

private Image PrepareImage(Stream stream)
{
    Bitmap bmp = new Bitmap(System.Drawing.Image.FromStream(stream));
    var file = new MemoryStream();
    bmp.Save(file, ImageFormat.Bmp);
    var image = Image.GetInstance(file.GetBuffer());

    if (image.Height > PageSize.A4.Height || image.Width > PageSize.A4.Width)
    {
        image.ScaleToFit(PageSize.A4.Width, PageSize.A4.Height);
    }
    return image;
}

誰でもエラーを修正する方向に私を助けることができますか? 具体的にはdevice-specific color spaces

編集:詳細説明:私が達成しようとしているのは、スキャンした画像をPDF/Aに変換して長期データ保存することです

編集:
PDF と Pictures.rar (3.9 MB) でテストするために使用しているいくつかのファイルを追加しました
https://mega.co.nz/#!n8pClYgL!NJOJqSO3EuVrqLVyh3c43yW-u_U35NqeB0svc6giaSQ

4

2 に答える 2

1

OK、callas pdfToolbox でファイルの 1 つを確認したところ、「デバイスの色空間が使用されていますが、PDF/A 出力インテントはありません」と表示されています。これは、出力インテントをドキュメントに書き込んでいるときに何か間違ったことをしている兆候だと思いました。次に、同じツールを使用してそのドキュメントを PDF/A-1b に変換しましたが、違いは明らかです。

他にも修正が必要なエラーがあるかもしれませんが、ここでの最初のエラーは、"OutputIntent" という名前の PDF ファイルのカタログ dict にキーを入力したことです。それは間違っています。PDF 仕様の 75 ページには、キーの名前を「OutputIntents」にする必要があると記載されています。

私が言ったように、おそらくこれ以外にもファイルに問題があるかもしれませんが、キーの名前が間違っていると、PDF/A バリデーターは、ファイルに入れようとする出力インテントを見つけられません...

于 2013-04-09T18:40:32.077 に答える
0
  1. まず、pdfx は pdfa ではありません。

    1. 次に、間違った PdfWriter を使用しています。PdfAWriter である必要があります。

残念ながら、画像の問題の解決策はありませんが、1と2には解決策があります。

よろしく

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Text;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.text.html.simpleparser;
using iTextSharp.tool.xml;
using System.Drawing;
using System.Drawing.Imaging;

namespace Tests
{
    /*
     * References:  
     * UTF-8 encoding http://stackoverflow.com/questions/4902033/itextsharp-5-polish-character
     * PDFA http://www.codeproject.com/Questions/661704/Create-pdf-A-using-itextsharp
     * Images http://stackoverflow.com/questions/15896581/make-a-pdf-conforming-pdf-a-with-only-images-using-itextsharp
     */

    [TestClass]
    public class UnitTest1
    {
        /*
         * IMPORTANT: Restrictions with html usage of tags and attributes
         * 1. Dont use * <head> <title>Sklep</title> </head>, because title is rendered to the page
         */

        // Test cases
        static string contents = "<html><body style=\"font-family:arial unicode ms;font-size: 8px;\"><p style=\"text-align: center;\"> Davčna številka dolžnika: 74605968<br /> </p><table> <tr> <td><b>\u0160t. sklepa: 88711501</b></td> <td style=\"text-align: right;\">Davčna številka dolžnika: 74605968</td> </tr> </table> <br/><img src=\"http://img.rtvslo.si/_static/images/rtvslo_mmc_logo.png\" /></body></html>";
        //static string contents = "<html><body style=\"font-family:arial unicode ms;font-size: 8px;\"><p style=\"text-align: center;\"> Davčna številka dolžnika: 74605968<br /> </p><table> <tr> <td><b>\u0160t. sklepa: 88711501</b></td> <td style=\"text-align: right;\">Davčna številka dolžnika: 74605968</td> </tr> </table> <br/></body></html>";

        //[TestMethod]
        public void CreatePdfHtml()
        {
            createPDF(contents, true);        
        }

        private void createPDF(string html, bool isPdfa)
        {
            TextReader reader = new StringReader(html);
            Document document = new Document(PageSize.A4, 30, 30, 30, 30);
            HTMLWorker worker = new HTMLWorker(document);

            PdfWriter writer;
            if (isPdfa)
            {
                //set conformity level
                writer = PdfAWriter.GetInstance(document, new FileStream(@"c:\temp\testA.pdf", FileMode.Create), PdfAConformanceLevel.PDF_A_1B);

                //set pdf version
                writer.SetPdfVersion(PdfAWriter.PDF_VERSION_1_4);

                // Create XMP metadata. It's a PDF/A requirement.
                writer.CreateXmpMetadata();
            }
            else
            {
                writer = PdfWriter.GetInstance(document, new FileStream(@"c:\temp\test.pdf", FileMode.Create));
            }

            document.Open();

            if (isPdfa) // document should be opend, or it will fail
            {
                // Set output intent for uncalibrated color space. PDF/A requirement.
                ICC_Profile icc = ICC_Profile.GetInstance(Environment.GetEnvironmentVariable("SystemRoot") +  @"\System32\spool\drivers\color\sRGB Color Space Profile.icm");
                writer.SetOutputIntents("Custom", "", "http://www.color.org", "sRGB IEC61966-2.1", icc);
            }

            //register font used in html
            FontFactory.Register(Environment.GetEnvironmentVariable("SystemRoot") + "\\Fonts\\ARIALUNI.TTF", "arial unicode ms");

            //adding custom style attributes to html specific tasks. Can be used instead of css
            //this one is a must fopr display of utf8 language specific characters (čćžđpš)
            iTextSharp.text.html.simpleparser.StyleSheet ST = new iTextSharp.text.html.simpleparser.StyleSheet();
            ST.LoadTagStyle("body", "encoding", "Identity-H");
            worker.SetStyleSheet(ST);

            worker.StartDocument();
            worker.Parse(reader);
            worker.EndDocument();
            worker.Close();
            document.Close();
        }

    }


}
于 2014-12-12T13:56:12.437 に答える