c#dll生成的pdf文件已损坏

时间:2017-04-07 18:21:40

标签: c# pdf dll itext class-library

我正在使用iTextSharp在c#中编写pdf文件。 我创建了一个ClassLibrary项目并在Windows应用程序中引用。 dll实际上在调用时创建了一个pdf文件,但是当我打开pdf文件来查看它时There was an error opening this document. The file is damaged and could not be repaired.

这是我创建pdf文件的dll代码

public class Class1
{
    public void CreatePDF()
    {
        // Orignal
        string filename = "Desktop\\TEST_" + DateTime.Now.ToString("yyyyMMddhhmm") + ".pdf";
        FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None);
        Document doc = new Document(PageSize.A4, 10, 10, 10, 10);
        doc.SetMargins(10, 10, 10, 10);
        PdfWriter writer = PdfWriter.GetInstance(doc, fs);
        doc.Open();
        doc.NewPage();

        BaseFont bfTimes = BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.CP1252, false);
        iTextSharp.text.Font times = new iTextSharp.text.Font(bfTimes, 9, iTextSharp.text.Font.ITALIC, iTextSharp.text.BaseColor.RED);

        iTextSharp.text.Font font = FontFactory.GetFont(FontFactory.HELVETICA, 9, BaseColor.BLACK);
        iTextSharp.text.Font fontSmall = FontFactory.GetFont(FontFactory.HELVETICA, 2, BaseColor.BLACK);
        iTextSharp.text.Font fontBold = FontFactory.GetFont(FontFactory.HELVETICA_BOLD, 9, BaseColor.BLACK);

        Paragraph ClientName = new Paragraph("Client Name :" + " " + "Client", font);
        Paragraph Date = new Paragraph("Date :" + " " + DateTime.Today.ToShortTimeString(), font);


        doc.Add(ClientName);
        doc.Add(Date);

        LineSeparator ls = new LineSeparator();
        ls.LineWidth = 7f;
        doc.Add(new Chunk(ls, font.IsBold()));

        Paragraph some= new Paragraph("Some Data", fontBold);

        doc.Add(some);

        doc.Add(new Chunk(ls, font.IsBold()));

        DmtxImageEncoder encoder = new DmtxImageEncoder();
        DmtxImageEncoderOptions options = new DmtxImageEncoderOptions();
        options.SizeIdx = DmtxSymbolSize.DmtxSymbol18x18;

        options.Scheme = DmtxScheme.DmtxSchemeC40;
        Bitmap qrbitmap = encoder.EncodeImage("123456789", options);

        iTextSharp.text.Image qrpic = iTextSharp.text.Image.GetInstance(qrbitmap, System.Drawing.Imaging.ImageFormat.Jpeg);

        qrpic.ScalePercent(15f);

        doc.Add(qrpic);

        doc.Close();


        //System.Diagnostics.Process.Start(filename);
    }
}

这就是我在Windows应用程序中调用它的方式

Testdll.Class1 m = new Testdll.Class1();
        m.CreatePDF();
        MessageBox.Show("Done");

它会创建pdf文件但已损坏。请让我知道我做错了什么以及如何修复我的代码。

2 个答案:

答案 0 :(得分:1)

除了您要删除当前用于创建QR码的逻辑外,所有的一切都没有 - iTextSharp支持几种不同类型的QR /条形码创建方法。

除了不使用 doc.Add(new Paragraph("Barcode PDF417")); BarcodePDF417 pdf417 = new BarcodePDF417(); String text = "Call me Ishmael. Some years ago--never mind how long " + "precisely --having little or no money in my purse, and nothing " + "particular to interest me on shore, I thought I would sail about " + "a little and see the watery part of the world."; pdf417.SetText(text); Image img = pdf417.GetImage(); img.ScalePercent(50, 50 * pdf417.YHeight); doc.Add(img); doc.Add(new Paragraph("Barcode Datamatrix")); BarcodeDatamatrix datamatrix = new BarcodeDatamatrix(); datamatrix.Generate(text); img = datamatrix.CreateImage(); doc.Add(img); doc.Add(new Paragraph("Barcode QRCode")); BarcodeQRCode qrcode = new BarcodeQRCode("Moby Dick by Herman Melville", 1, 1, null); img = qrcode.GetImage(); doc.Add(img); 语句之外,以下代码(以及您当前的代码)将帮助您开始生成QR /条形码。因为我不确定您想要填写QR /条形码,我无法为您创建精确的工作副本,但这应该让您立即开始!

如果有任何不清楚的地方,请告诉我,我可以编辑我的答案以提供更清晰的理解。

以下代码取自官方iText docs(最初使用的是Java),但为了您的目的,我稍作修改。

{{1}}

以下是输出示例:

enter image description here

答案 1 :(得分:-1)

我正在使用MemoryStream并遇到相同的问题。 我已经解决了,

document.Close()之后 memoryStream.Position = 0;把这个