我有一个问题,使用ITextSharp创建一些表和图像推送到MVC浏览器应用程序。我想我已经缩小到使用WriteRowsSelected添加表格了。获取“此页面存在错误,Acrobat可能无法正确显示页面。”使用ITextSharp WriteSelectedRows
这里是我的代码:
PDFEngine.cs
private byte[] BuildDocument(MemoryStream documentStream, IEnumerable<CustomPdfData> documents, bool addVoid, float defaultMagnification)
{
using (var stream = new MemoryStream())
{
var finishedDocument = new Document(new Rectangle(612f, 792f));
var writer = PdfWriter.GetInstance(finishedDocument, stream);
writer.ViewerPreferences = PdfWriter.HideWindowUI;
writer.ViewerPreferences = PdfWriter.HideMenubar;
// Open the Document for writing
finishedDocument.Open();
var zoomer = PdfAction.GotoLocalPage(1, new PdfDestination(PdfDestination.XYZ, -1, -1, defaultMagnification), writer);
writer.SetOpenAction(zoomer);
foreach (var document in documents)
{
if (document.IsNewPage)
{
finishedDocument.NewPage();
}
var results = TableEngine.BuildDocument(document);
// Build Canvas for Table
//PdfContentByte canvas = writer.DirectContent;
//canvas.SetTextMatrix(50, 50);
// Add each table to the canvas at specified coordinates
for (int tableCounter = 0; tableCounter < results.ITextTables.Count; tableCounter++)
{
PdfContentByte canvas = writer.DirectContent;
canvas.SetTextMatrix(50, 50);
var xAxis = results.PdfTables[tableCounter].XPosition;
var yAxis = results.PdfTables[tableCounter].YPosition;
results.ITextTables[tableCounter].WriteSelectedRows(0, results.PdfTables[tableCounter].ColumnSize, xAxis, yAxis, writer.DirectContent);
}
}
finishedDocument.Close();
documentStream.Close();
return stream.ToArray();
}
CheckBuilder.cs
/// <summary>
/// Used to create the fake checks needed for printing to a client
/// </summary>
/// <param name="checks">Checks to push to Builder</param>
/// <returns></returns>
public byte[] GetFakeChecks(List<HandsCheck> checks)
{
var doc = BuildCheck(checks, true, true);
return CreatePdf(doc, 0.5f, false);
}
DisplayChecks.cshtml
<object id="WebBrowser1" width="615" height="790" data= "@Url.Action("GetPdfData")" type="application/pdf" />
HomeController.cs
public FileContentResult GetPdfData()
{
int numberofChecks = int.Parse(Workspace.Get<string>("numberofChecks"));
var pdfCreator = new CheckBuilder();
var checks = GetAllChecks();
var newList = new List<Check>();
for (int counter = 0; counter < numberofChecks; counter++)
{
newList.Add(checks[counter]);
}
var rawData = pdfCreator.GetFakeChecks(newList);
return File(rawData, "application/pdf");
return null;
}
奇怪的是,它似乎当我添加超过表才会发生。有谁知道每个画布是否有限制?有谁知道有什么方法可以进一步调试可能导致此问题的原因?
除了传递'Stream'对象外,没有什么会跳出来。我从来没有找到一个很好的理由来做到这一点,但看到很多理由不去做。你可以尝试重构只使用内部的'MemoryStream',并使用'MS.ToArray()'返回一个原始字节数组。这也会给你带来好处,不必担心记住要关闭方法以外的流,还要调用错误的流方法,比如'GetBuffer'。 –
感谢@Chris的回复。我更新了上面的代码以包含推荐的重构。我想我做了你所要求的,但我仍然得到了错误。奇怪的是,PDF总是显示正确。我还包括HTML和控制器代码。此外,它似乎如果我甚至添加第二个表,它会引发相同的错误。是否可能需要为多个WriteSelectedRows执行操作? – gcoleman0828
此外,如果我在每个WriteRowsSelected上添加Newpage调用,它没有问题,显然这不是所需的效果,但我认为这可能有助于解决这个奇怪的问题 – gcoleman0828