下面的代码片段返回一个损坏的PDF文档,但是如果我返回mergedDocument,它总是返回一个有效的PDF.mergedDocument基于我使用Word创建的PDF文件,而完成的文档完全以编程方式生成.代码"有效",因为它不会抛出异常.为什么iTextSharp会创建一个损坏的PDF?
byte[] completedDocument = null;
using (MemoryStream streamCompleted = new MemoryStream())
{
using (Document document = new Document())
{
PdfCopy copy = new PdfCopy(document, streamCompleted);
document.Open();
copy.Open();
foreach (var item in eventItems)
{
byte[] mergedDocument = null;
PdfReader reader = new PdfReader(pdfTemplates[item.DataTokens[NotifyTokenType.OrganisationID]]);
using (MemoryStream streamTemplate = new MemoryStream())
{
using (PdfStamper stamper = new PdfStamper(reader, streamTemplate))
{
foreach (var token in item.DataTokens)
{
if (stamper.AcroFields.Fields.Any(fld => fld.Key == token.Key.ToString()))
{
stamper.AcroFields.SetField(token.Key.ToString(), token.Value);
}
}
stamper.FormFlattening = true;
stamper.Writer.CloseStream = false; …Run Code Online (Sandbox Code Playgroud) 有一段代码如下:
var workStream = new MemoryStream();
var doc = new Document(PageSize.LETTER, 10, 10, 42, 35);
PdfWriter.GetInstance(doc, workStream).CloseStream = false;
doc.Open();
var builder = new StringBuilder();
builder.Append("MY LONG HTML TEXT");
var parsedHtmlElements = HTMLWorker.ParseToList(new StringReader(builder.ToString()), null);
foreach (var htmlElement in parsedHtmlElements)
doc.Add(htmlElement);
doc.Close();
byte[] byteInfo = workStream.ToArray();
workStream.Write(byteInfo, 0, byteInfo.Length);
workStream.Position = 0;
return new FileStreamResult(workStream, "application/pdf")
Run Code Online (Sandbox Code Playgroud)
并且有一个问题 - 如何使pdf合理化?有什么方法可以快速做到吗?
使用iTextSharp将html转换为pdf
public static MemoryStream CreatePdfFromHtml(
string html, List<Attachment> attachments)
{
MemoryStream msOutput = new MemoryStream();
using (TextReader reader = new StringReader(html))
using (Document document = new Document())
{
PdfWriter writer = PdfWriter.GetInstance(document, msOutput);
document.Open();
foreach (var a in attachments)
{
var image = iTextSharp.text.Image.GetInstance(a.File);
document.Add(image);
}
XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, reader);
writer.CloseStream = false;
document.Close();
msOutput.Position = 0;
return msOutput;
}
}
Run Code Online (Sandbox Code Playgroud)
html以这种方式包含几个嵌入的图像.这种方法是首选,因为相同的HTML是通过电子邮件发送LinkedResources的AlternateView.
foreach (var a in attachments)
{
//not production code
html += string.Format("<img src=\"cid:{0}\"></img>", a.Id.ToString());
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试获取我的XFA表单中所有字段的简单列表.我正在使用此代码:
private void ListFieldNames()
{
string pdfTemplate = @"C:\Projects\iTextSharp\SReport.pdf";
MemoryStream m = new MemoryStream();
// title the form
this.Text += " - " + pdfTemplate;
// create a new PDF reader based on the PDF template document
PdfReader pdfReader = new PdfReader(pdfTemplate);
PdfStamper pdfStamper = new PdfStamper(pdfReader, m);
AcroFields formFields = pdfStamper.AcroFields;
AcroFields form = pdfReader.AcroFields;
XfaForm xfa = form.Xfa;
StringBuilder sb = new StringBuilder();
sb.Append(xfa.XfaPresent ? "XFA form" : "AcroForm");
sb.Append(Environment.NewLine);
foreach (string key in form.Fields.Keys)
{
sb.Append(key);
sb.Append(Environment.NewLine); …Run Code Online (Sandbox Code Playgroud) 我正在尝试将高质量的图像放入PDF(每页一个).但如果我将页面大小设置为a4,我必须调整我的图片大小,因为它们太大了.然后他们失去了质量.有没有办法将大图像放到A4页面而不会失去质量?
我正在使用iTextSharp库,首先我正在创建文档
document = new Document(PageSize.A4, 0, 0, 0, 0);
FileStream output = new FileStream(pdfPath + "document.pdf", FileMode.Create);
PdfWriter writer = PdfWriter.GetInstance(document, output);
document.Open();
Run Code Online (Sandbox Code Playgroud)
然后我要添加每张图片
document.Add(iTextSharp.text.Image.GetInstance(toSaveImage, System.Drawing.Imaging.ImageFormat.Tiff));
Run Code Online (Sandbox Code Playgroud)
并关闭文件
document.Close();
Run Code Online (Sandbox Code Playgroud) 当我使用单元格的对齐,所以它的工作原理:
PdfPCell cell1 = new PdfPCell(new Phrase("Text" , Font));
cell1.HorizontalAlignment = 2;
Run Code Online (Sandbox Code Playgroud)
但是一旦对齐不起作用:
PdfPCell cell1 = new PdfPCell();
cell1.AddElement(new Phrase("Text 1", Font));
cell1.AddElement(new Phrase("Text 2", Font));
cell1.HorizontalAlignment = 2;
Run Code Online (Sandbox Code Playgroud)
原因?
我想在一行上向左侧和右侧显示两段内容(可能是段落或文本).我的输出应该是这样的
Name:ABC date:2015-03-02
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
我可以在哪里下载使用itextsharp的C#示例?链接http://sourceforge.net/p/itextsharp/code/HEAD/tree/tutorial/signatures/已被破解(对我来说最有趣的是签名).
来自http://support.itextpdf.com/node/178的所有链接都不起作用.
当我尝试使用具有多个表的iTextSharp构建PDF文件时,我收到以下错误消息:
无法访问封闭的Stream.
这是我的代码:
//Create a byte array that will eventually hold our final PDF
Byte[] bytes;
List<TableObject> myTables = getTables();
TableObject currentTable = new TableObject();
//Boilerplate iTextSharp setup here
//Create a stream that we can write to, in this case a MemoryStream
using (MemoryStream ms = new MemoryStream())
{
//Create an iTextSharp Document which is an abstraction of a PDF but **NOT** a PDF
using (Document doc = new Document(PageSize.A4, 10f, 10f, 10f, 0f))
{
foreach (TableObject to in myTables) …Run Code Online (Sandbox Code Playgroud)