问题描述
我正在将ASP .Net 3.5 MVC1与DB2后端一起使用。我的公司正在尝试从Microsoft sql Server 2008 RSCLient打印GDI +对话框中打印条形码。我们无法将文件保存为PDF并在本地打印,因为这是为我们的库存盘点应用程序而来的,员工可能会用本地条形码做不好的事情(它们是很好的检查),因此我们被迫通过HTTP打印并控制其印刷。每个商店都在位置上有一个打印服务器,但是Web服务器位于公司的IT办公室中。我相信我必须使用.jpeg,因为.gif会使条形码中的线条模糊并且无法被扫描枪读取。
该应用程序可以与几百个标签一起正常工作(大约需要5页,大约需要5分钟才能完成打印后台处理程序),但是打印2000个标签需要花费2个小时(大约300页,大约+150 MB)。我在应用程序上运行Wireshark尝试捕获来回的数据包,并将信息传递给网络,这就是他们的响应。
没有。时间源目的地协议信息
36628 653.373235 HTTP [TCP窗口已满]连续或非HTTP流量
36630 654.245430 TCP [TCP ZeroWindowProbe] http> 35503 [ACK] Seq = 26291213 Ack = 3730 Win = 63137 Len = 1
我不讲背景故事。我的问题是我可以使用哪种类型的策略来帮助加快通过HTTP的打印假脱机。我是否应该在X页上“切碎”打印假脱机,然后重新将其余的假脱机?我应该更改打印算法吗?在不损失.jpeg质量的情况下缩小我的打印线轴尺寸的方法是什么?是否有RSClientPrint的开源或商业替代品,可以处理我需要的业务逻辑?
现在,请编码!如果您还有其他需要,请告诉我!
[AcceptVerbs(HttpVerbs.Post)]
[Authorization(Roles = Roles.NonInquiry)]
public ActionResult ReprintLabels(int eventId,int areaCode,int lowerLabelNumber,int upperLabelNumber)
{
if (!_eventAreaService.IsAreaEditable(eventId,areaCode))
return RedirectToAction(\"Index\",new { eventId = eventId });
var printContext = _eventAreaService.ReprintLabels(eventId,areaCode,lowerLabelNumber,upperLabelNumber);
ActionResult result = RedirectToAction(\"Index\",new { eventId = eventId });
if (printContext != null)
{
var redirectUrl = Url.RouteUrl(new { controller = \"EventArea\",action = \"Index\",eventId = eventId });
Session[PrintContextviewmodel.SessionKey] = new PrintContextviewmodel(printContext,redirectUrl);
result = RedirectToAction(\"PrintLabels\",\"LabelPrint\");
}
return result;
}
public InventoryAreaPrintContext ReprintLabels(int eventId,int lowerLabelBound,int upperLabelBound)
{
var user = _authentication.CurrentUser;
if (user.IsInRole(Roles.CorporateInquiry) || user.IsInRole(Roles.StoreInquiry))
throw new InvalidOperationException(\"User must be a non-inquiry role.\");
List<Fixture> fixturesToVoid = GetLabelsInRange(eventId,lowerLabelBound,upperLabelBound).Where(f => f.StatusCode == FixtureStatus.Ready).ToList();
if (fixturesToVoid.Count < 1) return null;
// Void all old labels and tally the labels that to be recreated
// for each area involved.
var voidFixturesByArea = new Dictionary<int,int>();
foreach (var f in fixturesToVoid)
{
if (!voidFixturesByArea.ContainsKey(f.AreaCode))
voidFixturesByArea[f.AreaCode] = 1;
else
voidFixturesByArea[f.AreaCode]++;
f.StatusCode = FixtureStatus.VoidReplace;
_fixtureRepo.Update(f);
}
var storeEvent = _storeEventRepository.FindEvent(user.DefaultStore,eventId);
var lastUsedLabel = storeEvent.LastUsedLabelNumber;
var affectedAreas = new List<InventoryArea>();
// Create new labels for the affected areas.
foreach (var pair in voidFixturesByArea)
{
var area = _areaRepo.FindByKey(user.DefaultStore.GroupCode,user.DefaultStore.ID,eventId,pair.Key);
var fixtures = _fixtureBuilder.AddFixtures(lastUsedLabel.Value,area,pair.Value);
fixtures.ForEach(f => _fixtureRepo.Insert(f));
area.Fixtures = fixtures;
affectedAreas.Add(area);
}
// Update the store event counts.
var numberOfLabels = fixturesToVoid.Count();
storeEvent.LastUsedLabelNumber += numberOfLabels;
_storeEventRepository.Update(storeEvent);
return new InventoryAreaPrintContext(_barcodeGenerator) { InventoryAreas = affectedAreas,StoreEvent = storeEvent,Store = user.DefaultStore };
}
public class BarcodeGenerator : IBarcodeGenerator
{
private readonly BarCodeImage.CodeSetEncoder _codeSetEncoder;
public BarcodeGenerator(BarCodeImage.CodeSetEncoder codeSetEncoder)
{
_codeSetEncoder = codeSetEncoder;
}
public byte[] CreateBarcode(string barcodeText)
{
byte[] data;
var generator = new BarCodeImage(barcodeText,_codeSetEncoder,true)
{
InsetText = false,Font = new Font(
FontFamily.GenericSansSerif,10,FontStyle.Regular,GraphicsUnit.Pixel)
};
/**
* Keep the image dimensions at the same ratio as they will be displayed in the report.
* Currently the report is set to a height to width ratio of 1/5 so we set the image
* height to width at 1/5 as well. Otherwise the barcode will not scan properly.
**/
using (var image = generator.Render(50,250))
using (var ms = new MemoryStream())
{
image.Save(ms,ImageFormat.Jpeg);
data = ms.GetBuffer();
}
return data;
}
}
解决方法
将图像包装器发送到后台打印程序时,有些东西可疑。我最后要做的是使用iTextSharp的条形码128类,基本上是用字体而不是图像来构建条形码,然后对于人类可读的文本,我只是传入了条形码对象的灯具标签字符串并将其设置为值转换为.RDLC报告中的值。如果有人需要任何代码,请随时与我联系。